mailgun-ruby 1.2.13 → 1.2.14

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 63fbab3c08481c2364ca4fef89def410a12672507954764103e900bb0f081858
4
- data.tar.gz: e2fed301bb806d720b6e7f9f8707d415756ed92f5b841592ebc100eb53a71d74
3
+ metadata.gz: 3905ad8ab1dae85ea3b87b10d2ac01700de085adab73d9e02373f4d54e70451d
4
+ data.tar.gz: e5794e301066318205a9ffb6de455d73642d3162b1ad75900cefed7aa95db798
5
5
  SHA512:
6
- metadata.gz: 69ad70a850bdb1cbc859647509315b118aa7508747c8af281eeb7ec4514156f1416aa16b4d0e10e07fa168adc705ba110d20b28aae3137b26c454cdf9115b191
7
- data.tar.gz: e5f30539ca1dfd25ab6bd489c7544febd7b54ae00b407c3378e9ecd3c7166efd961d76f73943e931015436880eab72b607cea5629bf26fda811cbfec1dc1e787
6
+ metadata.gz: af8ed54564c2f13b818aa7da6a550b9000b4148ee437b108d01219d80b610580fde3a1973dd831db3ffd8b0dbe934d9288b479a335a5521e3f275815a9f30c8e
7
+ data.tar.gz: 5d11d20420e6333e9e71104fc529d80f19ed689cb300bc5b19ec4c2b855e9c92e24e59d7de83122d2bcdc910a0ec60f783ea277e011e8d375bb1e471be30802e
data/CHANGELOG.md CHANGED
@@ -4,13 +4,33 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [1.2.14] - 2024-02-13
8
+
9
+ ### Added
10
+
11
+ - Tags CRUD support (https://github.com/mailgun/mailgun-ruby/pull/316)
12
+ - Additional Domain Endpoints (https://github.com/mailgun/mailgun-ruby/pull/314)
13
+ - Webhooks Update Method (https://github.com/mailgun/mailgun-ruby/pull/305)
14
+ - Add support for AMP HTML (https://github.com/mailgun/mailgun-ruby/pull/304)
15
+ - Add support for AMP HTML (https://github.com/mailgun/mailgun-ruby/pull/304)
16
+
17
+ ### Fixed
18
+
19
+ - Typos in docs, specs (- Add support for AMP HTML (https://github.com/mailgun/mailgun-ruby/pull/304)).
20
+
7
21
  ## [1.2.13] - 2023-11-25
8
22
 
9
23
  ### Added
10
24
 
11
- - Subaccounts API support (https://github.com/mailgun/mailgun-ruby/pull/300).
25
+ - Subaccounts API support (https://github.com/mailgun/mailgun-ruby/pull/310).
26
+
27
+ ## [1.2.12] - 2023-10-22
28
+
29
+ ### Added
30
+
31
+ - Templates CRUD support (https://github.com/mailgun/mailgun-ruby/pull/300).
12
32
 
13
33
  ### Fixed
14
34
 
15
35
  - transform_for_mailgun block iteration issue (https://github.com/mailgun/mailgun-ruby/pull/298).
16
- - Typos in several files (https://github.com/mailgun/mailgun-ruby/pull/297).
36
+ - Typos in several files (https://github.com/mailgun/mailgun-ruby/pull/297).
data/README.md CHANGED
@@ -19,7 +19,7 @@ gem install mailgun-ruby
19
19
  Gemfile:
20
20
 
21
21
  ```ruby
22
- gem 'mailgun-ruby', '~>1.2.12'
22
+ gem 'mailgun-ruby', '~>1.2.14'
23
23
  ```
24
24
 
25
25
  Usage
data/docs/Domains.md CHANGED
@@ -53,5 +53,5 @@ See the [Suppressions](/docs/Suppressions.md) for usage samples and
53
53
 
54
54
  More Documentation
55
55
  ------------------
56
- See the official [Mailgun Domain Docs](https://documentation.mailgun.com/api-domains.html)
56
+ See the official [Mailgun Domain Docs](https://documentation.mailgun.com/en/latest/api-domains.html)
57
57
  for more information
data/docs/Events.md CHANGED
@@ -42,5 +42,5 @@ last time you called "next".
42
42
 
43
43
  More Documentation
44
44
  ------------------
45
- See the official [Mailgun Docs](http://documentation.mailgun.com/api-sending.html)
45
+ See the official [Mailgun Docs](https://documentation.mailgun.com/en/latest/api-events.html)
46
46
  for more information.
@@ -104,5 +104,5 @@ message_ids = mb_obj.finalize
104
104
 
105
105
  More Documentation
106
106
  ------------------
107
- See the official [Mailgun Docs](http://documentation.mailgun.com/api-sending.html)
107
+ See the official [Mailgun Docs](https://documentation.mailgun.com/en/latest/api-sending.html)
108
108
  for more information.
data/docs/Messages.md CHANGED
@@ -103,5 +103,5 @@ message_ids = mb_obj.finalize
103
103
 
104
104
  More Documentation
105
105
  ------------------
106
- See the official [Mailgun Docs](https://documentation.mailgun.com/api-sending.html)
106
+ See the official [Mailgun Docs](https://documentation.mailgun.com/en/latest/api-sending.html)
107
107
  for more information.
data/docs/OptInHandler.md CHANGED
@@ -100,4 +100,4 @@ Available Functions
100
100
 
101
101
  More Documentation
102
102
  ------------------
103
- See the official [Mailgun Docs](https://documentation.mailgun.com/en/latest/api-sending.html) for more information.
103
+ See the official [Mailgun Docs](https://documentation.mailgun.com/) for more information.
data/docs/Snippets.md CHANGED
@@ -513,7 +513,7 @@ Be sure to visit the Mailgun official
513
513
  information about our API.
514
514
 
515
515
  If you find a bug, please submit the issue in Github directly.
516
- [Mailgun-Ruby Issues](https://github.com/mailgun/Mailgun-PHP/issues)
516
+ [Mailgun-Ruby Issues](https://github.com/mailgun/mailgun-ruby/issues)
517
517
 
518
518
  As always, if you need additional assistance, drop us a note at
519
519
  [support@mailgun.com](mailto:support@mailgun.com).
data/docs/Webhooks.md CHANGED
@@ -36,5 +36,5 @@ hook.remove_all 'my.perfect.domain'
36
36
 
37
37
  More Documentation
38
38
  ------------------
39
- See the official [Mailgun Domain Docs](https://documentation.mailgun.com/api-webhooks.html)
39
+ See the official [Mailgun Domain Docs](https://documentation.mailgun.com/en/latest/api-webhooks.html)
40
40
  for more information
@@ -30,6 +30,7 @@ module Mailgun
30
30
  RestClient.proxy = proxy_url
31
31
  @http_client = RestClient::Resource.new(endpoint, rest_client_params)
32
32
  @test_mode = test_mode
33
+ @api_version = api_version
33
34
  end
34
35
 
35
36
  # Enable test mode
@@ -68,6 +69,11 @@ module Mailgun
68
69
  @test_mode
69
70
  end
70
71
 
72
+ # @return [String] client api version
73
+ def api_version
74
+ @api_version
75
+ end
76
+
71
77
  # Provides a store of all the emails sent in test mode so you can check them.
72
78
  #
73
79
  # @return [Hash]
@@ -168,8 +174,12 @@ module Mailgun
168
174
  # @param [String] resource_path This is the API resource you wish to interact
169
175
  # with. Be sure to include your domain, where necessary.
170
176
  # @return [Mailgun::Response] A Mailgun::Response object.
171
- def delete(resource_path)
172
- response = @http_client[resource_path].delete
177
+ def delete(resource_path, params = nil)
178
+ if params
179
+ response = @http_client[resource_path].delete(params: params)
180
+ else
181
+ response = @http_client[resource_path].delete
182
+ end
173
183
  Response.new(response)
174
184
  rescue => err
175
185
  raise communication_error err
@@ -95,8 +95,236 @@ module Mailgun
95
95
  #
96
96
  # Returns [Hash] of updated domain
97
97
  def update(domain, options = {})
98
- fail(ParameterError, 'No domain given to add on Mailgun', caller) unless domain
98
+ fail(ParameterError, 'No domain given to update on Mailgun', caller) unless domain
99
99
  @client.put("domains/#{domain}", options).to_h
100
100
  end
101
+
102
+ # Public: Creates a new set of SMTP credentials for the defined domain.
103
+ #
104
+ # domain - [String] Name of the domain (ex. domain.com)
105
+ # options - [Hash] of
106
+ # login - [String] The user name (ex. bob.bar)
107
+ # password - [String] A password for the SMTP credentials. (Length Min 5, Max 32)
108
+ #
109
+ # Returns [Hash] with message key
110
+ def create_smtp_credentials(domain, options = {})
111
+ fail(ParameterError, 'No domain given to create credentials on Mailgun', caller) unless domain
112
+ @client.post("domains/#{domain}/credentials", options).to_h
113
+ end
114
+
115
+ # Public: Updates the specified SMTP credentials.
116
+ #
117
+ # domain - [String] Name of the domain (ex. domain.com)
118
+ # login - [String] The user name (ex. bob.bar)
119
+ # options - [Hash] of
120
+ # password - [String] A password for the SMTP credentials. (Length Min 5, Max 32)
121
+ #
122
+ # Returns [Hash] with message key
123
+ def update_smtp_credentials(domain, login, options = {})
124
+ fail(ParameterError, 'No domain given to update credentials on Mailgun', caller) unless domain
125
+ fail(ParameterError, 'No login given to update credentials on Mailgun', caller) unless login
126
+ @client.put("domains/#{domain}/credentials/#{login}", options).to_h
127
+ end
128
+
129
+ # Public: Deletes the defined SMTP credentials.
130
+ #
131
+ # domain - [String] Name of the domain (ex. domain.com)
132
+ # login - [String] The user name (ex. bob.bar)
133
+ #
134
+ # Returns [Hash] with message and spec keys
135
+ def delete_smtp_credentials(domain, login)
136
+ fail(ParameterError, 'No domain given to delete credentials on Mailgun', caller) unless domain
137
+ fail(ParameterError, 'No login given to delete credentials on Mailgun', caller) unless login
138
+ @client.delete("domains/#{domain}/credentials/#{login}").to_h
139
+ end
140
+
141
+ # Public: Returns delivery connection settings for the defined domain.
142
+ #
143
+ # domain - [String] Name of the domain (ex. domain.com)
144
+ #
145
+ # Returns [Hash] Information on the delivery connection settings
146
+ def get_domain_connection_settings(domain)
147
+ fail(ParameterError, 'No domain given to retrieve connections on Mailgun', caller) unless domain
148
+ @client.get("domains/#{domain}/connection").to_h
149
+ end
150
+
151
+ # Public: Updates the specified delivery connection settings for the defined domain.d
152
+ #
153
+ # domain - [String] Name of the domain (ex. domain.com)
154
+ # options - [Hash] of
155
+ # require_tls - [Boolean] true or false. If true - requires the message only be sent over a TLS connection
156
+ # skip_verification - [Boolean] true or false. If true - the certificate and hostname will not be verified
157
+ # when trying to establish a TLS connection
158
+ #
159
+ # Returns [Hash] Information on the delivery connection settings
160
+ def update_domain_connection_settings(domain, options = {})
161
+ fail(ParameterError, 'No domain given to update connections on Mailgun', caller) unless domain
162
+ @client.put("domains/#{domain}/connection", options).to_h
163
+ end
164
+
165
+ # Public: Returns tracking settings for the defined domain.
166
+ #
167
+ # domain - [String] Name of the domain (ex. domain.com)
168
+ #
169
+ # Returns [Hash] Information on the tracking settings
170
+ def get_domain_tracking_settings(domain)
171
+ fail(ParameterError, 'No domain given to retrieve tracking settings on Mailgun', caller) unless domain
172
+ @client.get("domains/#{domain}/tracking").to_h
173
+ end
174
+
175
+ # Public: Updates the open tracking settings for a domain.
176
+ #
177
+ # domain - [String] Name of the domain (ex. domain.com)
178
+ # options - [Hash] of
179
+ # active - [Boolean] yes or no. If set to yes, a tracking pixel will be inserted below your HTML content.
180
+ # place_at_the_top - [Boolean] yes or no. If set to yes, tracking pixel will be moved to top of your HTML content.
181
+ #
182
+ # Returns [Hash] Information on the tracking open settings
183
+ def update_domain_tracking_open_settings(domain, options = {})
184
+ fail(ParameterError, 'No domain given to update tracking settings on Mailgun', caller) unless domain
185
+ @client.put("domains/#{domain}/tracking/open", options).to_h
186
+ end
187
+
188
+ # Public: Updates the click tracking settings for a domain.
189
+ #
190
+ # domain - [String] Name of the domain (ex. domain.com)
191
+ # options - [Hash] of
192
+ # active - [Boolean] yes or no. If set to yes, links will be overwritten and pointed to our servers so we can track clicks.
193
+ #
194
+ # Returns [Hash] Information on the tracking click settings
195
+ def update_domain_tracking_click_settings(domain, options = {})
196
+ fail(ParameterError, 'No domain given to update tracking settings on Mailgun', caller) unless domain
197
+ @client.put("domains/#{domain}/tracking/click", options).to_h
198
+ end
199
+
200
+ # Public: Updates unsubscribe tracking settings for a domain.
201
+ #
202
+ # domain - [String] Name of the domain (ex. domain.com)
203
+ # options - [Hash] of
204
+ # active - [Boolean] true or false.
205
+ # html_footer - [String] Custom HTML version of unsubscribe footer.
206
+ # text_footer - [String] Custom text version of unsubscribe footer.
207
+ #
208
+ # Returns [Hash] Information on the tracking unsubscribe settings
209
+ def update_domain_tracking_unsubscribe_settings(domain, options = {})
210
+ fail(ParameterError, 'No domain given to update tracking settings on Mailgun', caller) unless domain
211
+ @client.put("domains/#{domain}/tracking/unsubscribe", options).to_h
212
+ end
213
+
214
+ # Public: Change the DKIM authority for a domain.
215
+ #
216
+ # domain - [String] Name of the domain (ex. domain.com)
217
+ # options - [Hash] of
218
+ # self - [Boolean] true - the domain will be the DKIM authority for itself even
219
+ # if the root domain is registered on the same mailgun account
220
+ #
221
+ # Returns [Hash] Information on the DKIM authority
222
+ def update_domain_dkim_authority(domain, options = {})
223
+ fail(ParameterError, 'No domain given to update tracking settings on Mailgun', caller) unless domain
224
+ @client.put("domains/#{domain}/dkim_authority", options).to_h
225
+ end
226
+
227
+ # Public: Update the DKIM selector for a domains
228
+ #
229
+ # domain - [String] Name of the domain (ex. domain.com)
230
+ # options - [Hash] of
231
+ # dkim_selector - [String] change the DKIM selector for a domain.
232
+ #
233
+ # Returns [Hash] with message key
234
+ def update_domain_dkim_selector(domain, options = {})
235
+ fail(ParameterError, 'No domain given to update tracking settings on Mailgun', caller) unless domain
236
+ @client.put("domains/#{domain}/dkim_selector", options).to_h
237
+ end
238
+
239
+ # Public: Update the CNAME used for tracking opens and clicks
240
+ #
241
+ # domain - [String] Name of the domain (ex. domain.com)
242
+ # options - [Hash] of
243
+ # web_prefix - [String] change the tracking CNAME for a domain.
244
+ #
245
+ # Returns [Hash] with message key
246
+ def update_domain_web_prefix(domain, options = {})
247
+ fail(ParameterError, 'No domain given to update tracking settings on Mailgun', caller) unless domain
248
+ @client.put("domains/#{domain}/web_prefix", options).to_h
249
+ end
250
+
251
+ # Public: Lists the domain keys for a specified signing domain / authority
252
+ #
253
+ # domain - [String] Name of the domain (ex. domain.com)
254
+ #
255
+ # Returns [Hash] with domain keys data
256
+ def get_domain_keys(domain)
257
+ fail(ParameterError, 'Client api version must be v4', caller) unless @client.api_version == 'v4'
258
+ fail(ParameterError, 'No domain given to retrieve keys on Mailgun', caller) unless domain
259
+ @client.get("domains/#{domain}/keys").to_h
260
+ end
261
+
262
+ # Public: Activate a domain key for a specified authority and selector.
263
+ #
264
+ # domain - [String] Name of the domain (ex. domain.com)
265
+ # selector - [String] The selector you want to activate for the domain key
266
+ #
267
+ # Returns [Hash] with message key and autority + selector data
268
+ def activate_domain_key(domain, selector)
269
+ fail(ParameterError, 'Client api version must be v4', caller) unless @client.api_version == 'v4'
270
+ fail(ParameterError, 'No domain given to update tracking settings on Mailgun', caller) unless domain
271
+ fail(ParameterError, 'No selector given to activate key on Mailgun', caller) unless selector
272
+ @client.put("domains/#{domain}/keys/#{selector}/activate", {}).to_h
273
+ end
274
+
275
+ # Public: Deactivate a domain key for a specified authority and selector
276
+ #
277
+ # domain - [String] Name of the domain (ex. domain.com)
278
+ # selector - [String] The selector you want to activate for the domain key
279
+ #
280
+ # Returns [Hash] with message key and autority + selector data
281
+ def deactivate_domain_key(domain, selector)
282
+ fail(ParameterError, 'Client api version must be v4', caller) unless @client.api_version == 'v4'
283
+ fail(ParameterError, 'No domain given to update tracking settings on Mailgun', caller) unless domain
284
+ fail(ParameterError, 'No selector given to activate key on Mailgun', caller) unless selector
285
+ @client.put("domains/#{domain}/keys/#{selector}/deactivate", {}).to_h
286
+ end
287
+
288
+ # Public: Create a domain key
289
+ #
290
+ # options - [Hash] of
291
+ # signing_domain - [String] Name of the domain (ex. domain.com)
292
+ # selector - [String] Selector to be used for the new domain key
293
+ # bits - [Integer] Key size, can be 1024 or 2048
294
+ # pem - [String] Private key PEM
295
+ #
296
+ # Returns [Hash] with message key
297
+ def create_domain_key(options = {})
298
+ fail(ParameterError, 'Client api version must be v1', caller) unless @client.api_version == 'v1'
299
+ @client.post("dkim/keys", options).to_h
300
+ end
301
+
302
+ # Public: Delete a domain key.
303
+ #
304
+ # options - [Hash] of
305
+ # signing_domain - [Integer] Name of the domain (ex. domain.com)
306
+ # selector - [String] Name of the selector
307
+ #
308
+ # Returns [Hash] with message key
309
+ def delete_domain_key(options = {})
310
+ fail(ParameterError, 'Client api version must be v1', caller) unless @client.api_version == 'v1'
311
+ @client.delete("dkim/keys", options).to_h
312
+ end
313
+
314
+ # Public: Returns total stats for a given domains
315
+ #
316
+ # domain - [String] Name of the domain (ex. domain.com)
317
+ # options - [Hash] of
318
+ # event - [String] The type of the event.
319
+ # start - [String] The starting time. Should be in RFC 2822 or unix epoch format.
320
+ # end - [String] The ending date. Should be in RFC 2822 or unix epoch format
321
+ # resolution - [String] Can be either hour, day or month. Default: day
322
+ # duration - [String] Period of time with resoluton encoded
323
+ #
324
+ # Returns [Array] A list of domains (hash)
325
+ def get_domain_stats(domain, options = {})
326
+ fail(ParameterError, 'No domain given to list stats on Mailgun', caller) unless domain
327
+ @client.get("#{domain}/stats/total", options).to_h
328
+ end
101
329
  end
102
330
  end
@@ -116,6 +116,14 @@ module Mailgun
116
116
  body_html(html_body)
117
117
  end
118
118
 
119
+ # Set an AMP part for the message object
120
+ #
121
+ # @param [String] amp The AMP HTML for the email.
122
+ # @return [void]
123
+ def amp_html(amp = nil)
124
+ set_single('amp-html', amp)
125
+ end
126
+
119
127
  # Adds a series of attachments, when called upon.
120
128
  #
121
129
  # @param [String|File] attachment A file object for attaching as an attachment.
@@ -0,0 +1,120 @@
1
+ require 'mailgun/exceptions/exceptions'
2
+
3
+ module Mailgun
4
+
5
+ # A Mailgun::Tags object is a simple CRUD interface to Mailgun Tags.
6
+ # Uses Mailgun
7
+ class Tags
8
+
9
+ # Public: creates a new Mailgun::Tags instance.
10
+ # Defaults to Mailgun::Client
11
+ def initialize(client = Mailgun::Client.new)
12
+ @client = client
13
+ end
14
+
15
+ # Public: Get Tags
16
+ #
17
+ # domain - [String] Domain name where tag is stored
18
+ # options - [Hash] of
19
+ # limit - [Integer] Number of entries to return. Default: 100.
20
+ #
21
+ # Returns [Array] A list of tags (hash)
22
+ def get_tags(domain, options = {})
23
+ fail(ParameterError, 'No domain given to store template on', caller) unless domain
24
+ @client.get("#{domain}/tags", options).to_h['items']
25
+ end
26
+
27
+ # Public: Get tag information
28
+ #
29
+ # domain - [String] Domain name where tag is stored
30
+ # tag - [String] Tag name to lookup for
31
+ #
32
+ # Returns [Hash] Information on the requested tag.
33
+ def get_tag(domain, tag)
34
+ fail(ParameterError, 'No domain given to find on Mailgun', caller) unless domain
35
+ fail(ParameterError, 'No tag name given to find on provided domain', caller) unless tag
36
+ @client.get("#{domain}/tags/#{tag}").to_h!
37
+ end
38
+
39
+ # Public: Updates a given tag with the information provided
40
+ #
41
+ # domain - [String] Domain name where tag is stored
42
+ # tag - [String] Tag name to lookup for
43
+ # options - [Hash] of
44
+ # description - [String] Updated description of the tag
45
+ #
46
+ # Returns [Boolean] if successful or not
47
+ def update(domain, tag, options = {})
48
+ fail(ParameterError, 'No domain given to find on Mailgun', caller) unless domain
49
+ fail(ParameterError, 'No tag name given to find on provided domain', caller) unless tag
50
+ @client.put("#{domain}/tags/#{tag}", options).to_h['message'] == 'Tag updated'
51
+ end
52
+
53
+ # Public: Get statistics for a given tag
54
+ #
55
+ # domain - [String] Domain name where tag is stored
56
+ # tag - [String] Tag name to lookup for
57
+ # options - [Hash] of
58
+ # event - [String] The type of the event. Required. (ex. accepted, delivered, failed, opened)
59
+ # start - [String] The starting time. Should be in RFC 282 or unix epoch format. Default: 7 days from the current time.
60
+ # end - [String] The ending date. Should be in RFC 2822 or unix epoch time in seconds. Default: current time.
61
+ # resolution - [String] Can be either hour, day or month. Default: day
62
+ # duration - [String] Period of time with resolution encoded. If provided, overwrites the start date and resolution.
63
+ #
64
+ # Returns [Hash] of tag stats info
65
+ def get_tag_stats(domain, tag, options = {})
66
+ fail(ParameterError, 'No domain given to find on Mailgun', caller) unless domain
67
+ fail(ParameterError, 'No tag name given to find on provided domain', caller) unless tag
68
+ @client.get("#{domain}/tags/#{tag}/stats", options).to_h
69
+ end
70
+
71
+ # Public: Delete Tag
72
+ # NOTE: Deletes the tag. Note: The statistics for the tag are not destroyed.
73
+ #
74
+ # domain - [String] Domain name where tag is stored
75
+ # tag - [String] Tag name to lookup for
76
+ #
77
+ # Returns [Boolean] if successful or not
78
+ def remove(domain, tag)
79
+ fail(ParameterError, 'No domain given to remove on Mailgun', caller) unless domain
80
+ fail(ParameterError, 'No template name given to find on provided domain', caller) unless tag
81
+ @client.delete("#{domain}/tags/#{tag}").to_h['message'] == 'Tag deleted'
82
+ end
83
+
84
+ # Public: Get a list of countries of origin for a given domain for different event types.
85
+ #
86
+ # domain - [String] Domain name where tag is stored
87
+ # tag - [String] Tag name to lookup for
88
+ #
89
+ # Returns [Hash] of countries of origin for a given domain
90
+ def get_countries_aggregated_stats(domain, tag)
91
+ fail(ParameterError, 'No domain given to find on Mailgun', caller) unless domain
92
+ fail(ParameterError, 'No tag name given to find on provided domain', caller) unless tag
93
+ @client.get("#{domain}/tags/#{tag}/stats/aggregates/countries").to_h
94
+ end
95
+
96
+ # Public: Get a list of email providers for a given domain for different event types
97
+ #
98
+ # domain - [String] Domain name where tag is stored
99
+ # tag - [String] Tag name to lookup for
100
+ #
101
+ # Returns [Hash] of email providers for a given domain
102
+ def get_providers_aggregated_stats(domain, tag)
103
+ fail(ParameterError, 'No domain given to find on Mailgun', caller) unless domain
104
+ fail(ParameterError, 'No tag name given to find on provided domain', caller) unless tag
105
+ @client.get("#{domain}/tags/#{tag}/stats/aggregates/providers").to_h
106
+ end
107
+
108
+ # Public: Get a list of devices for a given domain that have triggered event types.
109
+ #
110
+ # domain - [String] Domain name where tag is stored
111
+ # tag - [String] Tag name to lookup for
112
+ #
113
+ # Returns [Hash] of devices for a given domain
114
+ def get_devices_aggregated_stats(domain, tag)
115
+ fail(ParameterError, 'No domain given to find on Mailgun', caller) unless domain
116
+ fail(ParameterError, 'No tag name given to find on provided domain', caller) unless tag
117
+ @client.get("#{domain}/tags/#{tag}/stats/aggregates/devices").to_h
118
+ end
119
+ end
120
+ end
@@ -1,4 +1,4 @@
1
1
  # It's the version. Yeay!
2
2
  module Mailgun
3
- VERSION = '1.2.13'
3
+ VERSION = '1.2.14'
4
4
  end
@@ -3,6 +3,7 @@ module Mailgun
3
3
  # A Mailgun::Webhooks object is a simple CRUD interface to Mailgun Webhooks.
4
4
  # Uses Mailgun
5
5
  class Webhooks
6
+ ACTIONS = %w(accepted clicked complained delivered opened permanent_fail temporary_fail unsubscribed).freeze
6
7
 
7
8
  # Public creates a new Mailgun::Webhooks instance.
8
9
  # Defaults to Mailgun::Client
@@ -31,7 +32,7 @@ module Mailgun
31
32
  # empty String if one is not set
32
33
  def info(domain, action)
33
34
  res = @client.get("domains/#{domain}/webhooks/#{action}")
34
- res.to_h['webhook']['url'] || ''
35
+ res.to_h['webhook']['urls'] || ''
35
36
  rescue NoMethodError
36
37
  ''
37
38
  end
@@ -46,7 +47,7 @@ module Mailgun
46
47
  # Returns a Boolean of whether the webhook was created
47
48
  def create(domain, action, url = '')
48
49
  res = @client.post("domains/#{domain}/webhooks", id: action, url: url)
49
- res.to_h['webhook']['url'] == url && res.to_h['message'] == 'Webhook has been created'
50
+ res.to_h['webhook']['urls'].include?(url) && res.to_h['message'] == 'Webhook has been created'
50
51
  end
51
52
  alias_method :add, :create
52
53
  alias_method :add_webhook, :create
@@ -58,7 +59,7 @@ module Mailgun
58
59
  #
59
60
  # Returns true or false
60
61
  def create_all(domain, url = '')
61
- %w(accepted clicked complained delivered opened permanent_fail temporary_fail unsubscribed).each do |action|
62
+ ACTIONS.each do |action|
62
63
  add_webhook domain, action, url
63
64
  end
64
65
  true
@@ -67,6 +68,21 @@ module Mailgun
67
68
  end
68
69
  alias_method :add_all_webhooks, :create_all
69
70
 
71
+ # Public: Update webhook
72
+ #
73
+ # domain - A String of the domain name (ex. domain.com)
74
+ # action - A String of the action to create a webhook for
75
+ # url - A String of the url of the webhook
76
+ #
77
+ # Returns a Boolean of whether the webhook was updated
78
+ def update(domain, action, url = '')
79
+ fail Mailgun::ParameterError('Domain not provided to update webhooks') unless domain
80
+ fail Mailgun::ParameterError('Action not provided to identify webhook to update') unless action
81
+ res = @client.put("domains/#{domain}/webhooks/#{action}", id: action, url: url)
82
+ res.to_h['webhook']['urls'] == url && res.to_h['message'] == 'Webhook has been updated'
83
+ end
84
+ alias_method :update_webhook, :update
85
+
70
86
  # Public: Delete a specific webhook
71
87
  #
72
88
  # domain - The required String of domain name
@@ -90,7 +106,7 @@ module Mailgun
90
106
  # Returns a Boolean on the success
91
107
  def remove_all(domain)
92
108
  fail Mailgun::ParameterError('Domain not provided to remove webhooks from') unless domain
93
- %w(accepted clicked complained delivered opened permanent_fail temporary_fail unsubscribed).each do |action|
109
+ ACTIONS.each do |action|
94
110
  delete_webhook domain, action
95
111
  end
96
112
  end
data/lib/mailgun.rb CHANGED
@@ -17,6 +17,7 @@ require 'mailgun/domains/domains'
17
17
  require 'mailgun/webhooks/webhooks'
18
18
  require 'mailgun/templates/templates'
19
19
  require 'mailgun/subaccounts/subaccounts'
20
+ require 'mailgun/tags/tags'
20
21
 
21
22
  # Module for interacting with the sweet Mailgun API.
22
23
  #
@@ -173,6 +173,7 @@ module Railgun
173
173
  mb.subject mail.subject
174
174
  mb.body_html extract_body_html(mail)
175
175
  mb.body_text extract_body_text(mail)
176
+ mb.amp_html extract_amp_html(mail)
176
177
 
177
178
  [:to, :cc, :bcc].each do |rcpt_type|
178
179
  addrs = mail[rcpt_type] || nil
@@ -232,6 +233,20 @@ module Railgun
232
233
  end
233
234
  end
234
235
 
236
+ # Returns the decoded AMP HTML from the Mail::Message object if it is available,
237
+ # otherwise nil.
238
+ #
239
+ # @param [Mail::Message] mail message to transform
240
+ #
241
+ # @return [String]
242
+ def extract_amp_html(mail)
243
+ begin
244
+ retrieve_amp_part(mail).body.decoded || nil
245
+ rescue
246
+ nil
247
+ end
248
+ end
249
+
235
250
  # Returns the mail object from the Mail::Message object if text part exists,
236
251
  # (decomposing multipart into individual format if necessary)
237
252
  # otherwise nil.
@@ -255,4 +270,18 @@ module Railgun
255
270
  return mail.html_part if mail.multipart?
256
271
  (mail.mime_type =~ /^text\/html$/i) && mail
257
272
  end
273
+
274
+ # Returns the mail object from the Mail::Message object if AMP part exists,
275
+ # (decomposing multipart into individual format if necessary)
276
+ # otherwise nil.
277
+ #
278
+ # @param [Mail::Message] mail message to transform
279
+ #
280
+ # @return [Mail::Message] mail message with its content-type = text/x-amp-html
281
+ def retrieve_amp_part(mail)
282
+ # AMP emails should always be multipart, with an HTML fallback.
283
+ return unless mail.multipart?
284
+
285
+ mail.find_first_mime_type('text/x-amp-html')
286
+ end
258
287
  end