mailgun-ruby 1.2.13 → 1.2.14

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 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