mailgunner 2.5.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGES.md +214 -0
- data/LICENSE.txt +1 -1
- data/README.md +25 -25
- data/lib/mailgunner.rb +20 -376
- data/lib/mailgunner/client.rb +73 -0
- data/lib/mailgunner/client/domains.rb +77 -0
- data/lib/mailgunner/client/email_validation.rb +25 -0
- data/lib/mailgunner/client/events.rb +9 -0
- data/lib/mailgunner/client/ips.rb +25 -0
- data/lib/mailgunner/client/mailing_lists.rb +45 -0
- data/lib/mailgunner/client/messages.rb +29 -0
- data/lib/mailgunner/client/routes.rb +25 -0
- data/lib/mailgunner/client/stats.rb +9 -0
- data/lib/mailgunner/client/suppressions.rb +73 -0
- data/lib/mailgunner/client/tags.rb +25 -0
- data/lib/mailgunner/client/webhooks.rb +25 -0
- data/lib/mailgunner/config.rb +45 -0
- data/lib/mailgunner/delivery_method.rb +4 -2
- 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 +9 -8
- metadata +30 -83
- data/spec/mailgunner_delivery_method_spec.rb +0 -37
- data/spec/mailgunner_spec.rb +0 -819
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'net/http'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Mailgunner
|
6
|
+
class Client
|
7
|
+
def initialize(domain: nil, api_key: nil, api_host: nil)
|
8
|
+
@domain = domain || Mailgunner.config.domain
|
9
|
+
|
10
|
+
@api_key = api_key || Mailgunner.config.api_key
|
11
|
+
|
12
|
+
@api_host = api_host || Mailgunner.config.api_host
|
13
|
+
|
14
|
+
@http = Net::HTTP.new(@api_host, Net::HTTP.https_default_port)
|
15
|
+
|
16
|
+
@http.use_ssl = true
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
ATTRIBUTES = PARAMS = HEADERS = {}.freeze
|
22
|
+
|
23
|
+
def get(path, query: PARAMS, headers: HEADERS)
|
24
|
+
uri = URI(path)
|
25
|
+
uri.query = Params.encode(query) unless query.empty?
|
26
|
+
|
27
|
+
request = Net::HTTP::Get.new(uri.to_s)
|
28
|
+
|
29
|
+
headers.each { |k, v| request[k] = v }
|
30
|
+
|
31
|
+
transmit(request)
|
32
|
+
end
|
33
|
+
|
34
|
+
def post(path, attributes = ATTRIBUTES)
|
35
|
+
transmit(Net::HTTP::Post.new(path)) { |message| message.set_form_data(attributes) }
|
36
|
+
end
|
37
|
+
|
38
|
+
def multipart_post(path, data)
|
39
|
+
transmit(Net::HTTP::Post.new(path)) { |message| message.set_form(data, 'multipart/form-data') }
|
40
|
+
end
|
41
|
+
|
42
|
+
def put(path, attributes = ATTRIBUTES)
|
43
|
+
transmit(Net::HTTP::Put.new(path)) { |message| message.set_form_data(attributes) }
|
44
|
+
end
|
45
|
+
|
46
|
+
def delete(path)
|
47
|
+
transmit(Net::HTTP::Delete.new(path))
|
48
|
+
end
|
49
|
+
|
50
|
+
def transmit(message)
|
51
|
+
message.basic_auth('api', @api_key)
|
52
|
+
message['User-Agent'] = Mailgunner.config.user_agent
|
53
|
+
|
54
|
+
yield message if block_given?
|
55
|
+
|
56
|
+
response = @http.request(message)
|
57
|
+
|
58
|
+
unless response.is_a?(Net::HTTPSuccess)
|
59
|
+
raise Error.parse(response)
|
60
|
+
end
|
61
|
+
|
62
|
+
if response['Content-Type']&.start_with?('application/json')
|
63
|
+
return JSON.parse(response.body, object_class: Struct)
|
64
|
+
end
|
65
|
+
|
66
|
+
response.body
|
67
|
+
end
|
68
|
+
|
69
|
+
def escape(component)
|
70
|
+
Params.escape(component)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mailgunner
|
4
|
+
class Client
|
5
|
+
def get_domains(params = PARAMS)
|
6
|
+
get('/v3/domains', query: params)
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_domain(name)
|
10
|
+
get("/v3/domains/#{escape name}")
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_domain(attributes = ATTRIBUTES)
|
14
|
+
post('/v3/domains', attributes)
|
15
|
+
end
|
16
|
+
|
17
|
+
def delete_domain(name)
|
18
|
+
delete("/v3/domains/#{escape name}")
|
19
|
+
end
|
20
|
+
|
21
|
+
def verify_domain(name)
|
22
|
+
put("/v3/domains/#{escape name}/verify")
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_credentials
|
26
|
+
get("/v3/domains/#{escape @domain}/credentials")
|
27
|
+
end
|
28
|
+
|
29
|
+
def add_credentials(attributes)
|
30
|
+
post("/v3/domains/#{escape @domain}/credentials", attributes)
|
31
|
+
end
|
32
|
+
|
33
|
+
def update_credentials(login, attributes)
|
34
|
+
put("/v3/domains/#{escape @domain}/credentials/#{escape login}", attributes)
|
35
|
+
end
|
36
|
+
|
37
|
+
def delete_credentials(login)
|
38
|
+
delete("/v3/domains/#{escape @domain}/credentials/#{escape login}")
|
39
|
+
end
|
40
|
+
|
41
|
+
def get_connection_settings
|
42
|
+
get("/v3/domains/#{escape @domain}/connection")
|
43
|
+
end
|
44
|
+
|
45
|
+
def update_connection_settings(attributes)
|
46
|
+
put("/v3/domains/#{escape @domain}/connection", attributes)
|
47
|
+
end
|
48
|
+
|
49
|
+
def get_tracking_settings
|
50
|
+
get("/v3/domains/#{escape @domain}/tracking")
|
51
|
+
end
|
52
|
+
|
53
|
+
def update_open_tracking_settings(params = PARAMS)
|
54
|
+
put("/v3/domains/#{escape @domain}/tracking/open", params)
|
55
|
+
end
|
56
|
+
|
57
|
+
def update_click_tracking_settings(params = PARAMS)
|
58
|
+
put("/v3/domains/#{escape @domain}/tracking/click", params)
|
59
|
+
end
|
60
|
+
|
61
|
+
def update_unsubscribe_tracking_settings(params = PARAMS)
|
62
|
+
put("/v3/domains/#{escape @domain}/tracking/unsubscribe", params)
|
63
|
+
end
|
64
|
+
|
65
|
+
def update_dkim_authority(params = PARAMS)
|
66
|
+
put("/v3/domains/#{escape @domain}/dkim_authority", params)
|
67
|
+
end
|
68
|
+
|
69
|
+
def update_dkim_selector(params = PARAMS)
|
70
|
+
put("/v3/domains/#{escape @domain}/dkim_selector", params)
|
71
|
+
end
|
72
|
+
|
73
|
+
def update_web_prefix(params = PARAMS)
|
74
|
+
put("/v3/domains/#{escape @domain}/web_prefix", params)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mailgunner
|
4
|
+
class Client
|
5
|
+
def validate_address(value)
|
6
|
+
get('/v4/address/validate', query: {address: value})
|
7
|
+
end
|
8
|
+
|
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}")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mailgunner
|
4
|
+
class Client
|
5
|
+
def get_all_ips(params = PARAMS)
|
6
|
+
get('/v3/ips', query: params)
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_ip(address)
|
10
|
+
get("/v3/ips/#{escape address}")
|
11
|
+
end
|
12
|
+
|
13
|
+
def get_ips
|
14
|
+
get("/v3/domains/#{escape @domain}/ips")
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_ip(address)
|
18
|
+
post("/v3/domains/#{escape @domain}/ips", ip: address)
|
19
|
+
end
|
20
|
+
|
21
|
+
def delete_ip(address)
|
22
|
+
delete("/v3/domains/#{escape @domain}/ips/#{escape address}")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mailgunner
|
4
|
+
class Client
|
5
|
+
def get_lists(params = PARAMS)
|
6
|
+
get('/v3/lists/pages', query: params)
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_list(address)
|
10
|
+
get("/v3/lists/#{escape address}")
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_list(attributes = ATTRIBUTES)
|
14
|
+
post('/v3/lists', attributes)
|
15
|
+
end
|
16
|
+
|
17
|
+
def update_list(address, attributes = ATTRIBUTES)
|
18
|
+
put("/v3/lists/#{escape address}", attributes)
|
19
|
+
end
|
20
|
+
|
21
|
+
def delete_list(address)
|
22
|
+
delete("/v3/lists/#{escape address}")
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_list_members(list_address, params = PARAMS)
|
26
|
+
get("/v3/lists/#{escape list_address}/members/pages", query: params)
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_list_member(list_address, member_address)
|
30
|
+
get("/v3/lists/#{escape list_address}/members/#{escape member_address}")
|
31
|
+
end
|
32
|
+
|
33
|
+
def add_list_member(list_address, member_attributes)
|
34
|
+
post("/v3/lists/#{escape list_address}/members", member_attributes)
|
35
|
+
end
|
36
|
+
|
37
|
+
def update_list_member(list_address, member_address, member_attributes)
|
38
|
+
put("/v3/lists/#{escape list_address}/members/#{escape member_address}", member_attributes)
|
39
|
+
end
|
40
|
+
|
41
|
+
def delete_list_member(list_address, member_address)
|
42
|
+
delete("/v3/lists/#{escape list_address}/members/#{escape member_address}")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mailgunner
|
4
|
+
class Client
|
5
|
+
def get_message(key)
|
6
|
+
get("/v3/domains/#{escape @domain}/messages/#{escape key}")
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_mime_message(key)
|
10
|
+
get("/v3/domains/#{escape @domain}/messages/#{escape key}", headers: {'Accept' => 'message/rfc2822'})
|
11
|
+
end
|
12
|
+
|
13
|
+
def send_message(attributes = ATTRIBUTES)
|
14
|
+
post("/v3/#{escape @domain}/messages", attributes)
|
15
|
+
end
|
16
|
+
|
17
|
+
def send_mime(mail)
|
18
|
+
to = ['to', Array(mail.destinations).join(',')]
|
19
|
+
|
20
|
+
message = ['message', mail.encoded, {filename: 'message.mime'}]
|
21
|
+
|
22
|
+
multipart_post("/v3/#{escape @domain}/messages.mime", [to, message])
|
23
|
+
end
|
24
|
+
|
25
|
+
def delete_message(key)
|
26
|
+
delete("/v3/domains/#{escape @domain}/messages/#{escape key}")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mailgunner
|
4
|
+
class Client
|
5
|
+
def get_routes(params = PARAMS)
|
6
|
+
get('/v3/routes', query: params)
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_route(id)
|
10
|
+
get("/v3/routes/#{escape id}")
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_route(attributes = ATTRIBUTES)
|
14
|
+
post('/v3/routes', attributes)
|
15
|
+
end
|
16
|
+
|
17
|
+
def update_route(id, attributes = ATTRIBUTES)
|
18
|
+
put("/v3/routes/#{escape id}", attributes)
|
19
|
+
end
|
20
|
+
|
21
|
+
def delete_route(id)
|
22
|
+
delete("/v3/routes/#{escape id}")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mailgunner
|
4
|
+
class Client
|
5
|
+
def get_bounces(params = PARAMS)
|
6
|
+
get("/v3/#{escape @domain}/bounces", query: params)
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_bounce(address)
|
10
|
+
get("/v3/#{escape @domain}/bounces/#{escape address}")
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_bounce(attributes = ATTRIBUTES)
|
14
|
+
post("/v3/#{escape @domain}/bounces", attributes)
|
15
|
+
end
|
16
|
+
|
17
|
+
def delete_bounce(address)
|
18
|
+
delete("/v3/#{escape @domain}/bounces/#{escape address}")
|
19
|
+
end
|
20
|
+
|
21
|
+
def delete_bounces
|
22
|
+
delete("/v3/#{escape @domain}/bounces")
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_unsubscribes(params = PARAMS)
|
26
|
+
get("/v3/#{escape @domain}/unsubscribes", query: params)
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_unsubscribe(address)
|
30
|
+
get("/v3/#{escape @domain}/unsubscribes/#{escape address}")
|
31
|
+
end
|
32
|
+
|
33
|
+
def delete_unsubscribe(address_or_id)
|
34
|
+
delete("/v3/#{escape @domain}/unsubscribes/#{escape address_or_id}")
|
35
|
+
end
|
36
|
+
|
37
|
+
def add_unsubscribe(attributes = ATTRIBUTES)
|
38
|
+
post("/v3/#{escape @domain}/unsubscribes", attributes)
|
39
|
+
end
|
40
|
+
|
41
|
+
def get_complaints(params = PARAMS)
|
42
|
+
get("/v3/#{escape @domain}/complaints", query: params)
|
43
|
+
end
|
44
|
+
|
45
|
+
def get_complaint(address)
|
46
|
+
get("/v3/#{escape @domain}/complaints/#{escape address}")
|
47
|
+
end
|
48
|
+
|
49
|
+
def add_complaint(attributes = ATTRIBUTES)
|
50
|
+
post("/v3/#{escape @domain}/complaints", attributes)
|
51
|
+
end
|
52
|
+
|
53
|
+
def delete_complaint(address)
|
54
|
+
delete("/v3/#{escape @domain}/complaints/#{escape address}")
|
55
|
+
end
|
56
|
+
|
57
|
+
def get_whitelists(params = PARAMS)
|
58
|
+
get("/v3/#{escape @domain}/whitelists", query: 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
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mailgunner
|
4
|
+
class Client
|
5
|
+
def get_tags(params = PARAMS)
|
6
|
+
get("/v3/#{escape @domain}/tags", query: params)
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_tag(id)
|
10
|
+
get("/v3/#{escape @domain}/tags/#{escape id}")
|
11
|
+
end
|
12
|
+
|
13
|
+
def update_tag(id, attributes)
|
14
|
+
put("/v3/#{escape @domain}/tags/#{escape id}", attributes)
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_tag_stats(id, params)
|
18
|
+
get("/v3/#{escape @domain}/tags/#{escape id}/stats", query: params)
|
19
|
+
end
|
20
|
+
|
21
|
+
def delete_tag(id)
|
22
|
+
delete("/v3/#{escape @domain}/tags/#{escape id}")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mailgunner
|
4
|
+
class Client
|
5
|
+
def get_webhooks
|
6
|
+
get("/v3/domains/#{escape @domain}/webhooks")
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_webhook(id)
|
10
|
+
get("/v3/domains/#{escape @domain}/webhooks/#{escape id}")
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_webhook(attributes = ATTRIBUTES)
|
14
|
+
post("/v3/domains/#{escape @domain}/webhooks", attributes)
|
15
|
+
end
|
16
|
+
|
17
|
+
def update_webhook(id, attributes = ATTRIBUTES)
|
18
|
+
put("/v3/domains/#{escape @domain}/webhooks/#{escape id}", attributes)
|
19
|
+
end
|
20
|
+
|
21
|
+
def delete_webhook(id)
|
22
|
+
delete("/v3/domains/#{escape @domain}/webhooks/#{escape id}")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|