mailgunner 2.5.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/README.md +27 -10
- data/lib/mailgunner.rb +12 -381
- data/lib/mailgunner/client.rb +102 -0
- data/lib/mailgunner/client/domains.rb +45 -0
- data/lib/mailgunner/client/email_validation.rb +13 -0
- data/lib/mailgunner/client/events.rb +9 -0
- data/lib/mailgunner/client/ips.rb +25 -0
- data/lib/mailgunner/client/mailing_lists.rb +45 -0
- data/lib/mailgunner/client/messages.rb +29 -0
- data/lib/mailgunner/client/routes.rb +25 -0
- data/lib/mailgunner/client/stats.rb +15 -0
- data/lib/mailgunner/client/suppressions.rb +57 -0
- data/lib/mailgunner/client/tags.rb +25 -0
- data/lib/mailgunner/client/webhooks.rb +25 -0
- data/lib/mailgunner/version.rb +1 -1
- data/mailgunner.gemspec +7 -1
- data/spec/mailgunner_spec.rb +36 -108
- metadata +21 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ffd33ded9bd33ca044bbe54fc8d89a876bb9949fb91c98ef0f677cc0ca82f4f5
|
4
|
+
data.tar.gz: 7d4ba505f5b1de914fc360b23f64d14497e40e6ca01ecb4e8421560c0404e36d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bfea517bd1e392add5a730c417a8aa479279503a574b9855e22a37a8bf1da56c8d972900173fbecb1cc39b73cf0c5eb6772a44b3681c3f2566c5ce9ff2aa4559
|
7
|
+
data.tar.gz: 739a82133f746ad9117dbd6655dec76324de3b1cf3394c2c35672a44306e9cab643e7b29174f7cd2823a477d82e174cbb68a40cf21c54f4dd007dc0c528c1ac0
|
data/README.md
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# mailgunner
|
2
2
|
|
3
|
-
[](https://badge.fury.io/rb/mailgunner) [](https://badge.fury.io/rb/mailgunner) [](https://travis-ci.org/readysteady/mailgunner)
|
4
4
|
|
5
5
|
|
6
|
-
Ruby client for the [Mailgun API](
|
6
|
+
Ruby client for the [Mailgun API](https://documentation.mailgun.com/en/latest/api_reference.html).
|
7
7
|
|
8
8
|
|
9
9
|
## Installation
|
@@ -21,16 +21,19 @@ mailgun = Mailgunner::Client.new({
|
|
21
21
|
api_key: 'key-3ax6xnjp29jd6fds4gc373sgvjxteol0'
|
22
22
|
})
|
23
23
|
|
24
|
-
response = mailgun.
|
24
|
+
response = mailgun.get_domains
|
25
|
+
|
26
|
+
response['items'].each do |item|
|
27
|
+
p item.values_at('id', 'name')
|
28
|
+
end
|
25
29
|
```
|
26
30
|
|
27
31
|
|
28
32
|
## Storing the API key
|
29
33
|
|
30
|
-
Best practice for
|
31
|
-
|
32
|
-
|
33
|
-
from the MAILGUN_API_KEY and MAILGUN_SMTP_LOGIN environment variables. These will
|
34
|
+
Best practice for credentials is to [store them in the environment](https://www.12factor.net/config#store_config_in_the_environment).
|
35
|
+
`Mailgunner::Client` defaults to extracting the domain and api_key values it needs
|
36
|
+
from the `MAILGUN_API_KEY` and `MAILGUN_SMTP_LOGIN` environment variables—these will
|
34
37
|
exist if you are using Mailgun on Heroku, or you can set them manually.
|
35
38
|
|
36
39
|
|
@@ -42,22 +45,36 @@ the following line to `config/environments/production.rb`:
|
|
42
45
|
|
43
46
|
```ruby
|
44
47
|
config.action_mailer.delivery_method = :mailgun
|
45
|
-
|
48
|
+
```
|
46
49
|
|
47
50
|
If for some reason you can't set the required ENV variables, you can configure Mailgunner
|
48
51
|
through ActionMailer settings:
|
49
52
|
|
50
53
|
```ruby
|
51
54
|
config.action_mailer.mailgun_settings = {
|
52
|
-
domain: 'test.com'
|
55
|
+
domain: 'test.com',
|
53
56
|
api_key: 'your-api-key'
|
54
57
|
}
|
55
|
-
|
56
58
|
```
|
57
59
|
|
58
60
|
Outside of Rails you can set `ActionMailer::Base.delivery_method` directly.
|
59
61
|
|
60
62
|
|
63
|
+
## Specifying the region
|
64
|
+
|
65
|
+
Mailgun offers both a US and EU region to send your e-mail from. Mailgunner uses
|
66
|
+
the US region by default. If you wish to use the EU region set the `api_host`
|
67
|
+
config option like so:
|
68
|
+
|
69
|
+
```ruby
|
70
|
+
mailgun = Mailgunner::Client.new({
|
71
|
+
domain: 'eu.samples.mailgun.org',
|
72
|
+
api_key: 'key-3ax6xnjp29jd6fds4gc373sgvjxteol0',
|
73
|
+
api_host: 'api.eu.mailgun.net'
|
74
|
+
})
|
75
|
+
```
|
76
|
+
|
77
|
+
|
61
78
|
## Email validation
|
62
79
|
|
63
80
|
If you only need to use Mailgun's [email address validation service](http://documentation.mailgun.com/api-email-validation.html),
|
data/lib/mailgunner.rb
CHANGED
@@ -1,385 +1,16 @@
|
|
1
|
-
require 'net/http'
|
2
|
-
require 'json'
|
3
|
-
require 'cgi'
|
4
1
|
require 'mailgunner/version'
|
5
2
|
require 'mailgunner/errors'
|
3
|
+
require 'mailgunner/client'
|
4
|
+
require 'mailgunner/client/domains'
|
5
|
+
require 'mailgunner/client/email_validation'
|
6
|
+
require 'mailgunner/client/events'
|
7
|
+
require 'mailgunner/client/ips'
|
8
|
+
require 'mailgunner/client/mailing_lists'
|
9
|
+
require 'mailgunner/client/messages'
|
10
|
+
require 'mailgunner/client/routes'
|
11
|
+
require 'mailgunner/client/stats'
|
12
|
+
require 'mailgunner/client/suppressions'
|
13
|
+
require 'mailgunner/client/tags'
|
14
|
+
require 'mailgunner/client/webhooks'
|
6
15
|
require 'mailgunner/delivery_method' if defined?(Mail)
|
7
16
|
require 'mailgunner/railtie' if defined?(Rails)
|
8
|
-
|
9
|
-
module Mailgunner
|
10
|
-
class Client
|
11
|
-
attr_accessor :domain, :api_key, :http
|
12
|
-
|
13
|
-
def initialize(options = {})
|
14
|
-
@domain = if options.key?(:domain)
|
15
|
-
options.fetch(:domain)
|
16
|
-
elsif ENV.key?('MAILGUN_SMTP_LOGIN')
|
17
|
-
ENV['MAILGUN_SMTP_LOGIN'].to_s.split('@').last
|
18
|
-
else
|
19
|
-
NoDomainProvided
|
20
|
-
end
|
21
|
-
|
22
|
-
@api_key = options.fetch(:api_key) { ENV.fetch('MAILGUN_API_KEY') }
|
23
|
-
|
24
|
-
@http = Net::HTTP.new('api.mailgun.net', Net::HTTP.https_default_port)
|
25
|
-
|
26
|
-
@http.use_ssl = true
|
27
|
-
end
|
28
|
-
|
29
|
-
def validate_address(value)
|
30
|
-
get('/v3/address/validate', address: value)
|
31
|
-
end
|
32
|
-
|
33
|
-
def parse_addresses(values)
|
34
|
-
get('/v3/address/parse', addresses: Array(values).join(','))
|
35
|
-
end
|
36
|
-
|
37
|
-
def get_message(key)
|
38
|
-
get("/v3/domains/#{escape @domain}/messages/#{escape key}")
|
39
|
-
end
|
40
|
-
|
41
|
-
def get_mime_message(key)
|
42
|
-
get("/v3/domains/#{escape @domain}/messages/#{escape key}", {}, {'Accept' => 'message/rfc2822'})
|
43
|
-
end
|
44
|
-
|
45
|
-
def send_message(attributes = {})
|
46
|
-
post("/v3/#{escape @domain}/messages", attributes)
|
47
|
-
end
|
48
|
-
|
49
|
-
def send_mime(mail)
|
50
|
-
to = ['to', Array(mail.destinations).join(',')]
|
51
|
-
|
52
|
-
message = ['message', mail.encoded, {filename: 'message.mime'}]
|
53
|
-
|
54
|
-
multipart_post("/v3/#{escape @domain}/messages.mime", [to, message])
|
55
|
-
end
|
56
|
-
|
57
|
-
def delete_message(key)
|
58
|
-
delete("/v3/domains/#{escape @domain}/messages/#{escape key}")
|
59
|
-
end
|
60
|
-
|
61
|
-
def get_domains(params = {})
|
62
|
-
get('/v3/domains', params)
|
63
|
-
end
|
64
|
-
|
65
|
-
def get_domain(name)
|
66
|
-
get("/v3/domains/#{escape name}")
|
67
|
-
end
|
68
|
-
|
69
|
-
def add_domain(attributes = {})
|
70
|
-
post('/v3/domains', attributes)
|
71
|
-
end
|
72
|
-
|
73
|
-
def delete_domain(name)
|
74
|
-
delete("/v3/domains/#{escape name}")
|
75
|
-
end
|
76
|
-
|
77
|
-
def get_credentials
|
78
|
-
get("/v3/domains/#{escape @domain}/credentials")
|
79
|
-
end
|
80
|
-
|
81
|
-
def add_credentials(attributes)
|
82
|
-
post("/v3/domains/#{escape @domain}/credentials", attributes)
|
83
|
-
end
|
84
|
-
|
85
|
-
def update_credentials(login, attributes)
|
86
|
-
put("/v3/domains/#{escape @domain}/credentials/#{escape login}", attributes)
|
87
|
-
end
|
88
|
-
|
89
|
-
def delete_credentials(login)
|
90
|
-
delete("/v3/domains/#{escape @domain}/credentials/#{escape login}")
|
91
|
-
end
|
92
|
-
|
93
|
-
def get_connection_settings
|
94
|
-
get("/v3/domains/#{escape @domain}/connection")
|
95
|
-
end
|
96
|
-
|
97
|
-
def update_connection_settings(attributes)
|
98
|
-
put("/v3/domains/#{escape @domain}/connection", attributes)
|
99
|
-
end
|
100
|
-
|
101
|
-
def get_unsubscribes(params = {})
|
102
|
-
get("/v3/#{escape @domain}/unsubscribes", params)
|
103
|
-
end
|
104
|
-
|
105
|
-
def get_unsubscribe(address)
|
106
|
-
get("/v3/#{escape @domain}/unsubscribes/#{escape address}")
|
107
|
-
end
|
108
|
-
|
109
|
-
def delete_unsubscribe(address_or_id)
|
110
|
-
delete("/v3/#{escape @domain}/unsubscribes/#{escape address_or_id}")
|
111
|
-
end
|
112
|
-
|
113
|
-
def add_unsubscribe(attributes = {})
|
114
|
-
post("/v3/#{escape @domain}/unsubscribes", attributes)
|
115
|
-
end
|
116
|
-
|
117
|
-
def get_complaints(params = {})
|
118
|
-
get("/v3/#{escape @domain}/complaints", params)
|
119
|
-
end
|
120
|
-
|
121
|
-
def get_complaint(address)
|
122
|
-
get("/v3/#{escape @domain}/complaints/#{escape address}")
|
123
|
-
end
|
124
|
-
|
125
|
-
def add_complaint(attributes = {})
|
126
|
-
post("/v3/#{escape @domain}/complaints", attributes)
|
127
|
-
end
|
128
|
-
|
129
|
-
def delete_complaint(address)
|
130
|
-
delete("/v3/#{escape @domain}/complaints/#{escape address}")
|
131
|
-
end
|
132
|
-
|
133
|
-
def get_bounces(params = {})
|
134
|
-
get("/v3/#{escape @domain}/bounces", params)
|
135
|
-
end
|
136
|
-
|
137
|
-
def get_bounce(address)
|
138
|
-
get("/v3/#{escape @domain}/bounces/#{escape address}")
|
139
|
-
end
|
140
|
-
|
141
|
-
def add_bounce(attributes = {})
|
142
|
-
post("/v3/#{escape @domain}/bounces", attributes)
|
143
|
-
end
|
144
|
-
|
145
|
-
def delete_bounce(address)
|
146
|
-
delete("/v3/#{escape @domain}/bounces/#{escape address}")
|
147
|
-
end
|
148
|
-
|
149
|
-
def delete_bounces
|
150
|
-
delete("/v3/#{escape @domain}/bounces")
|
151
|
-
end
|
152
|
-
|
153
|
-
def get_stats(params = {})
|
154
|
-
Kernel.warn 'Mailgunner::Client#get_stats is deprecated'
|
155
|
-
|
156
|
-
get("/v3/#{escape @domain}/stats", params)
|
157
|
-
end
|
158
|
-
|
159
|
-
def get_total_stats(params = {})
|
160
|
-
get("/v3/#{escape @domain}/stats/total", params)
|
161
|
-
end
|
162
|
-
|
163
|
-
def get_events(params = {})
|
164
|
-
get("/v3/#{escape @domain}/events", params)
|
165
|
-
end
|
166
|
-
|
167
|
-
def get_tags(params = {})
|
168
|
-
get("/v3/#{escape @domain}/tags", params)
|
169
|
-
end
|
170
|
-
|
171
|
-
def get_tag(id)
|
172
|
-
get("/v3/#{escape @domain}/tags/#{escape id}")
|
173
|
-
end
|
174
|
-
|
175
|
-
def update_tag(id, attributes)
|
176
|
-
put("/v3/#{escape @domain}/tags/#{escape id}", attributes)
|
177
|
-
end
|
178
|
-
|
179
|
-
def get_tag_stats(id, params)
|
180
|
-
get("/v3/#{escape @domain}/tags/#{escape id}/stats", params)
|
181
|
-
end
|
182
|
-
|
183
|
-
def delete_tag(id)
|
184
|
-
delete("/v3/#{escape @domain}/tags/#{escape id}")
|
185
|
-
end
|
186
|
-
|
187
|
-
def get_routes(params = {})
|
188
|
-
get('/v3/routes', params)
|
189
|
-
end
|
190
|
-
|
191
|
-
def get_route(id)
|
192
|
-
get("/v3/routes/#{escape id}")
|
193
|
-
end
|
194
|
-
|
195
|
-
def add_route(attributes = {})
|
196
|
-
post('/v3/routes', attributes)
|
197
|
-
end
|
198
|
-
|
199
|
-
def update_route(id, attributes = {})
|
200
|
-
put("/v3/routes/#{escape id}", attributes)
|
201
|
-
end
|
202
|
-
|
203
|
-
def delete_route(id)
|
204
|
-
delete("/v3/routes/#{escape id}")
|
205
|
-
end
|
206
|
-
|
207
|
-
def get_webhooks
|
208
|
-
get("/v3/domains/#{escape @domain}/webhooks")
|
209
|
-
end
|
210
|
-
|
211
|
-
def get_webhook(id)
|
212
|
-
get("/v3/domains/#{escape @domain}/webhooks/#{escape id}")
|
213
|
-
end
|
214
|
-
|
215
|
-
def add_webhook(attributes = {})
|
216
|
-
post("/v3/domains/#{escape @domain}/webhooks", attributes)
|
217
|
-
end
|
218
|
-
|
219
|
-
def update_webhook(id, attributes = {})
|
220
|
-
put("/v3/domains/#{escape @domain}/webhooks/#{escape id}", attributes)
|
221
|
-
end
|
222
|
-
|
223
|
-
def delete_webhook(id)
|
224
|
-
delete("/v3/domains/#{escape @domain}/webhooks/#{escape id}")
|
225
|
-
end
|
226
|
-
|
227
|
-
def get_campaigns(params = {})
|
228
|
-
get("/v3/#{escape @domain}/campaigns", params)
|
229
|
-
end
|
230
|
-
|
231
|
-
def get_campaign(id)
|
232
|
-
get("/v3/#{escape @domain}/campaigns/#{escape id}")
|
233
|
-
end
|
234
|
-
|
235
|
-
def add_campaign(attributes = {})
|
236
|
-
post("/v3/#{escape @domain}/campaigns", attributes)
|
237
|
-
end
|
238
|
-
|
239
|
-
def update_campaign(id, attributes = {})
|
240
|
-
put("/v3/#{escape @domain}/campaigns/#{escape id}", attributes)
|
241
|
-
end
|
242
|
-
|
243
|
-
def delete_campaign(id)
|
244
|
-
delete("/v3/#{escape @domain}/campaigns/#{escape id}")
|
245
|
-
end
|
246
|
-
|
247
|
-
def get_campaign_events(campaign_id, params = {})
|
248
|
-
get("/v3/#{escape @domain}/campaigns/#{escape campaign_id}/events", params)
|
249
|
-
end
|
250
|
-
|
251
|
-
def get_campaign_stats(campaign_id, params = {})
|
252
|
-
get("/v3/#{escape @domain}/campaigns/#{escape campaign_id}/stats", params)
|
253
|
-
end
|
254
|
-
|
255
|
-
def get_campaign_clicks(campaign_id, params = {})
|
256
|
-
get("/v3/#{escape @domain}/campaigns/#{escape campaign_id}/clicks", params)
|
257
|
-
end
|
258
|
-
|
259
|
-
def get_campaign_opens(campaign_id, params = {})
|
260
|
-
get("/v3/#{escape @domain}/campaigns/#{escape campaign_id}/opens", params)
|
261
|
-
end
|
262
|
-
|
263
|
-
def get_campaign_unsubscribes(campaign_id, params = {})
|
264
|
-
get("/v3/#{escape @domain}/campaigns/#{escape campaign_id}/unsubscribes", params)
|
265
|
-
end
|
266
|
-
|
267
|
-
def get_campaign_complaints(campaign_id, params = {})
|
268
|
-
get("/v3/#{escape @domain}/campaigns/#{escape campaign_id}/complaints", params)
|
269
|
-
end
|
270
|
-
|
271
|
-
def get_lists(params = {})
|
272
|
-
get('/v3/lists', params)
|
273
|
-
end
|
274
|
-
|
275
|
-
def get_list(address)
|
276
|
-
get("/v3/lists/#{escape address}")
|
277
|
-
end
|
278
|
-
|
279
|
-
def add_list(attributes = {})
|
280
|
-
post('/v3/lists', attributes)
|
281
|
-
end
|
282
|
-
|
283
|
-
def update_list(address, attributes = {})
|
284
|
-
put("/v3/lists/#{escape address}", attributes)
|
285
|
-
end
|
286
|
-
|
287
|
-
def delete_list(address)
|
288
|
-
delete("/v3/lists/#{escape address}")
|
289
|
-
end
|
290
|
-
|
291
|
-
def get_list_members(list_address, params = {})
|
292
|
-
get("/v3/lists/#{escape list_address}/members", params)
|
293
|
-
end
|
294
|
-
|
295
|
-
def get_list_member(list_address, member_address)
|
296
|
-
get("/v3/lists/#{escape list_address}/members/#{escape member_address}")
|
297
|
-
end
|
298
|
-
|
299
|
-
def add_list_member(list_address, member_attributes)
|
300
|
-
post("/v3/lists/#{escape list_address}/members", member_attributes)
|
301
|
-
end
|
302
|
-
|
303
|
-
def update_list_member(list_address, member_address, member_attributes)
|
304
|
-
put("/v3/lists/#{escape list_address}/members/#{escape member_address}", member_attributes)
|
305
|
-
end
|
306
|
-
|
307
|
-
def delete_list_member(list_address, member_address)
|
308
|
-
delete("/v3/lists/#{escape list_address}/members/#{escape member_address}")
|
309
|
-
end
|
310
|
-
|
311
|
-
private
|
312
|
-
|
313
|
-
def get(path, params = {}, headers = {})
|
314
|
-
request = Net::HTTP::Get.new(request_uri(path, params))
|
315
|
-
|
316
|
-
headers.each { |k, v| request[k] = v }
|
317
|
-
|
318
|
-
transmit(request)
|
319
|
-
end
|
320
|
-
|
321
|
-
def post(path, attributes = {})
|
322
|
-
transmit(Net::HTTP::Post.new(path)) { |message| message.set_form_data(attributes) }
|
323
|
-
end
|
324
|
-
|
325
|
-
def multipart_post(path, data)
|
326
|
-
transmit(Net::HTTP::Post.new(path)) { |message| message.set_form(data, 'multipart/form-data') }
|
327
|
-
end
|
328
|
-
|
329
|
-
def put(path, attributes = {})
|
330
|
-
transmit(Net::HTTP::Put.new(path)) { |message| message.set_form_data(attributes) }
|
331
|
-
end
|
332
|
-
|
333
|
-
def delete(path)
|
334
|
-
transmit(Net::HTTP::Delete.new(path))
|
335
|
-
end
|
336
|
-
|
337
|
-
USER_AGENT = "Ruby/#{RUBY_VERSION} Mailgunner/#{VERSION}"
|
338
|
-
|
339
|
-
def transmit(message)
|
340
|
-
message.basic_auth('api', @api_key)
|
341
|
-
message['User-Agent'] = USER_AGENT
|
342
|
-
|
343
|
-
yield message if block_given?
|
344
|
-
|
345
|
-
parse(@http.request(message))
|
346
|
-
end
|
347
|
-
|
348
|
-
def parse(response)
|
349
|
-
case response
|
350
|
-
when Net::HTTPSuccess
|
351
|
-
parse_success(response)
|
352
|
-
when Net::HTTPUnauthorized
|
353
|
-
raise AuthenticationError, "HTTP #{response.code}"
|
354
|
-
when Net::HTTPClientError
|
355
|
-
raise ClientError, "HTTP #{response.code}"
|
356
|
-
when Net::HTTPServerError
|
357
|
-
raise ServerError, "HTTP #{response.code}"
|
358
|
-
else
|
359
|
-
raise Error, "HTTP #{response.code}"
|
360
|
-
end
|
361
|
-
end
|
362
|
-
|
363
|
-
def parse_success(response)
|
364
|
-
return JSON.parse(response.body) if json?(response)
|
365
|
-
|
366
|
-
response.body
|
367
|
-
end
|
368
|
-
|
369
|
-
def json?(response)
|
370
|
-
content_type = response['Content-Type']
|
371
|
-
|
372
|
-
content_type && content_type.split(';').first == 'application/json'
|
373
|
-
end
|
374
|
-
|
375
|
-
def request_uri(path, params)
|
376
|
-
return path if params.empty?
|
377
|
-
|
378
|
-
path + '?' + params.flat_map { |k, vs| Array(vs).map { |v| "#{escape(k)}=#{escape(v)}" } }.join('&')
|
379
|
-
end
|
380
|
-
|
381
|
-
def escape(component)
|
382
|
-
CGI.escape(component.to_s)
|
383
|
-
end
|
384
|
-
end
|
385
|
-
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'net/http'
|
3
|
+
require 'json'
|
4
|
+
require 'cgi'
|
5
|
+
|
6
|
+
module Mailgunner
|
7
|
+
class Client
|
8
|
+
attr_accessor :domain, :api_key, :http
|
9
|
+
|
10
|
+
def initialize(options = {})
|
11
|
+
@domain = options.fetch(:domain) { default_domain }
|
12
|
+
|
13
|
+
@api_key = options.fetch(:api_key) { ENV.fetch('MAILGUN_API_KEY') }
|
14
|
+
|
15
|
+
@api_host = options.fetch(:api_host) { 'api.mailgun.net' }
|
16
|
+
|
17
|
+
@http = Net::HTTP.new(@api_host, Net::HTTP.https_default_port)
|
18
|
+
|
19
|
+
@http.use_ssl = true
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def default_domain
|
25
|
+
return NoDomainProvided unless ENV.key?('MAILGUN_SMTP_LOGIN')
|
26
|
+
|
27
|
+
ENV['MAILGUN_SMTP_LOGIN'].to_s.split('@').last
|
28
|
+
end
|
29
|
+
|
30
|
+
def get(path, params = {}, headers = {})
|
31
|
+
request = Net::HTTP::Get.new(request_uri(path, params))
|
32
|
+
|
33
|
+
headers.each { |k, v| request[k] = v }
|
34
|
+
|
35
|
+
transmit(request)
|
36
|
+
end
|
37
|
+
|
38
|
+
def post(path, attributes = {})
|
39
|
+
transmit(Net::HTTP::Post.new(path)) { |message| message.set_form_data(attributes) }
|
40
|
+
end
|
41
|
+
|
42
|
+
def multipart_post(path, data)
|
43
|
+
transmit(Net::HTTP::Post.new(path)) { |message| message.set_form(data, 'multipart/form-data') }
|
44
|
+
end
|
45
|
+
|
46
|
+
def put(path, attributes = {})
|
47
|
+
transmit(Net::HTTP::Put.new(path)) { |message| message.set_form_data(attributes) }
|
48
|
+
end
|
49
|
+
|
50
|
+
def delete(path)
|
51
|
+
transmit(Net::HTTP::Delete.new(path))
|
52
|
+
end
|
53
|
+
|
54
|
+
USER_AGENT = "Ruby/#{RUBY_VERSION} Mailgunner/#{VERSION}"
|
55
|
+
|
56
|
+
def transmit(message)
|
57
|
+
message.basic_auth('api', @api_key)
|
58
|
+
message['User-Agent'] = USER_AGENT
|
59
|
+
|
60
|
+
yield message if block_given?
|
61
|
+
|
62
|
+
parse(@http.request(message))
|
63
|
+
end
|
64
|
+
|
65
|
+
def parse(response)
|
66
|
+
case response
|
67
|
+
when Net::HTTPSuccess
|
68
|
+
parse_success(response)
|
69
|
+
when Net::HTTPUnauthorized
|
70
|
+
raise AuthenticationError, "HTTP #{response.code}"
|
71
|
+
when Net::HTTPClientError
|
72
|
+
raise ClientError, "HTTP #{response.code}"
|
73
|
+
when Net::HTTPServerError
|
74
|
+
raise ServerError, "HTTP #{response.code}"
|
75
|
+
else
|
76
|
+
raise Error, "HTTP #{response.code}"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def parse_success(response)
|
81
|
+
return JSON.parse(response.body) if json?(response)
|
82
|
+
|
83
|
+
response.body
|
84
|
+
end
|
85
|
+
|
86
|
+
def json?(response)
|
87
|
+
content_type = response['Content-Type']
|
88
|
+
|
89
|
+
content_type && content_type.split(';').first == 'application/json'
|
90
|
+
end
|
91
|
+
|
92
|
+
def request_uri(path, params)
|
93
|
+
return path if params.empty?
|
94
|
+
|
95
|
+
path + '?' + params.flat_map { |k, vs| Array(vs).map { |v| "#{escape(k)}=#{escape(v)}" } }.join('&')
|
96
|
+
end
|
97
|
+
|
98
|
+
def escape(component)
|
99
|
+
CGI.escape(component.to_s)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mailgunner
|
4
|
+
class Client
|
5
|
+
def get_domains(params = {})
|
6
|
+
get('/v3/domains', params)
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_domain(name)
|
10
|
+
get("/v3/domains/#{escape name}")
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_domain(attributes = {})
|
14
|
+
post('/v3/domains', attributes)
|
15
|
+
end
|
16
|
+
|
17
|
+
def delete_domain(name)
|
18
|
+
delete("/v3/domains/#{escape name}")
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_credentials
|
22
|
+
get("/v3/domains/#{escape @domain}/credentials")
|
23
|
+
end
|
24
|
+
|
25
|
+
def add_credentials(attributes)
|
26
|
+
post("/v3/domains/#{escape @domain}/credentials", attributes)
|
27
|
+
end
|
28
|
+
|
29
|
+
def update_credentials(login, attributes)
|
30
|
+
put("/v3/domains/#{escape @domain}/credentials/#{escape login}", attributes)
|
31
|
+
end
|
32
|
+
|
33
|
+
def delete_credentials(login)
|
34
|
+
delete("/v3/domains/#{escape @domain}/credentials/#{escape login}")
|
35
|
+
end
|
36
|
+
|
37
|
+
def get_connection_settings
|
38
|
+
get("/v3/domains/#{escape @domain}/connection")
|
39
|
+
end
|
40
|
+
|
41
|
+
def update_connection_settings(attributes)
|
42
|
+
put("/v3/domains/#{escape @domain}/connection", attributes)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mailgunner
|
4
|
+
class Client
|
5
|
+
def validate_address(value)
|
6
|
+
get('/v3/address/validate', address: value)
|
7
|
+
end
|
8
|
+
|
9
|
+
def parse_addresses(values)
|
10
|
+
get('/v3/address/parse', addresses: Array(values).join(','))
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mailgunner
|
4
|
+
class Client
|
5
|
+
def get_all_ips(params = {})
|
6
|
+
get('/v3/ips', params)
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_ip(address)
|
10
|
+
get("/v3/ips/#{escape address}")
|
11
|
+
end
|
12
|
+
|
13
|
+
def get_ips
|
14
|
+
get("/v3/domains/#{escape @domain}/ips")
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_ip(address)
|
18
|
+
post("/v3/domains/#{escape @domain}/ips", ip: address)
|
19
|
+
end
|
20
|
+
|
21
|
+
def delete_ip(address)
|
22
|
+
delete("/v3/domains/#{escape @domain}/ips/#{escape address}")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mailgunner
|
4
|
+
class Client
|
5
|
+
def get_lists(params = {})
|
6
|
+
get('/v3/lists', params)
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_list(address)
|
10
|
+
get("/v3/lists/#{escape address}")
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_list(attributes = {})
|
14
|
+
post('/v3/lists', attributes)
|
15
|
+
end
|
16
|
+
|
17
|
+
def update_list(address, attributes = {})
|
18
|
+
put("/v3/lists/#{escape address}", attributes)
|
19
|
+
end
|
20
|
+
|
21
|
+
def delete_list(address)
|
22
|
+
delete("/v3/lists/#{escape address}")
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_list_members(list_address, params = {})
|
26
|
+
get("/v3/lists/#{escape list_address}/members", params)
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_list_member(list_address, member_address)
|
30
|
+
get("/v3/lists/#{escape list_address}/members/#{escape member_address}")
|
31
|
+
end
|
32
|
+
|
33
|
+
def add_list_member(list_address, member_attributes)
|
34
|
+
post("/v3/lists/#{escape list_address}/members", member_attributes)
|
35
|
+
end
|
36
|
+
|
37
|
+
def update_list_member(list_address, member_address, member_attributes)
|
38
|
+
put("/v3/lists/#{escape list_address}/members/#{escape member_address}", member_attributes)
|
39
|
+
end
|
40
|
+
|
41
|
+
def delete_list_member(list_address, member_address)
|
42
|
+
delete("/v3/lists/#{escape list_address}/members/#{escape member_address}")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mailgunner
|
4
|
+
class Client
|
5
|
+
def get_message(key)
|
6
|
+
get("/v3/domains/#{escape @domain}/messages/#{escape key}")
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_mime_message(key)
|
10
|
+
get("/v3/domains/#{escape @domain}/messages/#{escape key}", {}, {'Accept' => 'message/rfc2822'})
|
11
|
+
end
|
12
|
+
|
13
|
+
def send_message(attributes = {})
|
14
|
+
post("/v3/#{escape @domain}/messages", attributes)
|
15
|
+
end
|
16
|
+
|
17
|
+
def send_mime(mail)
|
18
|
+
to = ['to', Array(mail.destinations).join(',')]
|
19
|
+
|
20
|
+
message = ['message', mail.encoded, {filename: 'message.mime'}]
|
21
|
+
|
22
|
+
multipart_post("/v3/#{escape @domain}/messages.mime", [to, message])
|
23
|
+
end
|
24
|
+
|
25
|
+
def delete_message(key)
|
26
|
+
delete("/v3/domains/#{escape @domain}/messages/#{escape key}")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mailgunner
|
4
|
+
class Client
|
5
|
+
def get_routes(params = {})
|
6
|
+
get('/v3/routes', params)
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_route(id)
|
10
|
+
get("/v3/routes/#{escape id}")
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_route(attributes = {})
|
14
|
+
post('/v3/routes', attributes)
|
15
|
+
end
|
16
|
+
|
17
|
+
def update_route(id, attributes = {})
|
18
|
+
put("/v3/routes/#{escape id}", attributes)
|
19
|
+
end
|
20
|
+
|
21
|
+
def delete_route(id)
|
22
|
+
delete("/v3/routes/#{escape id}")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mailgunner
|
4
|
+
class Client
|
5
|
+
def get_stats(params = {})
|
6
|
+
Kernel.warn 'Mailgunner::Client#get_stats is deprecated'
|
7
|
+
|
8
|
+
get("/v3/#{escape @domain}/stats", params)
|
9
|
+
end
|
10
|
+
|
11
|
+
def get_total_stats(params = {})
|
12
|
+
get("/v3/#{escape @domain}/stats/total", params)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mailgunner
|
4
|
+
class Client
|
5
|
+
def get_bounces(params = {})
|
6
|
+
get("/v3/#{escape @domain}/bounces", params)
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_bounce(address)
|
10
|
+
get("/v3/#{escape @domain}/bounces/#{escape address}")
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_bounce(attributes = {})
|
14
|
+
post("/v3/#{escape @domain}/bounces", attributes)
|
15
|
+
end
|
16
|
+
|
17
|
+
def delete_bounce(address)
|
18
|
+
delete("/v3/#{escape @domain}/bounces/#{escape address}")
|
19
|
+
end
|
20
|
+
|
21
|
+
def delete_bounces
|
22
|
+
delete("/v3/#{escape @domain}/bounces")
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_unsubscribes(params = {})
|
26
|
+
get("/v3/#{escape @domain}/unsubscribes", params)
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_unsubscribe(address)
|
30
|
+
get("/v3/#{escape @domain}/unsubscribes/#{escape address}")
|
31
|
+
end
|
32
|
+
|
33
|
+
def delete_unsubscribe(address_or_id)
|
34
|
+
delete("/v3/#{escape @domain}/unsubscribes/#{escape address_or_id}")
|
35
|
+
end
|
36
|
+
|
37
|
+
def add_unsubscribe(attributes = {})
|
38
|
+
post("/v3/#{escape @domain}/unsubscribes", attributes)
|
39
|
+
end
|
40
|
+
|
41
|
+
def get_complaints(params = {})
|
42
|
+
get("/v3/#{escape @domain}/complaints", params)
|
43
|
+
end
|
44
|
+
|
45
|
+
def get_complaint(address)
|
46
|
+
get("/v3/#{escape @domain}/complaints/#{escape address}")
|
47
|
+
end
|
48
|
+
|
49
|
+
def add_complaint(attributes = {})
|
50
|
+
post("/v3/#{escape @domain}/complaints", attributes)
|
51
|
+
end
|
52
|
+
|
53
|
+
def delete_complaint(address)
|
54
|
+
delete("/v3/#{escape @domain}/complaints/#{escape address}")
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mailgunner
|
4
|
+
class Client
|
5
|
+
def get_tags(params = {})
|
6
|
+
get("/v3/#{escape @domain}/tags", params)
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_tag(id)
|
10
|
+
get("/v3/#{escape @domain}/tags/#{escape id}")
|
11
|
+
end
|
12
|
+
|
13
|
+
def update_tag(id, attributes)
|
14
|
+
put("/v3/#{escape @domain}/tags/#{escape id}", attributes)
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_tag_stats(id, params)
|
18
|
+
get("/v3/#{escape @domain}/tags/#{escape id}/stats", params)
|
19
|
+
end
|
20
|
+
|
21
|
+
def delete_tag(id)
|
22
|
+
delete("/v3/#{escape @domain}/tags/#{escape id}")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mailgunner
|
4
|
+
class Client
|
5
|
+
def get_webhooks
|
6
|
+
get("/v3/domains/#{escape @domain}/webhooks")
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_webhook(id)
|
10
|
+
get("/v3/domains/#{escape @domain}/webhooks/#{escape id}")
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_webhook(attributes = {})
|
14
|
+
post("/v3/domains/#{escape @domain}/webhooks", attributes)
|
15
|
+
end
|
16
|
+
|
17
|
+
def update_webhook(id, attributes = {})
|
18
|
+
put("/v3/domains/#{escape @domain}/webhooks/#{escape id}", attributes)
|
19
|
+
end
|
20
|
+
|
21
|
+
def delete_webhook(id)
|
22
|
+
delete("/v3/domains/#{escape @domain}/webhooks/#{escape id}")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/mailgunner/version.rb
CHANGED
data/mailgunner.gemspec
CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |s|
|
|
7
7
|
s.platform = Gem::Platform::RUBY
|
8
8
|
s.authors = ['Tim Craft']
|
9
9
|
s.email = ['mail@timcraft.com']
|
10
|
-
s.homepage = 'http://github.com/
|
10
|
+
s.homepage = 'http://github.com/readysteady/mailgunner'
|
11
11
|
s.description = 'Ruby client for the Mailgun API'
|
12
12
|
s.summary = 'Ruby client for the Mailgun API'
|
13
13
|
s.files = Dir.glob('{lib,spec}/**/*') + %w(LICENSE.txt README.md mailgunner.gemspec)
|
@@ -18,4 +18,10 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.add_development_dependency('actionmailer', '~> 5')
|
19
19
|
s.add_development_dependency('mocha', '~> 1')
|
20
20
|
s.require_path = 'lib'
|
21
|
+
s.metadata = {
|
22
|
+
'homepage' => 'https://github.com/readysteady/mailgunner',
|
23
|
+
'source_code_uri' => 'https://github.com/readysteady/mailgunner',
|
24
|
+
'bug_tracker_uri' => 'https://github.com/readysteady/mailgunner/issues',
|
25
|
+
'changelog_uri' => 'https://github.com/readysteady/mailgunner/blob/master/CHANGES.md'
|
26
|
+
}
|
21
27
|
end
|
data/spec/mailgunner_spec.rb
CHANGED
@@ -41,11 +41,23 @@ describe 'Mailgunner::Client' do
|
|
41
41
|
end
|
42
42
|
|
43
43
|
describe 'http method' do
|
44
|
-
it 'returns a net http object
|
44
|
+
it 'returns a net http object' do
|
45
45
|
@client.http.must_be_instance_of(Net::HTTP)
|
46
|
+
end
|
47
|
+
end
|
46
48
|
|
49
|
+
describe 'http object' do
|
50
|
+
it 'uses ssl' do
|
47
51
|
@client.http.use_ssl?.must_equal(true)
|
48
52
|
end
|
53
|
+
|
54
|
+
it 'uses the address from the api_host option' do
|
55
|
+
api_host = 'api.eu.mailgun.net'
|
56
|
+
|
57
|
+
@client = Mailgunner::Client.new(api_key: @api_key, api_host: api_host)
|
58
|
+
|
59
|
+
@client.http.address.must_equal(api_host)
|
60
|
+
end
|
49
61
|
end
|
50
62
|
|
51
63
|
describe 'domain method' do
|
@@ -577,133 +589,49 @@ describe 'Mailgunner::Client' do
|
|
577
589
|
end
|
578
590
|
end
|
579
591
|
|
580
|
-
describe '
|
581
|
-
it 'fetches the
|
582
|
-
stub(:get, "#@base_url
|
592
|
+
describe 'get_all_ips method' do
|
593
|
+
it 'fetches the ips resource and returns the response object' do
|
594
|
+
stub(:get, "#@base_url/ips")
|
583
595
|
|
584
|
-
@client.
|
585
|
-
end
|
586
|
-
|
587
|
-
it 'encodes skip and limit parameters' do
|
588
|
-
stub(:get, "#@base_url/#@domain/campaigns?skip=1&limit=2")
|
589
|
-
|
590
|
-
@client.get_campaigns(skip: 1, limit: 2)
|
596
|
+
@client.get_all_ips.must_equal(@json_response_object)
|
591
597
|
end
|
592
598
|
end
|
593
599
|
|
594
|
-
describe '
|
595
|
-
it 'fetches the
|
596
|
-
|
597
|
-
|
598
|
-
@client.get_campaign(@id).must_equal(@json_response_object)
|
599
|
-
end
|
600
|
-
end
|
600
|
+
describe 'get_ip method' do
|
601
|
+
it 'fetches the ip resource with the given address and returns the response object' do
|
602
|
+
address = '127.0.0.1'
|
601
603
|
|
602
|
-
|
603
|
-
it 'posts to the domain campaigns resource and returns the response object' do
|
604
|
-
stub(:post, "#@base_url/#@domain/campaigns", body: "id=#@id")
|
604
|
+
stub(:get, "#@base_url/ips/#{address}")
|
605
605
|
|
606
|
-
@client.
|
606
|
+
@client.get_ip(address).must_equal(@json_response_object)
|
607
607
|
end
|
608
608
|
end
|
609
609
|
|
610
|
-
describe '
|
611
|
-
it '
|
612
|
-
stub(:
|
610
|
+
describe 'get_ips method' do
|
611
|
+
it 'fetches the domain ips resource and returns the response object' do
|
612
|
+
stub(:get, "#@base_url/domains/#@domain/ips")
|
613
613
|
|
614
|
-
@client.
|
614
|
+
@client.get_ips.must_equal(@json_response_object)
|
615
615
|
end
|
616
616
|
end
|
617
617
|
|
618
|
-
describe '
|
619
|
-
it '
|
620
|
-
|
618
|
+
describe 'add_ip method' do
|
619
|
+
it 'posts to the domain ips resource and returns the response object' do
|
620
|
+
address = '127.0.0.1'
|
621
621
|
|
622
|
-
|
623
|
-
end
|
624
|
-
end
|
625
|
-
|
626
|
-
describe 'get_campaign_events method' do
|
627
|
-
it 'fetches the domain campaign events resource and returns the response object' do
|
628
|
-
stub(:get, "#@base_url/#@domain/campaigns/#@id/events")
|
629
|
-
|
630
|
-
@client.get_campaign_events(@id).must_equal(@json_response_object)
|
631
|
-
end
|
632
|
-
|
633
|
-
it 'encodes the optional parameters' do
|
634
|
-
stub(:get, "#@base_url/#@domain/campaigns/#@id/events?country=US&limit=100")
|
622
|
+
stub(:post, "#@base_url/domains/#@domain/ips", body: {ip: address})
|
635
623
|
|
636
|
-
@client.
|
624
|
+
@client.add_ip(address).must_equal(@json_response_object)
|
637
625
|
end
|
638
626
|
end
|
639
627
|
|
640
|
-
describe '
|
641
|
-
it '
|
642
|
-
|
643
|
-
|
644
|
-
@client.get_campaign_stats(@id).must_equal(@json_response_object)
|
645
|
-
end
|
646
|
-
|
647
|
-
it 'encodes the optional parameters' do
|
648
|
-
stub(:get, "#@base_url/#@domain/campaigns/#@id/stats?groupby=dailyhour")
|
649
|
-
|
650
|
-
@client.get_campaign_stats(@id, groupby: 'dailyhour')
|
651
|
-
end
|
652
|
-
end
|
653
|
-
|
654
|
-
describe 'get_campaign_clicks method' do
|
655
|
-
it 'fetches the domain campaign clicks resource and returns the response object' do
|
656
|
-
stub(:get, "#@base_url/#@domain/campaigns/#@id/clicks")
|
657
|
-
|
658
|
-
@client.get_campaign_clicks(@id).must_equal(@json_response_object)
|
659
|
-
end
|
660
|
-
|
661
|
-
it 'encodes the optional parameters' do
|
662
|
-
stub(:get, "#@base_url/#@domain/campaigns/#@id/clicks?groupby=month&limit=100")
|
663
|
-
|
664
|
-
@client.get_campaign_clicks(@id, groupby: 'month', limit: 100)
|
665
|
-
end
|
666
|
-
end
|
667
|
-
|
668
|
-
describe 'get_campaign_opens method' do
|
669
|
-
it 'fetches the domain campaign opens resource and returns the response object' do
|
670
|
-
stub(:get, "#@base_url/#@domain/campaigns/#@id/opens")
|
671
|
-
|
672
|
-
@client.get_campaign_opens(@id).must_equal(@json_response_object)
|
673
|
-
end
|
674
|
-
|
675
|
-
it 'encodes the optional parameters' do
|
676
|
-
stub(:get, "#@base_url/#@domain/campaigns/#@id/opens?groupby=month&limit=100")
|
677
|
-
|
678
|
-
@client.get_campaign_opens(@id, groupby: 'month', limit: 100)
|
679
|
-
end
|
680
|
-
end
|
681
|
-
|
682
|
-
describe 'get_campaign_unsubscribes method' do
|
683
|
-
it 'fetches the domain campaign unsubscribes resource and returns the response object' do
|
684
|
-
stub(:get, "#@base_url/#@domain/campaigns/#@id/unsubscribes")
|
685
|
-
|
686
|
-
@client.get_campaign_unsubscribes(@id).must_equal(@json_response_object)
|
687
|
-
end
|
688
|
-
|
689
|
-
it 'encodes the optional parameters' do
|
690
|
-
stub(:get, "#@base_url/#@domain/campaigns/#@id/unsubscribes?groupby=month&limit=100")
|
691
|
-
|
692
|
-
@client.get_campaign_unsubscribes(@id, groupby: 'month', limit: 100)
|
693
|
-
end
|
694
|
-
end
|
695
|
-
|
696
|
-
describe 'get_campaign_complaints method' do
|
697
|
-
it 'fetches the domain campaign complaints resource and returns the response object' do
|
698
|
-
stub(:get, "#@base_url/#@domain/campaigns/#@id/complaints")
|
699
|
-
|
700
|
-
@client.get_campaign_complaints(@id).must_equal(@json_response_object)
|
701
|
-
end
|
628
|
+
describe 'delete_ip method' do
|
629
|
+
it 'deletes the domain ip resource with the given address and returns the response object' do
|
630
|
+
address = '127.0.0.1'
|
702
631
|
|
703
|
-
|
704
|
-
stub(:get, "#@base_url/#@domain/campaigns/#@id/complaints?groupby=month&limit=100")
|
632
|
+
stub(:delete, "#@base_url/domains/#@domain/ips/#{address}")
|
705
633
|
|
706
|
-
@client.
|
634
|
+
@client.delete_ip(address).must_equal(@json_response_object)
|
707
635
|
end
|
708
636
|
end
|
709
637
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mailgunner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Craft
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-10-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -90,6 +90,18 @@ files:
|
|
90
90
|
- LICENSE.txt
|
91
91
|
- README.md
|
92
92
|
- lib/mailgunner.rb
|
93
|
+
- lib/mailgunner/client.rb
|
94
|
+
- lib/mailgunner/client/domains.rb
|
95
|
+
- lib/mailgunner/client/email_validation.rb
|
96
|
+
- lib/mailgunner/client/events.rb
|
97
|
+
- lib/mailgunner/client/ips.rb
|
98
|
+
- lib/mailgunner/client/mailing_lists.rb
|
99
|
+
- lib/mailgunner/client/messages.rb
|
100
|
+
- lib/mailgunner/client/routes.rb
|
101
|
+
- lib/mailgunner/client/stats.rb
|
102
|
+
- lib/mailgunner/client/suppressions.rb
|
103
|
+
- lib/mailgunner/client/tags.rb
|
104
|
+
- lib/mailgunner/client/webhooks.rb
|
93
105
|
- lib/mailgunner/delivery_method.rb
|
94
106
|
- lib/mailgunner/errors.rb
|
95
107
|
- lib/mailgunner/railtie.rb
|
@@ -97,10 +109,14 @@ files:
|
|
97
109
|
- mailgunner.gemspec
|
98
110
|
- spec/mailgunner_delivery_method_spec.rb
|
99
111
|
- spec/mailgunner_spec.rb
|
100
|
-
homepage: http://github.com/
|
112
|
+
homepage: http://github.com/readysteady/mailgunner
|
101
113
|
licenses:
|
102
114
|
- LGPL-3.0
|
103
|
-
metadata:
|
115
|
+
metadata:
|
116
|
+
homepage: https://github.com/readysteady/mailgunner
|
117
|
+
source_code_uri: https://github.com/readysteady/mailgunner
|
118
|
+
bug_tracker_uri: https://github.com/readysteady/mailgunner/issues
|
119
|
+
changelog_uri: https://github.com/readysteady/mailgunner/blob/master/CHANGES.md
|
104
120
|
post_install_message:
|
105
121
|
rdoc_options: []
|
106
122
|
require_paths:
|
@@ -117,7 +133,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
117
133
|
version: '0'
|
118
134
|
requirements: []
|
119
135
|
rubyforge_project:
|
120
|
-
rubygems_version: 2.6
|
136
|
+
rubygems_version: 2.7.6
|
121
137
|
signing_key:
|
122
138
|
specification_version: 4
|
123
139
|
summary: Ruby client for the Mailgun API
|