messagebus-sdk 4.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rvmrc +1 -0
- data/Gemfile +15 -0
- data/README.md +183 -0
- data/Rakefile +8 -0
- data/lib/messagebus-sdk/actionmailer_client.rb +88 -0
- data/lib/messagebus-sdk/api_client.rb +69 -0
- data/lib/messagebus-sdk/feedback_client.rb +104 -0
- data/lib/messagebus-sdk/messagebus_base.rb +247 -0
- data/lib/messagebus-sdk/messagebus_errors.rb +40 -0
- data/lib/messagebus-sdk/messagebus_version.rb +27 -0
- data/lib/messagebus-sdk/stats_client.rb +50 -0
- data/lib/messagebus-sdk/template_client.rb +79 -0
- data/lib/messagebus-sdk.rb +23 -0
- data/spec/messagebus-sdk/actionmailer_client_spec.rb +71 -0
- data/spec/messagebus-sdk/api_client_spec.rb +75 -0
- data/spec/messagebus-sdk/base_spec.rb +151 -0
- data/spec/messagebus-sdk/cacert.pem +1 -0
- data/spec/messagebus-sdk/feedback_client_spec.rb +65 -0
- data/spec/messagebus-sdk/stats_client_spec.rb +56 -0
- data/spec/messagebus-sdk/template_client_spec.rb +129 -0
- data/spec/spec_core_extensions.rb +19 -0
- data/spec/spec_helper.rb +259 -0
- metadata +78 -0
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm use ruby-1.9.2-p290 --create
|
data/Gemfile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
source "http://rubygems.org"
|
2
|
+
|
3
|
+
gem 'activesupport'
|
4
|
+
|
5
|
+
gem 'multipart-post'
|
6
|
+
|
7
|
+
group :test, :development do
|
8
|
+
gem 'rspec', '2.5.0'
|
9
|
+
gem 'rr', '1.0.2'
|
10
|
+
gem 'fakeweb'
|
11
|
+
gem 'actionmailer'
|
12
|
+
end
|
13
|
+
|
14
|
+
# Specify your gem's dependencies in messagebus.gemspec
|
15
|
+
gemspec
|
data/README.md
ADDED
@@ -0,0 +1,183 @@
|
|
1
|
+
![MB icon](https://www.messagebus.com/wp-content/themes/msg/images/Message-Bus_LOGO.png)
|
2
|
+
|
3
|
+
###Message Bus Ruby SDK
|
4
|
+
|
5
|
+
Message Bus is a cloud-based platform for easily sending email at scale and with complete insight into your messaging traffic and how recipients are responding to it. All platform functions are available via [REST API](http://www.messagebus.com/documentation) as well as the language-specific documentation, sample code, libraries, and/or compiled binaries contained in this SDK.
|
6
|
+
|
7
|
+
Samples include how to:
|
8
|
+
|
9
|
+
* Create sessions
|
10
|
+
* Send messages
|
11
|
+
* Use templates
|
12
|
+
* Check email stats
|
13
|
+
|
14
|
+
If you have questions not answered by the samples or the online documentation, please contact [support](mailto:support@messagebus.com).
|
15
|
+
|
16
|
+
|
17
|
+
####Installing the module
|
18
|
+
|
19
|
+
gem install messagebus-sdk
|
20
|
+
|
21
|
+
If running the examples from the project without installing the gem, you will
|
22
|
+
need to set RUBYLIB path.
|
23
|
+
|
24
|
+
Example: export RUBYLIB=/Users/<user_name>/workspace/messagebus-ruby-sdk/lib/messagebus-sdk
|
25
|
+
|
26
|
+
####Sending emails
|
27
|
+
|
28
|
+
require 'messagebus-sdk/api_client'
|
29
|
+
|
30
|
+
api_key="12345678934628542E2599F7ED712345"
|
31
|
+
api_host="https://api-v4.messagebus.com"
|
32
|
+
|
33
|
+
client = MessagebusApiClient.new(api_key, api_host)
|
34
|
+
|
35
|
+
session_key = "DEFAULT"
|
36
|
+
|
37
|
+
messages = [
|
38
|
+
{:toEmail => 'bobby@example.com',
|
39
|
+
:toName => 'Bobby Flay',
|
40
|
+
:fromEmail => 'alice@example.com',
|
41
|
+
:fromName => 'Alice Waters',
|
42
|
+
:subject => 'Sample Message with HTML body.',
|
43
|
+
:customHeaders => {"x-messagebus-sdk"=>"ruby-sdk"},
|
44
|
+
:plaintextBody => 'This is the plain text body.',
|
45
|
+
:htmlBody => 'This is the <b>HTML</b>body.',
|
46
|
+
:sessionKey => session_key},
|
47
|
+
{:toEmail => 'jamie@example.com',
|
48
|
+
:toName => 'Jamie Lauren',
|
49
|
+
:fromEmail => 'alice@example.com',
|
50
|
+
:fromName => 'Alice Waters',
|
51
|
+
:subject => 'Simple Example with no HTML body.',
|
52
|
+
:customHeaders => {"x-messagebus-sdk"=>"ruby-sdk"},
|
53
|
+
:plaintextBody => 'This is the plaintext example.',
|
54
|
+
:sessionKey => session_key}
|
55
|
+
]
|
56
|
+
|
57
|
+
begin
|
58
|
+
response = client.send_messages(messages)
|
59
|
+
if response[:statusCode] == 202
|
60
|
+
puts "Email send results"
|
61
|
+
response[:results].each do |message|
|
62
|
+
puts "To: #{message[:toEmail]} Message Id: #{message[:messageId]} Message Status: #{message[:messageStatus]}"
|
63
|
+
end
|
64
|
+
else
|
65
|
+
puts "#{response[:statusMessage]}"
|
66
|
+
end
|
67
|
+
rescue Exception=>e
|
68
|
+
puts "Exception thrown. Error during send: #{e.message}"
|
69
|
+
end
|
70
|
+
|
71
|
+
####Sending emails with ActionMailer
|
72
|
+
|
73
|
+
require 'action_mailer'
|
74
|
+
require 'messagebus-sdk/actionmailer_client'
|
75
|
+
|
76
|
+
class MessagebusMailer < MessagebusActionMailerClient
|
77
|
+
def initialize(*args)
|
78
|
+
api_key = "12345678934628542E2599F7ED712345"
|
79
|
+
api_endpoint = "https://api-v4.messagebus.com"
|
80
|
+
super(api_key, api_endpoint)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
ActionMailer::Base.add_delivery_method :messagebus, MessagebusMailer
|
85
|
+
ActionMailer::Base.delivery_method = :messagebus
|
86
|
+
|
87
|
+
class MessageBusActionMailerTest < ActionMailer::Base
|
88
|
+
default :from => "no-reply@messagebus.com",
|
89
|
+
:body => "This is a test",
|
90
|
+
:subject => "Unit Test",
|
91
|
+
:return_path => "bounce@bounces.example.com"
|
92
|
+
|
93
|
+
def test_message(to_email, session_key)
|
94
|
+
headers[MessagebusSDK::MessagebusBase::HEADER_SESSION_KEY] = session_key
|
95
|
+
mail(:to => to_email)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
to_email = "hello@example.com"
|
100
|
+
session_key = "DEFAULT"
|
101
|
+
message = MessageBusActionMailerTest.test_message(to_email, session_key)
|
102
|
+
message.deliver
|
103
|
+
|
104
|
+
####Checking email statistics
|
105
|
+
|
106
|
+
require 'messagebus-sdk/stats_client'
|
107
|
+
|
108
|
+
api_key = "12345678934628542E2599F7ED712345"
|
109
|
+
api_host = "https://api-v4.messagebus.com"
|
110
|
+
|
111
|
+
client = MessagebusStatsClient.new(api_key, api_host)
|
112
|
+
|
113
|
+
begin
|
114
|
+
response = client.stats
|
115
|
+
if response[:statusCode] == 200
|
116
|
+
stats = response[:stats]
|
117
|
+
puts "Stats"
|
118
|
+
puts "\tMessages Attempted: #{stats[:msgsAttemptedCount]}"
|
119
|
+
puts "\tComplaint Count: #{stats[:complaintCount]}"
|
120
|
+
puts "\tUnsubscribe Count: #{stats[:unsubscribeCount]}"
|
121
|
+
puts "\tOpen Count: #{stats[:openCount]}"
|
122
|
+
puts "\tUnique Open Count: #{stats[:uniqueOpenCount]}"
|
123
|
+
puts "\tClick Count: #{stats[:clickCount]}"
|
124
|
+
|
125
|
+
smtp = response[:smtp]
|
126
|
+
puts "SMTP"
|
127
|
+
puts "\tAccept Count: #{smtp[:acceptCount]}"
|
128
|
+
puts "\tBounce Count: #{smtp[:bounceCount]}"
|
129
|
+
puts "\tReject Count: #{smtp[:rejectCount]}"
|
130
|
+
puts "\tError Count: #{smtp[:errorCount]}"
|
131
|
+
|
132
|
+
filter = response[:filter]
|
133
|
+
puts "Filter"
|
134
|
+
puts "\tBad Mailbox Count: #{filter[:rcptBadMailboxCount]}"
|
135
|
+
puts "\tChannel Block Count: #{filter[:rcptChannelBlockCount]}"
|
136
|
+
|
137
|
+
else
|
138
|
+
puts "#{response[:statusMessage]}"
|
139
|
+
end
|
140
|
+
rescue Exception=>e
|
141
|
+
puts "Exception thrown. Error during stats retrieval: #{e.message}"
|
142
|
+
end
|
143
|
+
|
144
|
+
#### Checking email feedback data
|
145
|
+
|
146
|
+
require 'messagebus-sdk/feedback_client'
|
147
|
+
|
148
|
+
api_key = "12345678934628542E2599F7ED712345"
|
149
|
+
api_host = "https://api-v4.messagebus.com"
|
150
|
+
|
151
|
+
client = MessagebusFeedbackClient.new(api_key, api_host)
|
152
|
+
|
153
|
+
begin
|
154
|
+
response = client.feedback
|
155
|
+
if response[:statusCode] == 200
|
156
|
+
puts "Bounces"
|
157
|
+
response[:bounces].each do |bounce|
|
158
|
+
puts "Email: #{bounce[:email]} Count: #{bounce[:count]} BounceCode: #{bounce[:bounceCode]} LastEventTime: #{bounce[:lastEventTime]}"
|
159
|
+
end
|
160
|
+
puts "Clicks"
|
161
|
+
response[:clicks].each do |click|
|
162
|
+
puts "Email: #{click[:email]} Count: #{click[:count]} LastEventTime: #{click[:lastEventTime]}"
|
163
|
+
end
|
164
|
+
else
|
165
|
+
puts "#{response[:statusMessage]}"
|
166
|
+
end
|
167
|
+
rescue Exception=>e
|
168
|
+
puts "Exception thrown. Error during feedback retrieval: #{e.message}"
|
169
|
+
end
|
170
|
+
|
171
|
+
#### License
|
172
|
+
|
173
|
+
|
174
|
+
Copyright (c) 2013 Mail Bypass, Inc.
|
175
|
+
|
176
|
+
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
|
177
|
+
with the License. You may obtain a copy of the License at
|
178
|
+
|
179
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
180
|
+
|
181
|
+
Unless required by applicable law or agreed to in writing, software distributed under the License is
|
182
|
+
distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
183
|
+
See the License for the specific language governing permissions and limitations under the License
|
data/Rakefile
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
# Copyright 2013 Message Bus, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
4
|
+
# not use this file except in compliance with the License. You may obtain
|
5
|
+
# a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
11
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
12
|
+
# License for the specific language governing permissions and limitations
|
13
|
+
# under the License.
|
14
|
+
|
15
|
+
require 'api_client'
|
16
|
+
|
17
|
+
class MessagebusActionMailerClient < MessagebusApiClient
|
18
|
+
|
19
|
+
#used by ActionMailer
|
20
|
+
def deliver(message)
|
21
|
+
deliver!(message)
|
22
|
+
end
|
23
|
+
|
24
|
+
def deliver!(message)
|
25
|
+
#minimum required headers
|
26
|
+
if message.to.first.nil? ||message.subject.nil? || message.from.first.nil? then
|
27
|
+
raise "Messagebus API error=Missing required header: :toEmail => #{message.to.first} :subject => #{message.subject} :fromEmail => #{message.from.first}"
|
28
|
+
end
|
29
|
+
|
30
|
+
message_from_email = from_email_with_name(message.header[:from].to_s)
|
31
|
+
|
32
|
+
from_name = ""
|
33
|
+
from_email = message.from.first
|
34
|
+
if !message_from_email.nil?
|
35
|
+
from_name = message_from_email[1]
|
36
|
+
end
|
37
|
+
|
38
|
+
if !well_formed_address?(from_email)
|
39
|
+
raise "Messagebus API error=From Address is invalid :toEmail => #{message.to.first} :subject => #{message.subject} :fromEmail => #{message.from.first}"
|
40
|
+
end
|
41
|
+
|
42
|
+
custom_headers = {}
|
43
|
+
|
44
|
+
custom_headers["envelope-sender"] = message.return_path if !message.return_path.nil?
|
45
|
+
custom_headers["bcc"] = message.bcc[0] if !message.bcc.nil?
|
46
|
+
|
47
|
+
session_key = DEFAULT
|
48
|
+
message.header.fields.each do |f|
|
49
|
+
if f.name == HEADER_SESSION_KEY
|
50
|
+
session_key = f.value
|
51
|
+
else
|
52
|
+
if f.name =~ /x-.*/i
|
53
|
+
custom_headers[f.name] = f.value
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
msg = {
|
59
|
+
:toEmail => message.to.first,
|
60
|
+
:toName => "",
|
61
|
+
:subject => message.subject,
|
62
|
+
:fromEmail => from_email,
|
63
|
+
:fromName => from_name,
|
64
|
+
:sessionKey => session_key,
|
65
|
+
:customHeaders => custom_headers
|
66
|
+
}
|
67
|
+
|
68
|
+
msg[:plaintextBody] = ( message.body ) ? "#{message.body}" : "No plaintext version was supplied."
|
69
|
+
|
70
|
+
if message.multipart?
|
71
|
+
msg[:plaintextBody] = (message.text_part) ? message.text_part.body.to_s : "No plaintext version was supplied."
|
72
|
+
msg[:htmlBody] = message.html_part.body.to_s if message.html_part
|
73
|
+
end
|
74
|
+
|
75
|
+
begin
|
76
|
+
send_messages([msg])
|
77
|
+
rescue => message_bus_api_error
|
78
|
+
raise "Messagebus API error=#{message_bus_api_error}, message=#{msg.inspect}"
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
def from_email_with_name(address)
|
85
|
+
address.match(/^(.*)\s<(.*?)>/)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# Copyright 2013 Message Bus, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
4
|
+
# not use this file except in compliance with the License. You may obtain
|
5
|
+
# a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
11
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
12
|
+
# License for the specific language governing permissions and limitations
|
13
|
+
# under the License.
|
14
|
+
|
15
|
+
require 'messagebus_base'
|
16
|
+
|
17
|
+
class MessagebusApiClient < MessagebusSDK::MessagebusBase
|
18
|
+
|
19
|
+
def initialize(api_key, api_endpoint = DEFAULT_API_ENDPOINT)
|
20
|
+
super(api_key, api_endpoint)
|
21
|
+
@rest_endpoints = define_rest_endpoints
|
22
|
+
end
|
23
|
+
|
24
|
+
def send_messages(params)
|
25
|
+
path = @rest_endpoints[:message_emails_send]
|
26
|
+
json = {:messages => params}.to_json
|
27
|
+
make_api_request(path, HTTP_POST, json)
|
28
|
+
end
|
29
|
+
|
30
|
+
def channels
|
31
|
+
path = "#{@rest_endpoints[:channels]}"
|
32
|
+
make_api_request(path, HTTP_GET)
|
33
|
+
end
|
34
|
+
|
35
|
+
def channel_config(channel_key)
|
36
|
+
path = replace_channel_key("#{@rest_endpoints[:channel_config]}", channel_key)
|
37
|
+
make_api_request(path, HTTP_GET)
|
38
|
+
end
|
39
|
+
|
40
|
+
def channel_sessions(channel_key)
|
41
|
+
path = replace_channel_key("#{@rest_endpoints[:channel_sessions]}", channel_key)
|
42
|
+
make_api_request(path, HTTP_GET)
|
43
|
+
end
|
44
|
+
|
45
|
+
def channel_create_session(channel_key, session_name)
|
46
|
+
path = replace_channel_key("#{@rest_endpoints[:channel_sessions]}", channel_key)
|
47
|
+
json = {:sessionName => session_name}.to_json
|
48
|
+
make_api_request(path, HTTP_POST, json)
|
49
|
+
end
|
50
|
+
|
51
|
+
def channel_rename_session(channel_key, session_key, session_name)
|
52
|
+
path = replace_channel_and_session_key("#{@rest_endpoints[:channel_session_rename]}", channel_key, session_key)
|
53
|
+
json = {:sessionName => session_name}.to_json
|
54
|
+
make_api_request(path, HTTP_PUT, json)
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def define_rest_endpoints
|
60
|
+
{
|
61
|
+
:message_emails_send => "/api/v4/message/email/send",
|
62
|
+
:channels => "/api/v4/channels",
|
63
|
+
:channel_config => "/api/v4/channel/%CHANNEL_KEY%/config",
|
64
|
+
:channel_sessions => "/api/v4/channel/%CHANNEL_KEY%/sessions",
|
65
|
+
:channel_session_rename => "/api/v4/channel/%CHANNEL_KEY%/session/%SESSION_KEY%/rename"
|
66
|
+
}
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
@@ -0,0 +1,104 @@
|
|
1
|
+
# Copyright 2013 Message Bus, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
4
|
+
# not use this file except in compliance with the License. You may obtain
|
5
|
+
# a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
11
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
12
|
+
# License for the specific language governing permissions and limitations
|
13
|
+
# under the License.
|
14
|
+
|
15
|
+
require 'messagebus_base'
|
16
|
+
|
17
|
+
class MessagebusFeedbackClient < MessagebusSDK::MessagebusBase
|
18
|
+
|
19
|
+
def initialize(api_key, api_endpoint = DEFAULT_API_ENDPOINT)
|
20
|
+
super(api_key, api_endpoint)
|
21
|
+
@rest_endpoints = define_rest_endpoints
|
22
|
+
end
|
23
|
+
|
24
|
+
def feedback(start_date = '', end_date = '', scope = SCOPE_ALL, use_send_time = TRUE_VALUE)
|
25
|
+
path = "#{@rest_endpoints[:feedback]}#{feedback_query_args(start_date, end_date, use_send_time, scope)}"
|
26
|
+
make_api_request(path)
|
27
|
+
end
|
28
|
+
|
29
|
+
def feedback_by_channel(channel_key, start_date = '', end_date = '', scope = SCOPE_ALL, use_send_time = TRUE_VALUE)
|
30
|
+
path = "#{replace_channel_key(@rest_endpoints[:feedback_channel], channel_key)}#{feedback_query_args(start_date, end_date, use_send_time, scope)}"
|
31
|
+
make_api_request(path)
|
32
|
+
end
|
33
|
+
|
34
|
+
def feedback_by_session(channel_key, session_key, start_date = '', end_date = '', scope = SCOPE_ALL, use_send_time = TRUE_VALUE)
|
35
|
+
path = "#{replace_channel_and_session_key(@rest_endpoints[:feedback_session], channel_key, session_key)}#{feedback_query_args(start_date, end_date, use_send_time, scope)}"
|
36
|
+
make_api_request(path)
|
37
|
+
end
|
38
|
+
|
39
|
+
def unsubs(start_date = '', end_date = '')
|
40
|
+
path = "#{@rest_endpoints[:unsubs]}?#{date_range(start_date, end_date)}"
|
41
|
+
make_api_request(path)
|
42
|
+
end
|
43
|
+
|
44
|
+
def unsubs_by_channel(channel_key, start_date = '', end_date = '')
|
45
|
+
path = "#{replace_channel_key(@rest_endpoints[:unsubs_channel], channel_key)}?#{date_range(start_date, end_date)}"
|
46
|
+
make_api_request(path)
|
47
|
+
end
|
48
|
+
|
49
|
+
def unsubs_by_session(channel_key, session_key, start_date = '', end_date = '')
|
50
|
+
path = "#{replace_channel_and_session_key(@rest_endpoints[:unsubs_session], channel_key, session_key)}?#{date_range(start_date, end_date)}"
|
51
|
+
make_api_request(path)
|
52
|
+
end
|
53
|
+
|
54
|
+
def complaints(start_date = '', end_date = '')
|
55
|
+
path = "#{@rest_endpoints[:complaints]}?#{date_range(start_date, end_date)}"
|
56
|
+
make_api_request(path)
|
57
|
+
end
|
58
|
+
|
59
|
+
def complaints_by_channel(channel_key, start_date = '', end_date = '')
|
60
|
+
path = "#{replace_channel_key(@rest_endpoints[:complaints_channel], channel_key)}?#{date_range(start_date, end_date)}"
|
61
|
+
make_api_request(path)
|
62
|
+
end
|
63
|
+
|
64
|
+
def complaints_by_session(channel_key, session_key, start_date = '', end_date = '')
|
65
|
+
path = "#{replace_channel_and_session_key(@rest_endpoints[:complaints_session], channel_key, session_key)}?#{date_range(start_date, end_date)}"
|
66
|
+
make_api_request(path)
|
67
|
+
end
|
68
|
+
|
69
|
+
def bounces(start_date = '', end_date = '')
|
70
|
+
path = "#{@rest_endpoints[:bounces]}?#{date_range(start_date, end_date)}"
|
71
|
+
make_api_request(path)
|
72
|
+
end
|
73
|
+
|
74
|
+
def bounces_by_channel(channel_key, start_date = '', end_date = '')
|
75
|
+
path = "#{replace_channel_key(@rest_endpoints[:bounces_channel], channel_key)}?#{date_range(start_date, end_date)}"
|
76
|
+
make_api_request(path)
|
77
|
+
end
|
78
|
+
|
79
|
+
def bounces_by_session(channel_key, session_key, start_date = '', end_date = '')
|
80
|
+
path = "#{replace_channel_and_session_key(@rest_endpoints[:bounces_session], channel_key, session_key)}?#{date_range(start_date, end_date)}"
|
81
|
+
make_api_request(path)
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
def define_rest_endpoints
|
87
|
+
{
|
88
|
+
:feedback => "/api/v4/feedback",
|
89
|
+
:feedback_channel => "/api/v4/feedback/channel/%CHANNEL_KEY%",
|
90
|
+
:feedback_session => "/api/v4/feedback/channel/%CHANNEL_KEY%/session/%SESSION_KEY%",
|
91
|
+
:unsubs => "/api/v4/unsubs",
|
92
|
+
:unsubs_channel => "/api/v4/unsubs/channel/%CHANNEL_KEY%",
|
93
|
+
:unsubs_session => "/api/v4/unsubs/channel/%CHANNEL_KEY%/session/%SESSION_KEY%",
|
94
|
+
:complaints => "/api/v4/complaints",
|
95
|
+
:complaints_channel => "/api/v4/complaints/channel/%CHANNEL_KEY%",
|
96
|
+
:complaints_session => "/api/v4/complaints/channel/%CHANNEL_KEY%/session/%SESSION_KEY%",
|
97
|
+
:bounces => "/api/v4/bounces",
|
98
|
+
:bounces_channel => "/api/v4/bounces/channel/%CHANNEL_KEY%",
|
99
|
+
:bounces_session => "/api/v4/bounces/channel/%CHANNEL_KEY%/session/%SESSION_KEY%"
|
100
|
+
}
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
|