mailgunner 2.6.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +12 -30
- data/lib/mailgunner.rb +13 -0
- data/lib/mailgunner/client.rb +19 -48
- data/lib/mailgunner/client/domains.rb +19 -3
- data/lib/mailgunner/client/email_validation.rb +15 -3
- data/lib/mailgunner/client/events.rb +2 -2
- data/lib/mailgunner/client/ips.rb +2 -2
- data/lib/mailgunner/client/mailing_lists.rb +6 -6
- data/lib/mailgunner/client/messages.rb +2 -2
- data/lib/mailgunner/client/routes.rb +4 -4
- data/lib/mailgunner/client/stats.rb +2 -8
- data/lib/mailgunner/client/suppressions.rb +25 -9
- data/lib/mailgunner/client/tags.rb +3 -3
- data/lib/mailgunner/client/webhooks.rb +2 -2
- data/lib/mailgunner/config.rb +45 -0
- data/lib/mailgunner/delivery_method.rb +1 -0
- data/lib/mailgunner/errors.rb +25 -7
- data/lib/mailgunner/params.rb +16 -0
- data/lib/mailgunner/railtie.rb +1 -0
- data/lib/mailgunner/struct.rb +49 -0
- data/lib/mailgunner/version.rb +1 -1
- data/mailgunner.gemspec +6 -4
- metadata +38 -10
- data/spec/mailgunner_delivery_method_spec.rb +0 -37
- data/spec/mailgunner_spec.rb +0 -747
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a596ae861173d54342b029a7c17985553cc7f7222722ec55e05e0344beacf08f
|
4
|
+
data.tar.gz: 481ac3d5b13702ca41598db5868d8b12c4f7a6302264bb216937938c60e1b3c7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eb7904e35154121959f7c7f392c72b6f472579ea02baec660487203674b601d9cedb039800fb0847f097f94283d93e52088c6bb00eb3641ce22d7643204f7e38
|
7
|
+
data.tar.gz: 3eb5b428d621fee6ea3605353869e479e8b765e858e1fe1f3e596ebcf7a095f0892d292be22e9cf956f6d9e5e294ec79dd6300b8addf193d36a01584af94bf43
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -11,20 +11,20 @@ Ruby client for the [Mailgun API](https://documentation.mailgun.com/en/latest/ap
|
|
11
11
|
$ gem install mailgunner
|
12
12
|
|
13
13
|
|
14
|
-
##
|
14
|
+
## Usage
|
15
15
|
|
16
16
|
```ruby
|
17
17
|
require 'mailgunner'
|
18
18
|
|
19
|
-
|
20
|
-
domain
|
21
|
-
api_key
|
22
|
-
|
19
|
+
Mailgunner.configure do |config|
|
20
|
+
config.domain = 'samples.mailgun.org'
|
21
|
+
config.api_key = 'key-3ax6xnjp29jd6fds4gc373sgvjxteol0'
|
22
|
+
end
|
23
23
|
|
24
|
-
|
24
|
+
mailgun = Mailgunner::Client.new
|
25
25
|
|
26
|
-
|
27
|
-
|
26
|
+
mailgun.get_domains.items.each do |item|
|
27
|
+
puts "#{item.id} #{item.name}"
|
28
28
|
end
|
29
29
|
```
|
30
30
|
|
@@ -62,30 +62,12 @@ Outside of Rails you can set `ActionMailer::Base.delivery_method` directly.
|
|
62
62
|
|
63
63
|
## Specifying the region
|
64
64
|
|
65
|
-
Mailgun offers both a US and EU region to send your
|
65
|
+
Mailgun offers both a US and EU region to send your email from. Mailgunner uses
|
66
66
|
the US region by default. If you wish to use the EU region set the `api_host`
|
67
67
|
config option like so:
|
68
68
|
|
69
69
|
```ruby
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
api_host: 'api.eu.mailgun.net'
|
74
|
-
})
|
75
|
-
```
|
76
|
-
|
77
|
-
|
78
|
-
## Email validation
|
79
|
-
|
80
|
-
If you only need to use Mailgun's [email address validation service](http://documentation.mailgun.com/api-email-validation.html),
|
81
|
-
you can instead use your Mailgun public key to authenticate like this:
|
82
|
-
|
83
|
-
```ruby
|
84
|
-
require 'mailgunner'
|
85
|
-
|
86
|
-
public_key = 'pubkey-5ogiflzbnjrljiky49qxsiozqef5jxp7'
|
87
|
-
|
88
|
-
mailgun = Mailgunner::Client.new(api_key: public_key)
|
89
|
-
|
90
|
-
response = mailgun.validate_address('john@gmail.com')
|
70
|
+
Mailgunner.configure do |config|
|
71
|
+
config.api_host = 'api.eu.mailgun.net'
|
72
|
+
end
|
91
73
|
```
|
data/lib/mailgunner.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
require 'mailgunner/version'
|
2
2
|
require 'mailgunner/errors'
|
3
|
+
require 'mailgunner/params'
|
4
|
+
require 'mailgunner/config'
|
5
|
+
require 'mailgunner/struct'
|
3
6
|
require 'mailgunner/client'
|
4
7
|
require 'mailgunner/client/domains'
|
5
8
|
require 'mailgunner/client/email_validation'
|
@@ -14,3 +17,13 @@ require 'mailgunner/client/tags'
|
|
14
17
|
require 'mailgunner/client/webhooks'
|
15
18
|
require 'mailgunner/delivery_method' if defined?(Mail)
|
16
19
|
require 'mailgunner/railtie' if defined?(Rails)
|
20
|
+
|
21
|
+
module Mailgunner
|
22
|
+
def self.config
|
23
|
+
@config ||= Config.new
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.configure
|
27
|
+
yield config
|
28
|
+
end
|
29
|
+
end
|
data/lib/mailgunner/client.rb
CHANGED
@@ -1,18 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require 'net/http'
|
3
3
|
require 'json'
|
4
|
-
require 'cgi'
|
5
4
|
|
6
5
|
module Mailgunner
|
7
6
|
class Client
|
8
|
-
|
7
|
+
def initialize(domain: nil, api_key: nil, api_host: nil)
|
8
|
+
@domain = domain || Mailgunner.config.domain
|
9
9
|
|
10
|
-
|
11
|
-
@domain = options.fetch(:domain) { default_domain }
|
10
|
+
@api_key = api_key || Mailgunner.config.api_key
|
12
11
|
|
13
|
-
@
|
14
|
-
|
15
|
-
@api_host = options.fetch(:api_host) { 'api.mailgun.net' }
|
12
|
+
@api_host = api_host || Mailgunner.config.api_host
|
16
13
|
|
17
14
|
@http = Net::HTTP.new(@api_host, Net::HTTP.https_default_port)
|
18
15
|
|
@@ -21,21 +18,20 @@ module Mailgunner
|
|
21
18
|
|
22
19
|
private
|
23
20
|
|
24
|
-
|
25
|
-
return NoDomainProvided unless ENV.key?('MAILGUN_SMTP_LOGIN')
|
21
|
+
ATTRIBUTES = PARAMS = HEADERS = {}.freeze
|
26
22
|
|
27
|
-
|
28
|
-
|
23
|
+
def get(path, query: PARAMS, headers: HEADERS)
|
24
|
+
uri = URI(path)
|
25
|
+
uri.query = Params.encode(query) unless query.empty?
|
29
26
|
|
30
|
-
|
31
|
-
request = Net::HTTP::Get.new(request_uri(path, params))
|
27
|
+
request = Net::HTTP::Get.new(uri.to_s)
|
32
28
|
|
33
29
|
headers.each { |k, v| request[k] = v }
|
34
30
|
|
35
31
|
transmit(request)
|
36
32
|
end
|
37
33
|
|
38
|
-
def post(path, attributes =
|
34
|
+
def post(path, attributes = ATTRIBUTES)
|
39
35
|
transmit(Net::HTTP::Post.new(path)) { |message| message.set_form_data(attributes) }
|
40
36
|
end
|
41
37
|
|
@@ -43,7 +39,7 @@ module Mailgunner
|
|
43
39
|
transmit(Net::HTTP::Post.new(path)) { |message| message.set_form(data, 'multipart/form-data') }
|
44
40
|
end
|
45
41
|
|
46
|
-
def put(path, attributes =
|
42
|
+
def put(path, attributes = ATTRIBUTES)
|
47
43
|
transmit(Net::HTTP::Put.new(path)) { |message| message.set_form_data(attributes) }
|
48
44
|
end
|
49
45
|
|
@@ -51,52 +47,27 @@ module Mailgunner
|
|
51
47
|
transmit(Net::HTTP::Delete.new(path))
|
52
48
|
end
|
53
49
|
|
54
|
-
USER_AGENT = "Ruby/#{RUBY_VERSION} Mailgunner/#{VERSION}"
|
55
|
-
|
56
50
|
def transmit(message)
|
57
51
|
message.basic_auth('api', @api_key)
|
58
|
-
message['User-Agent'] =
|
52
|
+
message['User-Agent'] = Mailgunner.config.user_agent
|
59
53
|
|
60
54
|
yield message if block_given?
|
61
55
|
|
62
|
-
|
63
|
-
end
|
56
|
+
response = @http.request(message)
|
64
57
|
|
65
|
-
|
66
|
-
|
67
|
-
when Net::HTTPSuccess
|
68
|
-
parse_success(response)
|
69
|
-
when Net::HTTPUnauthorized
|
70
|
-
raise AuthenticationError, "HTTP #{response.code}"
|
71
|
-
when Net::HTTPClientError
|
72
|
-
raise ClientError, "HTTP #{response.code}"
|
73
|
-
when Net::HTTPServerError
|
74
|
-
raise ServerError, "HTTP #{response.code}"
|
75
|
-
else
|
76
|
-
raise Error, "HTTP #{response.code}"
|
58
|
+
unless response.is_a?(Net::HTTPSuccess)
|
59
|
+
raise Error.parse(response)
|
77
60
|
end
|
78
|
-
end
|
79
61
|
|
80
|
-
|
81
|
-
|
62
|
+
if response['Content-Type']&.start_with?('application/json')
|
63
|
+
return JSON.parse(response.body, object_class: Struct)
|
64
|
+
end
|
82
65
|
|
83
66
|
response.body
|
84
67
|
end
|
85
68
|
|
86
|
-
def json?(response)
|
87
|
-
content_type = response['Content-Type']
|
88
|
-
|
89
|
-
content_type && content_type.split(';').first == 'application/json'
|
90
|
-
end
|
91
|
-
|
92
|
-
def request_uri(path, params)
|
93
|
-
return path if params.empty?
|
94
|
-
|
95
|
-
path + '?' + params.flat_map { |k, vs| Array(vs).map { |v| "#{escape(k)}=#{escape(v)}" } }.join('&')
|
96
|
-
end
|
97
|
-
|
98
69
|
def escape(component)
|
99
|
-
|
70
|
+
Params.escape(component)
|
100
71
|
end
|
101
72
|
end
|
102
73
|
end
|
@@ -2,15 +2,15 @@
|
|
2
2
|
|
3
3
|
module Mailgunner
|
4
4
|
class Client
|
5
|
-
def get_domains(params =
|
6
|
-
get('/v3/domains', params)
|
5
|
+
def get_domains(params = PARAMS)
|
6
|
+
get('/v3/domains', query: params)
|
7
7
|
end
|
8
8
|
|
9
9
|
def get_domain(name)
|
10
10
|
get("/v3/domains/#{escape name}")
|
11
11
|
end
|
12
12
|
|
13
|
-
def add_domain(attributes =
|
13
|
+
def add_domain(attributes = ATTRIBUTES)
|
14
14
|
post('/v3/domains', attributes)
|
15
15
|
end
|
16
16
|
|
@@ -41,5 +41,21 @@ module Mailgunner
|
|
41
41
|
def update_connection_settings(attributes)
|
42
42
|
put("/v3/domains/#{escape @domain}/connection", attributes)
|
43
43
|
end
|
44
|
+
|
45
|
+
def get_tracking_settings
|
46
|
+
get("/v3/domains/#{escape @domain}/tracking")
|
47
|
+
end
|
48
|
+
|
49
|
+
def update_open_tracking_settings(params = PARAMS)
|
50
|
+
put("/v3/domains/#{escape @domain}/tracking/open", params)
|
51
|
+
end
|
52
|
+
|
53
|
+
def update_click_tracking_settings(params = PARAMS)
|
54
|
+
put("/v3/domains/#{escape @domain}/tracking/click", params)
|
55
|
+
end
|
56
|
+
|
57
|
+
def update_unsubscribe_tracking_settings(params = PARAMS)
|
58
|
+
put("/v3/domains/#{escape @domain}/tracking/unsubscribe", params)
|
59
|
+
end
|
44
60
|
end
|
45
61
|
end
|
@@ -3,11 +3,23 @@
|
|
3
3
|
module Mailgunner
|
4
4
|
class Client
|
5
5
|
def validate_address(value)
|
6
|
-
get('/
|
6
|
+
get('/v4/address/validate', query: {address: value})
|
7
7
|
end
|
8
8
|
|
9
|
-
def
|
10
|
-
get('/
|
9
|
+
def get_bulk_validations
|
10
|
+
get('/v4/address/validate/bulk')
|
11
|
+
end
|
12
|
+
|
13
|
+
def create_bulk_validation(list_id)
|
14
|
+
post("/v4/address/validate/bulk/#{escape list_id}")
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_bulk_validation(list_id)
|
18
|
+
get("/v4/address/validate/bulk/#{escape list_id}")
|
19
|
+
end
|
20
|
+
|
21
|
+
def cancel_bulk_validation(list_id)
|
22
|
+
delete("/v4/address/validate/bulk/#{escape list_id}")
|
11
23
|
end
|
12
24
|
end
|
13
25
|
end
|
@@ -2,19 +2,19 @@
|
|
2
2
|
|
3
3
|
module Mailgunner
|
4
4
|
class Client
|
5
|
-
def get_lists(params =
|
6
|
-
get('/v3/lists', params)
|
5
|
+
def get_lists(params = PARAMS)
|
6
|
+
get('/v3/lists/pages', query: params)
|
7
7
|
end
|
8
8
|
|
9
9
|
def get_list(address)
|
10
10
|
get("/v3/lists/#{escape address}")
|
11
11
|
end
|
12
12
|
|
13
|
-
def add_list(attributes =
|
13
|
+
def add_list(attributes = ATTRIBUTES)
|
14
14
|
post('/v3/lists', attributes)
|
15
15
|
end
|
16
16
|
|
17
|
-
def update_list(address, attributes =
|
17
|
+
def update_list(address, attributes = ATTRIBUTES)
|
18
18
|
put("/v3/lists/#{escape address}", attributes)
|
19
19
|
end
|
20
20
|
|
@@ -22,8 +22,8 @@ module Mailgunner
|
|
22
22
|
delete("/v3/lists/#{escape address}")
|
23
23
|
end
|
24
24
|
|
25
|
-
def get_list_members(list_address, params =
|
26
|
-
get("/v3/lists/#{escape list_address}/members", params)
|
25
|
+
def get_list_members(list_address, params = PARAMS)
|
26
|
+
get("/v3/lists/#{escape list_address}/members/pages", query: params)
|
27
27
|
end
|
28
28
|
|
29
29
|
def get_list_member(list_address, member_address)
|
@@ -7,10 +7,10 @@ module Mailgunner
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def get_mime_message(key)
|
10
|
-
get("/v3/domains/#{escape @domain}/messages/#{escape key}",
|
10
|
+
get("/v3/domains/#{escape @domain}/messages/#{escape key}", headers: {'Accept' => 'message/rfc2822'})
|
11
11
|
end
|
12
12
|
|
13
|
-
def send_message(attributes =
|
13
|
+
def send_message(attributes = ATTRIBUTES)
|
14
14
|
post("/v3/#{escape @domain}/messages", attributes)
|
15
15
|
end
|
16
16
|
|
@@ -2,19 +2,19 @@
|
|
2
2
|
|
3
3
|
module Mailgunner
|
4
4
|
class Client
|
5
|
-
def get_routes(params =
|
6
|
-
get('/v3/routes', params)
|
5
|
+
def get_routes(params = PARAMS)
|
6
|
+
get('/v3/routes', query: params)
|
7
7
|
end
|
8
8
|
|
9
9
|
def get_route(id)
|
10
10
|
get("/v3/routes/#{escape id}")
|
11
11
|
end
|
12
12
|
|
13
|
-
def add_route(attributes =
|
13
|
+
def add_route(attributes = ATTRIBUTES)
|
14
14
|
post('/v3/routes', attributes)
|
15
15
|
end
|
16
16
|
|
17
|
-
def update_route(id, attributes =
|
17
|
+
def update_route(id, attributes = ATTRIBUTES)
|
18
18
|
put("/v3/routes/#{escape id}", attributes)
|
19
19
|
end
|
20
20
|
|
@@ -2,14 +2,8 @@
|
|
2
2
|
|
3
3
|
module Mailgunner
|
4
4
|
class Client
|
5
|
-
def
|
6
|
-
|
7
|
-
|
8
|
-
get("/v3/#{escape @domain}/stats", params)
|
9
|
-
end
|
10
|
-
|
11
|
-
def get_total_stats(params = {})
|
12
|
-
get("/v3/#{escape @domain}/stats/total", params)
|
5
|
+
def get_total_stats(params = PARAMS)
|
6
|
+
get("/v3/#{escape @domain}/stats/total", query: params)
|
13
7
|
end
|
14
8
|
end
|
15
9
|
end
|
@@ -2,15 +2,15 @@
|
|
2
2
|
|
3
3
|
module Mailgunner
|
4
4
|
class Client
|
5
|
-
def get_bounces(params =
|
6
|
-
get("/v3/#{escape @domain}/bounces", params)
|
5
|
+
def get_bounces(params = PARAMS)
|
6
|
+
get("/v3/#{escape @domain}/bounces", query: params)
|
7
7
|
end
|
8
8
|
|
9
9
|
def get_bounce(address)
|
10
10
|
get("/v3/#{escape @domain}/bounces/#{escape address}")
|
11
11
|
end
|
12
12
|
|
13
|
-
def add_bounce(attributes =
|
13
|
+
def add_bounce(attributes = ATTRIBUTES)
|
14
14
|
post("/v3/#{escape @domain}/bounces", attributes)
|
15
15
|
end
|
16
16
|
|
@@ -22,8 +22,8 @@ module Mailgunner
|
|
22
22
|
delete("/v3/#{escape @domain}/bounces")
|
23
23
|
end
|
24
24
|
|
25
|
-
def get_unsubscribes(params =
|
26
|
-
get("/v3/#{escape @domain}/unsubscribes", params)
|
25
|
+
def get_unsubscribes(params = PARAMS)
|
26
|
+
get("/v3/#{escape @domain}/unsubscribes", query: params)
|
27
27
|
end
|
28
28
|
|
29
29
|
def get_unsubscribe(address)
|
@@ -34,24 +34,40 @@ module Mailgunner
|
|
34
34
|
delete("/v3/#{escape @domain}/unsubscribes/#{escape address_or_id}")
|
35
35
|
end
|
36
36
|
|
37
|
-
def add_unsubscribe(attributes =
|
37
|
+
def add_unsubscribe(attributes = ATTRIBUTES)
|
38
38
|
post("/v3/#{escape @domain}/unsubscribes", attributes)
|
39
39
|
end
|
40
40
|
|
41
|
-
def get_complaints(params =
|
42
|
-
get("/v3/#{escape @domain}/complaints", params)
|
41
|
+
def get_complaints(params = PARAMS)
|
42
|
+
get("/v3/#{escape @domain}/complaints", query: params)
|
43
43
|
end
|
44
44
|
|
45
45
|
def get_complaint(address)
|
46
46
|
get("/v3/#{escape @domain}/complaints/#{escape address}")
|
47
47
|
end
|
48
48
|
|
49
|
-
def add_complaint(attributes =
|
49
|
+
def add_complaint(attributes = ATTRIBUTES)
|
50
50
|
post("/v3/#{escape @domain}/complaints", attributes)
|
51
51
|
end
|
52
52
|
|
53
53
|
def delete_complaint(address)
|
54
54
|
delete("/v3/#{escape @domain}/complaints/#{escape address}")
|
55
55
|
end
|
56
|
+
|
57
|
+
def get_whitelists(params = PARAMS)
|
58
|
+
get("/v3/#{escape @domain}/whitelists", params)
|
59
|
+
end
|
60
|
+
|
61
|
+
def get_whitelist(address_or_domain)
|
62
|
+
get("/v3/#{escape @domain}/whitelists/#{escape address_or_domain}")
|
63
|
+
end
|
64
|
+
|
65
|
+
def add_whitelist(attributes = ATTRIBUTES)
|
66
|
+
post("/v3/#{escape @domain}/whitelists", attributes)
|
67
|
+
end
|
68
|
+
|
69
|
+
def delete_whitelist(address_or_domain)
|
70
|
+
delete("/v3/#{escape @domain}/whitelists/#{escape address_or_domain}")
|
71
|
+
end
|
56
72
|
end
|
57
73
|
end
|