mailgun-ruby 1.2.7 → 1.2.9
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 +4 -4
- data/README.md +1 -1
- data/docs/Domains.md +3 -0
- data/docs/Snippets.md +54 -61
- data/lib/mailgun/address.rb +3 -28
- data/lib/mailgun/client.rb +10 -1
- data/lib/mailgun/domains/domains.rb +19 -1
- data/lib/mailgun/exceptions/exceptions.rb +20 -1
- data/lib/mailgun/messages/message_builder.rb +2 -2
- data/lib/mailgun/version.rb +1 -1
- data/lib/mailgun.rb +3 -1
- data/lib/railgun/mailer.rb +1 -1
- data/spec/integration/domains_spec.rb +8 -0
- data/spec/integration/email_validation_spec.rb +1 -8
- data/spec/integration/mailgun_spec.rb +72 -0
- data/vcr_cassettes/domains.yml +51 -1
- data/vcr_cassettes/exceptions-invalid-api-key.yml +52 -0
- data/vcr_cassettes/exceptions-invalid-data.yml +52 -0
- data/vcr_cassettes/exceptions-not-allowed.yml +54 -0
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f43539594603950ec212832426bd7755d2b61a466aa9a028eb54f1246687fa3d
|
4
|
+
data.tar.gz: 7c02110bf7e1aae3d6f18ad228e50954a058a36fc2e87b97bfc542ef71bb1a28
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 96a39b566bd9b58ad0d799e22742f30b35d6e5d20af43f867fb4412c11408aece5eada65e6bd4153d11028553a2275b0317243eab52c1159b572e508a5192918
|
7
|
+
data.tar.gz: d1ab619f72f158253a353e53416d03730c0d37f957757a8294580ddaa98cdf912aa0d384a69e55702658450d12922b43c0ef780be6a044edf73248246a253bb5
|
data/README.md
CHANGED
data/docs/Domains.md
CHANGED
data/docs/Snippets.md
CHANGED
@@ -110,7 +110,7 @@ bm_obj.set_text_body "This is the text body."
|
|
110
110
|
bm_obj.add_recipient :to, "a_user@example.com"
|
111
111
|
|
112
112
|
# All message IDs returned in finalize method return
|
113
|
-
message_ids =
|
113
|
+
message_ids = bm_obj.finalize
|
114
114
|
```
|
115
115
|
|
116
116
|
### Domains:
|
@@ -118,57 +118,57 @@ ____________________________________________________
|
|
118
118
|
**Get a list of all domains:**
|
119
119
|
|
120
120
|
```ruby
|
121
|
-
result =
|
121
|
+
result = mg_client.get "domains", {:limit => 5, :skip => 0}
|
122
122
|
```
|
123
123
|
|
124
124
|
**Get a single domain:**
|
125
125
|
|
126
126
|
```ruby
|
127
|
-
result =
|
127
|
+
result = mg_client.get "domains/#{domain}"
|
128
128
|
```
|
129
129
|
|
130
130
|
**Add a domain:**
|
131
131
|
|
132
132
|
```ruby
|
133
|
-
result =
|
133
|
+
result = mg_client.post "domains", {:name => 'anothersample.mailgun.org',
|
134
134
|
:smtp_password => 'super_secret',
|
135
135
|
:spam_action => 'tag'}
|
136
136
|
```
|
137
137
|
**Delete a Domain: **
|
138
138
|
|
139
139
|
```ruby
|
140
|
-
result =
|
140
|
+
result = mg_client.delete "domains/#{domain}"
|
141
141
|
```
|
142
142
|
### Unsubscribes:
|
143
143
|
____________________________________________________
|
144
144
|
**Get List of Unsubscribes: **
|
145
145
|
|
146
146
|
```ruby
|
147
|
-
result =
|
147
|
+
result = mg_client.get "#{domain}/unsubscribes", {:limit => 50, :skip => 10}
|
148
148
|
```
|
149
149
|
|
150
150
|
**Get Single Unsubscribe: **
|
151
151
|
|
152
152
|
```ruby
|
153
|
-
result =
|
153
|
+
result = mg_client.get "#{domain}/unsubscribes/#{email_address}"
|
154
154
|
```
|
155
155
|
|
156
156
|
**Unsubscribe a Recipient: **
|
157
157
|
|
158
158
|
```ruby
|
159
|
-
result =
|
159
|
+
result = mg_client.post "#{domain}/unsubscribes", {:address => 'bob@example.com', :tag => 'mypromotion'}
|
160
160
|
```
|
161
161
|
|
162
162
|
**Unsubscribe from all messages for a domain: **
|
163
163
|
|
164
164
|
```ruby
|
165
|
-
result =
|
165
|
+
result = mg_client.post "#{domain}/unsubscribes", {:address => 'bob@example.com', :tag => '*'}
|
166
166
|
```
|
167
167
|
|
168
168
|
**Remove an unsubscribe: **
|
169
169
|
|
170
170
|
```ruby
|
171
|
-
result =
|
171
|
+
result = mg_client.delete "#{domain}/unsubscribes/#{email_address}"
|
172
172
|
```
|
173
173
|
|
174
174
|
### Complaints:
|
@@ -176,24 +176,24 @@ ____________________________________________________
|
|
176
176
|
**Get List of Complaints: **
|
177
177
|
|
178
178
|
```ruby
|
179
|
-
result =
|
179
|
+
result = mg_client.get "#{domain}/complaints", {:limit => 50, :skip => 10}
|
180
180
|
```
|
181
181
|
|
182
182
|
**Get a Single Complaint: **
|
183
183
|
|
184
184
|
```ruby
|
185
|
-
result =
|
185
|
+
result = mg_client.get "#{domain}/complaints/#{email_address}"
|
186
186
|
```
|
187
187
|
**Create a complaint: **
|
188
188
|
|
189
189
|
```ruby
|
190
|
-
result =
|
190
|
+
result = mg_client.post "#{domain}/complaint", {:address => 'bob@example.com'}
|
191
191
|
```
|
192
192
|
|
193
193
|
**Remove a complaint: **
|
194
194
|
|
195
195
|
```ruby
|
196
|
-
result =
|
196
|
+
result = mg_client.delete "#{domain}/complaint/#{email_address}"
|
197
197
|
```
|
198
198
|
|
199
199
|
### Bounces:
|
@@ -201,19 +201,19 @@ ____________________________________________________
|
|
201
201
|
**Get List of Bounces: **
|
202
202
|
|
203
203
|
```ruby
|
204
|
-
result =
|
204
|
+
result = mg_client.get "#{domain}/bounces", {:limit => 50, :skip => 10}
|
205
205
|
```
|
206
206
|
|
207
207
|
**Get a Single Bounce Event: **
|
208
208
|
|
209
209
|
```ruby
|
210
|
-
result =
|
210
|
+
result = mg_client.get "#{domain}/bounces/#{email_address}"
|
211
211
|
```
|
212
212
|
|
213
213
|
**Create a Bounce: **
|
214
214
|
|
215
215
|
```ruby
|
216
|
-
result =
|
216
|
+
result = mg_client.post "#{domain}/bounces", {:address => 'bob@example.com',
|
217
217
|
:code => 550,
|
218
218
|
:error => 'Mailbox does not exist.'}
|
219
219
|
```
|
@@ -221,7 +221,7 @@ result = @mg_client.post "#{domain}/bounces", {:address => 'bob@example.com',
|
|
221
221
|
**Remove a Bounced Address: **
|
222
222
|
|
223
223
|
```ruby
|
224
|
-
result =
|
224
|
+
result = mg_client.delete "#{domain}/bounces/#{email_address}"
|
225
225
|
```
|
226
226
|
|
227
227
|
### Statistics:
|
@@ -229,7 +229,7 @@ ____________________________________________________
|
|
229
229
|
**Get Statistics: **
|
230
230
|
|
231
231
|
```ruby
|
232
|
-
result =
|
232
|
+
result = mg_client.get "#{domain}/stats", {:limit => 50,
|
233
233
|
:skip => 10,
|
234
234
|
:event => 'sent',
|
235
235
|
"start-date" => 'Mon, 13 Feb 2015 00:00:00 GMT'}
|
@@ -238,14 +238,14 @@ result = @mg_client.get "#{domain}/stats", {:limit => 50,
|
|
238
238
|
**Remove a Tag: **
|
239
239
|
|
240
240
|
```ruby
|
241
|
-
result =
|
241
|
+
result = mg_client.delete "#{domain}/tags/#{tag}"
|
242
242
|
```
|
243
243
|
### Events:
|
244
244
|
____________________________________________________
|
245
245
|
**Get Event: **
|
246
246
|
|
247
247
|
```ruby
|
248
|
-
result =
|
248
|
+
result = mg_client.get "#{domain}/events", {:event => 'rejected'}
|
249
249
|
```
|
250
250
|
|
251
251
|
### Routes:
|
@@ -253,18 +253,18 @@ ____________________________________________________
|
|
253
253
|
**Get List of Routes: **
|
254
254
|
|
255
255
|
```ruby
|
256
|
-
result =
|
256
|
+
result = mg_client.get "routes", {:limit => 50, :skip => 10}
|
257
257
|
```
|
258
258
|
|
259
259
|
**Get a Single Route by ID: **
|
260
260
|
|
261
261
|
```ruby
|
262
|
-
result =
|
262
|
+
result = mg_client.get "routes/#{route_id}"
|
263
263
|
```
|
264
264
|
**Create a Route: **
|
265
265
|
|
266
266
|
```ruby
|
267
|
-
result =
|
267
|
+
result = mg_client.post "routes", {:priority => 10,
|
268
268
|
:description => 'This is a test route',
|
269
269
|
:expression => 'match_recipient(".*@gmail.com")',
|
270
270
|
:action => 'forward("alice@example.com")'}
|
@@ -272,7 +272,7 @@ result = @mg_client.post "routes", {:priority => 10,
|
|
272
272
|
**Update a Route: **
|
273
273
|
|
274
274
|
```ruby
|
275
|
-
result =
|
275
|
+
result = mg_client.put "routes/#{route_id}", {:priority => 10,
|
276
276
|
:description => 'This is a test route',
|
277
277
|
:expression => 'match_recipient(".*@gmail.com")',
|
278
278
|
:action => 'forward("alice@example.com")'}
|
@@ -280,46 +280,46 @@ result = @mg_client.put "routes/#{route_id}", {:priority => 10,
|
|
280
280
|
**Remove a Route: **
|
281
281
|
|
282
282
|
```ruby
|
283
|
-
result =
|
283
|
+
result = mg_client.delete "routes/#{route_id}"
|
284
284
|
```
|
285
285
|
### Campaigns:
|
286
286
|
____________________________________________________
|
287
287
|
**Get List of Campaigns: **
|
288
288
|
|
289
289
|
```ruby
|
290
|
-
result =
|
290
|
+
result = mg_client.get "#{domain}/campaigns", {:limit => 50, :skip => 10}
|
291
291
|
```
|
292
292
|
|
293
293
|
**Get a Single Campaign: **
|
294
294
|
|
295
295
|
```ruby
|
296
|
-
result =
|
296
|
+
result = mg_client.get "#{domain}/campaigns/#{campaign_id}"
|
297
297
|
```
|
298
298
|
|
299
299
|
**Create a Campaign: **
|
300
300
|
|
301
301
|
```ruby
|
302
|
-
result =
|
302
|
+
result = mg_client.post "#{domain}/campaigns", {:name => 'My Campaign',
|
303
303
|
:id => 'campaign_123_2014'}
|
304
304
|
```
|
305
305
|
|
306
306
|
**Update a Campaign: **
|
307
307
|
|
308
308
|
```ruby
|
309
|
-
result =
|
309
|
+
result = mg_client.put "#{domain}/campaigns/#{campaign_id}", {:name => 'My Campaign',
|
310
310
|
:id => 'campaign_123_2014'}
|
311
311
|
```
|
312
312
|
|
313
313
|
**Remove a Campaign: **
|
314
314
|
|
315
315
|
```ruby
|
316
|
-
result =
|
316
|
+
result = mg_client.delete "#{domain}/campaigns/#{campaign_id}"
|
317
317
|
```
|
318
318
|
|
319
319
|
**Get Campaign Events: **
|
320
320
|
|
321
321
|
```ruby
|
322
|
-
result =
|
322
|
+
result = mg_client.get "#{domain}/campaigns/#{campaign_id}/events", {:event => 'clicked',
|
323
323
|
:recipient => 'test@example.com',
|
324
324
|
:country => 'US',
|
325
325
|
:region => 'TX',
|
@@ -331,13 +331,13 @@ result = @mg_client.get "#{domain}/campaigns/#{campaign_id}/events", {:event =>
|
|
331
331
|
**Get a Single Campaign's Stats: **
|
332
332
|
|
333
333
|
```ruby
|
334
|
-
result =
|
334
|
+
result = mg_client.get "#{domain}/campaigns/#{campaign_id}/stats", {:groupby => 'domain'}
|
335
335
|
```
|
336
336
|
|
337
337
|
**Get a Single Campaign's Click Stats: **
|
338
338
|
|
339
339
|
```ruby
|
340
|
-
result =
|
340
|
+
result = mg_client.get "#{domain}/campaigns/#{campaign_id}/clicks", {:groupby => 'hour',
|
341
341
|
:country => 'US',
|
342
342
|
:region => 'TX',
|
343
343
|
:city => 'Austin',
|
@@ -349,7 +349,7 @@ result = @mg_client.get "#{domain}/campaigns/#{campaign_id}/clicks", {:groupby =
|
|
349
349
|
**Get a Single Campaign's Click Opens: **
|
350
350
|
|
351
351
|
```ruby
|
352
|
-
result =
|
352
|
+
result = mg_client.get "#{domain}/campaigns/#{campaign_id}/opens", {:groupby => 'hour',
|
353
353
|
:country => 'US',
|
354
354
|
:region => 'TX',
|
355
355
|
:city => 'Austin',
|
@@ -361,7 +361,7 @@ result = @mg_client.get "#{domain}/campaigns/#{campaign_id}/opens", {:groupby =>
|
|
361
361
|
**Get a Single Campaign's Click Unsubscribes: **
|
362
362
|
|
363
363
|
```ruby
|
364
|
-
result =
|
364
|
+
result = mg_client.get "#{domain}/campaigns/#{campaign_id}/unsubscribes", {:groupby => 'hour',
|
365
365
|
:country => 'US',
|
366
366
|
:region => 'TX',
|
367
367
|
:city => 'Austin',
|
@@ -373,7 +373,7 @@ result = @mg_client.get "#{domain}/campaigns/#{campaign_id}/unsubscribes", {:gro
|
|
373
373
|
**Get a Single Campaign's Click Complaints: **
|
374
374
|
|
375
375
|
```ruby
|
376
|
-
result =
|
376
|
+
result = mg_client.get "#{domain}/campaigns/#{campaign_id}/complaints", {:groupby => 'hour',
|
377
377
|
:limit => 100,
|
378
378
|
:page => 1,
|
379
379
|
:count => true}
|
@@ -385,33 +385,33 @@ ____________________________________________________
|
|
385
385
|
**Get List of Webhooks: **
|
386
386
|
|
387
387
|
```ruby
|
388
|
-
result =
|
388
|
+
result = mg_client.get "domains/#{domain}/webhooks"
|
389
389
|
```
|
390
390
|
|
391
391
|
**Get a Webhook Properties: **
|
392
392
|
|
393
393
|
```ruby
|
394
|
-
result =
|
394
|
+
result = mg_client.get "domains/#{domain}/webhooks/#{webhook_id}"
|
395
395
|
```
|
396
396
|
|
397
397
|
**Create a Webhook: **
|
398
398
|
|
399
399
|
```ruby
|
400
|
-
result =
|
400
|
+
result = mg_client.post "domains/#{domain}/webhooks", {:id => 'bounce',
|
401
401
|
:url => 'http://example.com/mailgun/events/bounce'}
|
402
402
|
```
|
403
403
|
|
404
404
|
**Update a Webhook: **
|
405
405
|
|
406
406
|
```ruby
|
407
|
-
result =
|
407
|
+
result = mg_client.put "domains/#{domain}/webhooks/#{webhook_id}", {:id => 'bounce',
|
408
408
|
:url => 'http://example.com/mailgun/events/bounce'}
|
409
409
|
```
|
410
410
|
|
411
411
|
**Remove a Webhook: **
|
412
412
|
|
413
413
|
```ruby
|
414
|
-
result =
|
414
|
+
result = mg_client.delete "domains/#{domain}/webhooks/#{webhook_id}"
|
415
415
|
```
|
416
416
|
|
417
417
|
### Mailing Lists:
|
@@ -420,19 +420,19 @@ ____________________________________________________
|
|
420
420
|
**Get list of Lists: **
|
421
421
|
|
422
422
|
```ruby
|
423
|
-
result =
|
423
|
+
result = mg_client.get "lists"
|
424
424
|
```
|
425
425
|
|
426
426
|
**Get List Properties: **
|
427
427
|
|
428
428
|
```ruby
|
429
|
-
result =
|
429
|
+
result = mg_client.get "lists/#{list_address}"
|
430
430
|
```
|
431
431
|
|
432
432
|
**Create a List: **
|
433
433
|
|
434
434
|
```ruby
|
435
|
-
result =
|
435
|
+
result = mg_client.post "lists", {:address => 'dev.group@samples.mailgun.org',
|
436
436
|
:name => 'Development Group List',
|
437
437
|
:description => 'List of all developers.',
|
438
438
|
:access_level => 'members'}
|
@@ -441,7 +441,7 @@ result = @mg_client.post "lists", {:address => 'dev.group@samples.mailgun.org',
|
|
441
441
|
**Update a List: **
|
442
442
|
|
443
443
|
```ruby
|
444
|
-
result =
|
444
|
+
result = mg_client.put "lists/#{list_address}", {:address => 'dev.group@samples.mailgun.org',
|
445
445
|
:name => 'Development Group List',
|
446
446
|
:description => 'List of all developers.',
|
447
447
|
:access_level => 'members'}
|
@@ -450,25 +450,25 @@ result = @mg_client.put "lists/#{list_address}", {:address => 'dev.group@samples
|
|
450
450
|
**Remove a List: **
|
451
451
|
|
452
452
|
```ruby
|
453
|
-
result =
|
453
|
+
result = mg_client.delete "lists/#{list_address}"
|
454
454
|
```
|
455
455
|
|
456
456
|
**Get List Members: **
|
457
457
|
|
458
458
|
```ruby
|
459
|
-
result =
|
459
|
+
result = mg_client.get "lists/#{list_address}/members"
|
460
460
|
```
|
461
461
|
|
462
462
|
**Get List Member Properties: **
|
463
463
|
|
464
464
|
```ruby
|
465
|
-
result =
|
465
|
+
result = mg_client.get "lists/#{list_address}/members/#{member_address}"
|
466
466
|
```
|
467
467
|
|
468
468
|
**Add Member to List: **
|
469
469
|
|
470
470
|
```ruby
|
471
|
-
result =
|
471
|
+
result = mg_client.post "lists/#{list_address}/members/#{member_address}", {:address => 'jane@samples.mailgun.org',
|
472
472
|
:name => 'Jane Doe',
|
473
473
|
:vars => '{"first": "Jane", "last": "Doe"}',
|
474
474
|
:subscribed => true,
|
@@ -478,7 +478,7 @@ result = @mg_client.post "lists/#{list_address}/members/#{member_address}", {:ad
|
|
478
478
|
**Update Member on List: **
|
479
479
|
|
480
480
|
```ruby
|
481
|
-
result =
|
481
|
+
result = mg_client.put "lists/#{list_address}/members/#{member_address}", {:address => 'jane@samples.mailgun.org',
|
482
482
|
:name => 'Jane Doe',
|
483
483
|
:vars => '{"first": "Jane", "last": "Doe"}',
|
484
484
|
:subscribed => true}
|
@@ -487,13 +487,13 @@ result = @mg_client.put "lists/#{list_address}/members/#{member_address}", {:add
|
|
487
487
|
**Delete a Member from List: **
|
488
488
|
|
489
489
|
```ruby
|
490
|
-
result =
|
490
|
+
result = mg_client.delete "lists/#{list_address}/members/#{member_address}"
|
491
491
|
```
|
492
492
|
|
493
493
|
**Get Stats for List: **
|
494
494
|
|
495
495
|
```ruby
|
496
|
-
result =
|
496
|
+
result = mg_client.get "lists/#{list_address}/stats"
|
497
497
|
```
|
498
498
|
|
499
499
|
### Email Validation:
|
@@ -501,14 +501,7 @@ ____________________________________________________
|
|
501
501
|
**Validate Single Address: **
|
502
502
|
|
503
503
|
```ruby
|
504
|
-
result =
|
505
|
-
```
|
506
|
-
|
507
|
-
**Parse Addresses: **
|
508
|
-
|
509
|
-
```ruby
|
510
|
-
result = @mg_client.get "address/parse", {:addresses => 'test@example.com, "First Last <first.last@example.com>',
|
511
|
-
:syntax_only => true}
|
504
|
+
result = mg_client.get "address/validate", {:address => 'test@example.com'}
|
512
505
|
```
|
513
506
|
|
514
507
|
|
data/lib/mailgun/address.rb
CHANGED
@@ -4,45 +4,20 @@ module Mailgun
|
|
4
4
|
|
5
5
|
# Mailgun::Address is a simple interface to the Email Validation API.
|
6
6
|
class Address
|
7
|
-
|
8
|
-
|
9
|
-
def initialize(api_key = "")
|
10
|
-
if api_key == "" then
|
11
|
-
fail ParameterError.new('Public API key is required for Mailgun::Address.initialize()', nil)
|
12
|
-
end
|
13
|
-
|
14
|
-
@api_key = api_key
|
15
|
-
@client = Mailgun::Client.new(api_key = api_key)
|
7
|
+
def initialize
|
8
|
+
@client = Mailgun::Client.new(Mailgun.api_key, Mailgun.api_host || 'api.mailgun.net', 'v4')
|
16
9
|
end
|
17
10
|
|
18
11
|
# Given an arbitrary address, validates it based on defined checks.
|
19
12
|
#
|
20
13
|
# @param [String] address Email address to validate (max 512 chars.)
|
21
14
|
def validate(address, mailbox_verification = false)
|
22
|
-
params = {:address
|
15
|
+
params = {address: address}
|
23
16
|
params[:mailbox_verification] = true if mailbox_verification
|
24
17
|
|
25
18
|
res = @client.get "address/validate", params
|
26
19
|
return res.to_h!
|
27
20
|
end
|
28
|
-
|
29
|
-
# Parses a delimiter separated list of email addresses into two lists:
|
30
|
-
# parsed addresses and unparsable portions. The parsed addresses are a
|
31
|
-
# list of addresses that are syntactically valid (and optionally have
|
32
|
-
# DNS and ESP specific grammar checks) the unparsable list is a list
|
33
|
-
# of characters sequences that the parser was not able to understand.
|
34
|
-
# These often align with invalid email addresses, but not always.
|
35
|
-
# Delimiter characters are comma (,) and semicolon (;).
|
36
|
-
#
|
37
|
-
# @param [Array] addresses Addresses to parse
|
38
|
-
# @param [TrueClass|FalseClass] syntax_only Perform only syntax checks
|
39
|
-
def parse(addresses, syntax_only = true)
|
40
|
-
validate_addrs = addresses.join(";")
|
41
|
-
|
42
|
-
res = @client.get "address/parse", {:addresses => validate_addrs,
|
43
|
-
:syntax_only => syntax_only.to_s}
|
44
|
-
return res.to_h!
|
45
|
-
end
|
46
21
|
end
|
47
22
|
|
48
23
|
end
|
data/lib/mailgun/client.rb
CHANGED
@@ -205,7 +205,16 @@ module Mailgun
|
|
205
205
|
#
|
206
206
|
# @param [StandardException] e upstream exception object
|
207
207
|
def communication_error(e)
|
208
|
-
|
208
|
+
if e.respond_to?(:response)
|
209
|
+
return case e.response.code
|
210
|
+
when Unauthorized::CODE
|
211
|
+
Unauthorized.new(e.message, e.response)
|
212
|
+
when BadRequest::CODE
|
213
|
+
BadRequest.new(e.message, e.response)
|
214
|
+
else
|
215
|
+
CommunicationError.new(e.message, e.response)
|
216
|
+
end
|
217
|
+
end
|
209
218
|
CommunicationError.new(e.message)
|
210
219
|
end
|
211
220
|
|
@@ -53,8 +53,9 @@ module Mailgun
|
|
53
53
|
# domain - [String] Name of the domain (ex. domain.com)
|
54
54
|
# options - [Hash] of
|
55
55
|
# smtp_password - [String] Password for SMTP authentication
|
56
|
-
# spam_action - [String] disabled or tag
|
56
|
+
# spam_action - [String] disabled, blocked or tag
|
57
57
|
# Disable, no spam filtering will occur for inbound messages.
|
58
|
+
# Block, inbound spam messages will not be delivered.
|
58
59
|
# Tag, messages will be tagged wtih a spam header. See Spam Filter.
|
59
60
|
# wildcard - [Boolean] true or false Determines whether the domain will accept email for sub-domains.
|
60
61
|
#
|
@@ -80,5 +81,22 @@ module Mailgun
|
|
80
81
|
alias_method :delete, :remove
|
81
82
|
alias_method :delete_domain, :remove
|
82
83
|
|
84
|
+
# Public: Update domain
|
85
|
+
#
|
86
|
+
# domain - [String] Name of the domain (ex. domain.com)
|
87
|
+
# options - [Hash] of
|
88
|
+
# spam_action - [String] disabled, blocked or tag
|
89
|
+
# Disable, no spam filtering will occur for inbound messages.
|
90
|
+
# Block, inbound spam messages will not be delivered.
|
91
|
+
# Tag, messages will be tagged wtih a spam header. See Spam Filter.
|
92
|
+
# web_scheme - [String] http or https
|
93
|
+
# Set your open, click and unsubscribe URLs to use http or https
|
94
|
+
# wildcard - [Boolean] true or false Determines whether the domain will accept email for sub-domains.
|
95
|
+
#
|
96
|
+
# Returns [Hash] of updated domain
|
97
|
+
def update(domain, options = {})
|
98
|
+
fail(ParameterError, 'No domain given to add on Mailgun', caller) unless domain
|
99
|
+
@client.put("domains/#{domain}", options).to_h
|
100
|
+
end
|
83
101
|
end
|
84
102
|
end
|
@@ -58,7 +58,6 @@ module Mailgun
|
|
58
58
|
rescue
|
59
59
|
api_message = 'Unknown API error'
|
60
60
|
end
|
61
|
-
api_message = api_message + ' - Invalid Domain or API key' if api_message == FORBIDDEN
|
62
61
|
|
63
62
|
message = message || ''
|
64
63
|
message = message + ': ' + api_message
|
@@ -68,6 +67,26 @@ module Mailgun
|
|
68
67
|
@code = NOCODE
|
69
68
|
super(message, response)
|
70
69
|
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# Public: Class for managing unauthorized 401 errors
|
73
|
+
# Inherits from Mailgun::CommunicationError
|
74
|
+
class Unauthorized < CommunicationError
|
75
|
+
CODE = 401
|
71
76
|
|
77
|
+
def initialize(error_message, response)
|
78
|
+
error_message = error_message + ' - Invalid Domain or API key'
|
79
|
+
super(error_message, response)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# Public: Class for managing bad request 400 errors
|
84
|
+
# Inherits from Mailgun::CommunicationError
|
85
|
+
class BadRequest < CommunicationError
|
86
|
+
CODE = 400
|
87
|
+
|
88
|
+
def initialize(error_message, response)
|
89
|
+
super(error_message, response)
|
90
|
+
end
|
72
91
|
end
|
73
92
|
end
|
@@ -406,7 +406,7 @@ module Mailgun
|
|
406
406
|
def make_json(obj)
|
407
407
|
return JSON.parse(obj).to_json if obj.is_a?(String)
|
408
408
|
return obj.to_json if obj.is_a?(Hash)
|
409
|
-
|
409
|
+
JSON.generate(obj).to_json
|
410
410
|
rescue
|
411
411
|
raise Mailgun::ParameterError, 'Provided data could not be made into JSON. Try a JSON string or Hash.', obj
|
412
412
|
end
|
@@ -429,7 +429,7 @@ module Mailgun
|
|
429
429
|
full_name = vars['full_name']
|
430
430
|
elsif vars['first'] || vars['last']
|
431
431
|
full_name = "#{vars['first']} #{vars['last']}".strip
|
432
|
-
end
|
432
|
+
end
|
433
433
|
|
434
434
|
return "'#{full_name}' <#{address}>" if full_name
|
435
435
|
address
|
data/lib/mailgun/version.rb
CHANGED
data/lib/mailgun.rb
CHANGED
data/lib/railgun/mailer.rb
CHANGED
@@ -36,4 +36,12 @@ describe 'For the domains endpoint', vcr: vcr_opts do
|
|
36
36
|
|
37
37
|
expect(result).to be_truthy
|
38
38
|
end
|
39
|
+
|
40
|
+
it 'updates the domain' do
|
41
|
+
result = @mg_obj.update(@domain, { spam_action: 'block', web_scheme: 'https', wildcard: true })
|
42
|
+
|
43
|
+
expect(result['domain']["spam_action"]).to eq('block')
|
44
|
+
expect(result['domain']["web_scheme"]).to eq('https')
|
45
|
+
expect(result['domain']["wildcard"]).to eq(true)
|
46
|
+
end
|
39
47
|
end
|
@@ -7,7 +7,7 @@ vcr_opts = { :cassette_name => "email_validation" }
|
|
7
7
|
|
8
8
|
describe 'For the email validation endpoint', order: :defined, vcr: vcr_opts do
|
9
9
|
before(:all) do
|
10
|
-
@mg_obj = Mailgun::Address.new
|
10
|
+
@mg_obj = Mailgun::Address.new
|
11
11
|
|
12
12
|
@valid = ["Alice <alice@example.com>", "bob@example.com"]
|
13
13
|
@invalid = ["example.org"]
|
@@ -15,13 +15,6 @@ describe 'For the email validation endpoint', order: :defined, vcr: vcr_opts do
|
|
15
15
|
@all_addrs = @valid + @invalid
|
16
16
|
end
|
17
17
|
|
18
|
-
it 'returns parsed and unparsable lists' do
|
19
|
-
res = @mg_obj.parse(@all_addrs)
|
20
|
-
|
21
|
-
expect(res["parsed"]).to eq(@valid)
|
22
|
-
expect(res["unparseable"]).to eq(@invalid)
|
23
|
-
end
|
24
|
-
|
25
18
|
it 'validates alice@mailgun.net with info' do
|
26
19
|
res = @mg_obj.validate("alice@mailgun.net")
|
27
20
|
|
@@ -34,6 +34,78 @@ describe 'Client exceptions', vcr: vcr_opts do
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
+
vcr_opts = { :cassette_name => "exceptions-invalid-api-key" }
|
38
|
+
|
39
|
+
describe 'Client exceptions', vcr: vcr_opts do
|
40
|
+
before(:all) do
|
41
|
+
@mg_obj = Mailgun::Client.new(APIKEY, APIHOST, APIVERSION, SSL)
|
42
|
+
@domain = TESTDOMAIN
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'displays error information that API key is invalid' do
|
46
|
+
begin
|
47
|
+
@mg_obj.send_message(@domain, {
|
48
|
+
:from => "sally@#{@domain}",
|
49
|
+
:to => "sally@#{@domain}",
|
50
|
+
:subject => 'Exception Integration Test',
|
51
|
+
:text => 'INTEGRATION TESTING'
|
52
|
+
})
|
53
|
+
rescue Mailgun::Unauthorized => err
|
54
|
+
expect(err.message).to eq('401 Unauthorized - Invalid Domain or API key: Forbidden')
|
55
|
+
else
|
56
|
+
fail
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
vcr_opts = { :cassette_name => "exceptions-invalid-data" }
|
62
|
+
|
63
|
+
describe 'Client exceptions', vcr: vcr_opts do
|
64
|
+
before(:all) do
|
65
|
+
@mg_obj = Mailgun::Client.new(APIKEY, APIHOST, APIVERSION, SSL)
|
66
|
+
@domain = TESTDOMAIN
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'display useful error information' do
|
70
|
+
begin
|
71
|
+
@mg_obj.send_message(@domain, {
|
72
|
+
:from => "sally@#{@domain}",
|
73
|
+
:to => "sally#{@domain}",
|
74
|
+
:subject => 'Exception Integration Test',
|
75
|
+
:text => 'INTEGRATION TESTING'
|
76
|
+
})
|
77
|
+
rescue Mailgun::BadRequest => err
|
78
|
+
expect(err.message).to eq('400 Bad Request: to parameter is not a valid address. please check documentation')
|
79
|
+
else
|
80
|
+
fail
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
vcr_opts = { :cassette_name => "exceptions-not-allowed" }
|
86
|
+
|
87
|
+
describe 'Client exceptions', vcr: vcr_opts do
|
88
|
+
before(:all) do
|
89
|
+
@mg_obj = Mailgun::Client.new(APIKEY, APIHOST, APIVERSION, SSL)
|
90
|
+
@domain = TESTDOMAIN
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'display useful error information' do
|
94
|
+
begin
|
95
|
+
@mg_obj.send_message(@domain, {
|
96
|
+
:from => "invalid@#{@domain}",
|
97
|
+
:to => "invalid#{@domain}",
|
98
|
+
:subject => 'Exception Integration Test',
|
99
|
+
:text => 'INTEGRATION TESTING'
|
100
|
+
})
|
101
|
+
rescue Mailgun::CommunicationError => err
|
102
|
+
expect(err.message).to include('403 Forbidden')
|
103
|
+
else
|
104
|
+
fail
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
37
109
|
vcr_opts = { :cassette_name => "send_message" }
|
38
110
|
|
39
111
|
describe 'The method send_message()', vcr: vcr_opts do
|
data/vcr_cassettes/domains.yml
CHANGED
@@ -357,4 +357,54 @@ http_interactions:
|
|
357
357
|
}
|
358
358
|
http_version:
|
359
359
|
recorded_at: Fri, 15 Jan 2016 20:12:54 GMT
|
360
|
-
|
360
|
+
- request:
|
361
|
+
method: put
|
362
|
+
uri: https://api.mailgun.net/v3/domains/integration-test.domain.invalid
|
363
|
+
body:
|
364
|
+
encoding: UTF-8
|
365
|
+
string: spam_action=block&web_scheme=https&wildcard=true
|
366
|
+
headers:
|
367
|
+
Accept:
|
368
|
+
- "*/*"
|
369
|
+
User-Agent:
|
370
|
+
- rest-client/2.1.0 (darwin21.6.0 x86_64) ruby/2.5.1p57
|
371
|
+
Content-Length:
|
372
|
+
- '48'
|
373
|
+
Content-Type:
|
374
|
+
- application/x-www-form-urlencoded
|
375
|
+
Accept-Encoding:
|
376
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
377
|
+
Host:
|
378
|
+
- api.mailgun.net
|
379
|
+
Authorization:
|
380
|
+
- Basic YXBpOmQ5MTViNWNkYjlhNTgzNjg1ZDhmM2ZiMWJlYzBmMjBmLTA3YmM3YjA1LWZhNDgxNmEx
|
381
|
+
response:
|
382
|
+
status:
|
383
|
+
code: 200
|
384
|
+
message: OK
|
385
|
+
headers:
|
386
|
+
Access-Control-Allow-Credentials:
|
387
|
+
- 'true'
|
388
|
+
Access-Control-Allow-Origin:
|
389
|
+
- "*"
|
390
|
+
Cache-Control:
|
391
|
+
- no-store
|
392
|
+
Content-Length:
|
393
|
+
- '445'
|
394
|
+
Content-Type:
|
395
|
+
- application/json; charset=utf-8
|
396
|
+
Date:
|
397
|
+
- Mon, 17 Apr 2023 13:03:16 GMT
|
398
|
+
Strict-Transport-Security:
|
399
|
+
- max-age=63072000; includeSubDomains
|
400
|
+
X-Xss-Protection:
|
401
|
+
- 1; mode=block
|
402
|
+
body:
|
403
|
+
encoding: UTF-8
|
404
|
+
string: '{"message":"Domain has been updated","domain":{"created_at":"Mon, 25
|
405
|
+
Jan 2021 10:11:26 GMT","id":"600e994e20b1a14a5990856d","is_disabled":false,"name":"integration-test.domain.invalid","require_tls":false,"skip_verification":false,"smtp_login":"postmaster@DOMAIN.TEST","spam_action":"block","state":"active","type":"sandbox","web_prefix":"email","web_scheme":"https","wildcard":true}}
|
406
|
+
|
407
|
+
'
|
408
|
+
http_version:
|
409
|
+
recorded_at: Mon, 17 Apr 2023 13:04:47 GMT
|
410
|
+
recorded_with: VCR 3.0.3
|
@@ -0,0 +1,52 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://api.mailgun.net/v3/DOMAIN.TEST/messages
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: from=sally%test.com&to=sally%test.com&subject=Exception+Integration+Test&text=INTEGRATION+TESTING
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- "*/*"
|
12
|
+
User-Agent:
|
13
|
+
- rest-client/2.1.0 (darwin21.6.0 x86_64) ruby/2.5.1p57
|
14
|
+
Content-Length:
|
15
|
+
- '119'
|
16
|
+
Content-Type:
|
17
|
+
- application/x-www-form-urlencoded
|
18
|
+
Accept-Encoding:
|
19
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
20
|
+
Host:
|
21
|
+
- api.mailgun.net
|
22
|
+
Authorization:
|
23
|
+
- Basic YXBpOmQ5MTViNWNkYjlhNTgzNjg1ZDhmM2YwNS1mYTQ4MTZhMQ==
|
24
|
+
response:
|
25
|
+
status:
|
26
|
+
code: 401
|
27
|
+
message: Unauthorized
|
28
|
+
headers:
|
29
|
+
Access-Control-Allow-Credentials:
|
30
|
+
- 'true'
|
31
|
+
Access-Control-Allow-Origin:
|
32
|
+
- "*"
|
33
|
+
Cache-Control:
|
34
|
+
- no-store
|
35
|
+
Content-Length:
|
36
|
+
- '9'
|
37
|
+
Content-Type:
|
38
|
+
- text/plain; charset=utf-8
|
39
|
+
Date:
|
40
|
+
- Sun, 28 May 2023 11:29:25 GMT
|
41
|
+
Strict-Transport-Security:
|
42
|
+
- max-age=63072000; includeSubDomains
|
43
|
+
Www-Authenticate:
|
44
|
+
- Basic realm="MG API"
|
45
|
+
X-Xss-Protection:
|
46
|
+
- 1; mode=block
|
47
|
+
body:
|
48
|
+
encoding: UTF-8
|
49
|
+
string: Forbidden
|
50
|
+
http_version:
|
51
|
+
recorded_at: Sun, 28 May 2023 11:29:25 GMT
|
52
|
+
recorded_with: VCR 3.0.3
|
@@ -0,0 +1,52 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://api.mailgun.net/v3/DOMAIN.TEST/messages
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: from=sally%40gmail.com&to=sallygmail.com&subject=Exception+Integration+Test&text=INTEGRATION+TESTING
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- "*/*"
|
12
|
+
User-Agent:
|
13
|
+
- rest-client/2.1.0 (darwin21.6.0 x86_64) ruby/2.5.1p57
|
14
|
+
Content-Length:
|
15
|
+
- '116'
|
16
|
+
Content-Type:
|
17
|
+
- application/x-www-form-urlencoded
|
18
|
+
Accept-Encoding:
|
19
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
20
|
+
Host:
|
21
|
+
- api.mailgun.net
|
22
|
+
Authorization:
|
23
|
+
- Basic YXBpOmQ5MTViNWNkYjlhNTgzNjg1ZDhmM2ZiMWJlYzBmMjBmLTA3YmM3YjA1LWZhNDgxNmEx
|
24
|
+
response:
|
25
|
+
status:
|
26
|
+
code: 400
|
27
|
+
message: Bad Request
|
28
|
+
headers:
|
29
|
+
Access-Control-Allow-Credentials:
|
30
|
+
- 'true'
|
31
|
+
Access-Control-Allow-Origin:
|
32
|
+
- "*"
|
33
|
+
Cache-Control:
|
34
|
+
- no-store
|
35
|
+
Content-Length:
|
36
|
+
- '78'
|
37
|
+
Content-Type:
|
38
|
+
- application/json; charset=utf-8
|
39
|
+
Date:
|
40
|
+
- Sun, 28 May 2023 11:35:04 GMT
|
41
|
+
Strict-Transport-Security:
|
42
|
+
- max-age=63072000; includeSubDomains
|
43
|
+
X-Xss-Protection:
|
44
|
+
- 1; mode=block
|
45
|
+
body:
|
46
|
+
encoding: UTF-8
|
47
|
+
string: '{"message":"to parameter is not a valid address. please check documentation"}
|
48
|
+
|
49
|
+
'
|
50
|
+
http_version:
|
51
|
+
recorded_at: Sun, 28 May 2023 11:35:04 GMT
|
52
|
+
recorded_with: VCR 3.0.3
|
@@ -0,0 +1,54 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://api.mailgun.net/v3/DOMAIN.TEST/messages
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: from=sally%test.com&to=sally%test.com&subject=Exception+Integration+Test&text=INTEGRATION+TESTING
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- "*/*"
|
12
|
+
User-Agent:
|
13
|
+
- rest-client/2.1.0 (darwin21.6.0 x86_64) ruby/2.5.1p57
|
14
|
+
Content-Length:
|
15
|
+
- '121'
|
16
|
+
Content-Type:
|
17
|
+
- application/x-www-form-urlencoded
|
18
|
+
Accept-Encoding:
|
19
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
20
|
+
Host:
|
21
|
+
- api.mailgun.net
|
22
|
+
Authorization:
|
23
|
+
- Basic YXBpOmQ5MTViNWNkYjlhNTgzNjg1ZDhmM2ZiMWJlYzBmMjBmLTA3YmM3YjA1LWZhNDgxNmEx
|
24
|
+
response:
|
25
|
+
status:
|
26
|
+
code: 403
|
27
|
+
message: Forbidden
|
28
|
+
headers:
|
29
|
+
Access-Control-Allow-Credentials:
|
30
|
+
- 'true'
|
31
|
+
Access-Control-Allow-Origin:
|
32
|
+
- "*"
|
33
|
+
Cache-Control:
|
34
|
+
- no-store
|
35
|
+
Content-Length:
|
36
|
+
- '219'
|
37
|
+
Content-Type:
|
38
|
+
- application/json; charset=utf-8
|
39
|
+
Date:
|
40
|
+
- Sun, 28 May 2023 11:40:00 GMT
|
41
|
+
Strict-Transport-Security:
|
42
|
+
- max-age=63072000; includeSubDomains
|
43
|
+
X-Xss-Protection:
|
44
|
+
- 1; mode=block
|
45
|
+
body:
|
46
|
+
encoding: UTF-8
|
47
|
+
string: '{"message":"Domain DOMAIN.TEST is not allowed to send: Free accounts
|
48
|
+
are for test purposes only. Please upgrade or add the address to authorized
|
49
|
+
recipients in Account Settings."}
|
50
|
+
|
51
|
+
'
|
52
|
+
http_version:
|
53
|
+
recorded_at: Sun, 28 May 2023 11:40:00 GMT
|
54
|
+
recorded_with: VCR 3.0.3
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mailgun-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mailgun
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2023-
|
12
|
+
date: 2023-06-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -220,6 +220,9 @@ files:
|
|
220
220
|
- vcr_cassettes/domains.yml
|
221
221
|
- vcr_cassettes/email_validation.yml
|
222
222
|
- vcr_cassettes/events.yml
|
223
|
+
- vcr_cassettes/exceptions-invalid-api-key.yml
|
224
|
+
- vcr_cassettes/exceptions-invalid-data.yml
|
225
|
+
- vcr_cassettes/exceptions-not-allowed.yml
|
223
226
|
- vcr_cassettes/exceptions.yml
|
224
227
|
- vcr_cassettes/list_members.yml
|
225
228
|
- vcr_cassettes/mailer_invalid_domain.yml
|
@@ -251,7 +254,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
251
254
|
- !ruby/object:Gem::Version
|
252
255
|
version: '0'
|
253
256
|
requirements: []
|
254
|
-
|
257
|
+
rubyforge_project:
|
258
|
+
rubygems_version: 2.7.6
|
255
259
|
signing_key:
|
256
260
|
specification_version: 4
|
257
261
|
summary: Mailgun's Official Ruby SDK
|