wj-mailgun-ruby 1.1.7
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 +7 -0
- data/.gitignore +23 -0
- data/.rubocop.yml +8 -0
- data/.rubocop_todo.yml +22 -0
- data/.ruby-env.yml.example +12 -0
- data/.ruby-version +1 -0
- data/.travis.yml +24 -0
- data/Gemfile +6 -0
- data/LICENSE +191 -0
- data/README.md +241 -0
- data/Rakefile +35 -0
- data/docs/Domains.md +54 -0
- data/docs/Events.md +46 -0
- data/docs/MessageBuilder.md +105 -0
- data/docs/Messages.md +107 -0
- data/docs/OptInHandler.md +103 -0
- data/docs/Snippets.md +526 -0
- data/docs/Suppressions.md +82 -0
- data/docs/Webhooks.md +40 -0
- data/lib/mailgun-ruby.rb +2 -0
- data/lib/mailgun.rb +39 -0
- data/lib/mailgun/address.rb +45 -0
- data/lib/mailgun/chains.rb +16 -0
- data/lib/mailgun/client.rb +199 -0
- data/lib/mailgun/domains/domains.rb +84 -0
- data/lib/mailgun/events/events.rb +120 -0
- data/lib/mailgun/exceptions/exceptions.rb +65 -0
- data/lib/mailgun/lists/opt_in_handler.rb +58 -0
- data/lib/mailgun/messages/batch_message.rb +125 -0
- data/lib/mailgun/messages/message_builder.rb +413 -0
- data/lib/mailgun/response.rb +62 -0
- data/lib/mailgun/suppressions.rb +270 -0
- data/lib/mailgun/version.rb +4 -0
- data/lib/mailgun/webhooks/webhooks.rb +101 -0
- data/lib/railgun.rb +8 -0
- data/lib/railgun/attachment.rb +56 -0
- data/lib/railgun/errors.rb +27 -0
- data/lib/railgun/mailer.rb +161 -0
- data/lib/railgun/message.rb +17 -0
- data/lib/railgun/railtie.rb +9 -0
- data/mailgun.gemspec +37 -0
- data/spec/integration/bounces_spec.rb +44 -0
- data/spec/integration/campaign_spec.rb +60 -0
- data/spec/integration/complaints_spec.rb +38 -0
- data/spec/integration/domains_spec.rb +39 -0
- data/spec/integration/email_validation_spec.rb +57 -0
- data/spec/integration/events_spec.rb +28 -0
- data/spec/integration/list_members_spec.rb +63 -0
- data/spec/integration/list_spec.rb +58 -0
- data/spec/integration/mailgun_spec.rb +121 -0
- data/spec/integration/messages/sample_data/mime.txt +38 -0
- data/spec/integration/routes_spec.rb +74 -0
- data/spec/integration/stats_spec.rb +15 -0
- data/spec/integration/suppressions_spec.rb +126 -0
- data/spec/integration/unsubscribes_spec.rb +42 -0
- data/spec/integration/webhook_spec.rb +54 -0
- data/spec/spec_helper.rb +45 -0
- data/spec/unit/connection/test_client.rb +99 -0
- data/spec/unit/events/events_spec.rb +50 -0
- data/spec/unit/lists/opt_in_handler_spec.rb +24 -0
- data/spec/unit/mailgun_spec.rb +127 -0
- data/spec/unit/messages/batch_message_spec.rb +131 -0
- data/spec/unit/messages/message_builder_spec.rb +584 -0
- data/spec/unit/messages/sample_data/mailgun_icon.png +0 -0
- data/spec/unit/messages/sample_data/mime.txt +38 -0
- data/spec/unit/messages/sample_data/rackspace_logo.jpg +0 -0
- data/vcr_cassettes/bounces.yml +175 -0
- data/vcr_cassettes/complaints.yml +175 -0
- data/vcr_cassettes/domains.todo.yml +42 -0
- data/vcr_cassettes/domains.yml +360 -0
- data/vcr_cassettes/email_validation.yml +167 -0
- data/vcr_cassettes/events.yml +108 -0
- data/vcr_cassettes/exceptions.yml +45 -0
- data/vcr_cassettes/list_members.yml +320 -0
- data/vcr_cassettes/mailing_list.todo.yml +43 -0
- data/vcr_cassettes/mailing_list.yml +390 -0
- data/vcr_cassettes/routes.yml +359 -0
- data/vcr_cassettes/send_message.yml +107 -0
- data/vcr_cassettes/stats.yml +44 -0
- data/vcr_cassettes/suppressions.yml +676 -0
- data/vcr_cassettes/unsubscribes.yml +191 -0
- data/vcr_cassettes/webhooks.yml +276 -0
- metadata +263 -0
data/Rakefile
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rake'
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
|
5
|
+
desc 'Build Gem'
|
6
|
+
task :build do
|
7
|
+
system 'gem build mailgun.gemspec'
|
8
|
+
end
|
9
|
+
|
10
|
+
desc 'Run unit specs'
|
11
|
+
RSpec::Core::RakeTask.new('spec:unit') do |t|
|
12
|
+
t.rspec_opts = %w(--colour --format documentation)
|
13
|
+
t.pattern = 'spec/unit/*_spec.rb', 'spec/unit/*/*_spec.rb'
|
14
|
+
end
|
15
|
+
|
16
|
+
desc 'Run integration specs'
|
17
|
+
# Before running integration tests, you need to specify
|
18
|
+
# a valid API KEY in the spec/spec_helper.rb file.
|
19
|
+
RSpec::Core::RakeTask.new('spec:integration') do |t|
|
20
|
+
t.rspec_opts = %w(--colour --format documentation)
|
21
|
+
t.pattern = 'spec/integration/*_spec.rb'
|
22
|
+
end
|
23
|
+
|
24
|
+
desc 'Run all tests'
|
25
|
+
RSpec::Core::RakeTask.new('spec:all') do |t|
|
26
|
+
t.rspec_opts = %w(--colour --format documentation)
|
27
|
+
t.pattern = 'spec/**/*_spec.rb'
|
28
|
+
end
|
29
|
+
|
30
|
+
task default: 'spec:unit'
|
31
|
+
task spec: 'spec:unit'
|
32
|
+
|
33
|
+
task :console do
|
34
|
+
sh 'pry --gem'
|
35
|
+
end
|
data/docs/Domains.md
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
Mailgun - Domains
|
2
|
+
====================
|
3
|
+
|
4
|
+
This is the Mailgun Ruby *Domain* utilities.
|
5
|
+
|
6
|
+
The below assumes you've already installed the Mailgun Ruby SDK in to your
|
7
|
+
project. If not, go back to the master README for instructions. It currently supports
|
8
|
+
all calls except credentials.
|
9
|
+
|
10
|
+
Usage - Domains
|
11
|
+
-----------------------
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
# First, instantiate the Mailgun Client with your API key
|
15
|
+
mg_client = Mailgun::Client.new('your-api-key')
|
16
|
+
domainer = Mailgun::Domains.new(mg_client)
|
17
|
+
|
18
|
+
# Get a list of current domains.
|
19
|
+
domainer.list
|
20
|
+
|
21
|
+
# View details of a domain
|
22
|
+
domainer.info 'my.perfect.domain'
|
23
|
+
|
24
|
+
# Add a new domain
|
25
|
+
domainer.create 'my.new.moreness'
|
26
|
+
# or with options
|
27
|
+
domainer.create 'my.new.moreness', { some: 'options' }
|
28
|
+
|
29
|
+
# Remove a domain
|
30
|
+
domainer.remove 'this.one.is.not.needed.'
|
31
|
+
```
|
32
|
+
|
33
|
+
Suppressions for a Domain
|
34
|
+
-------------------------
|
35
|
+
|
36
|
+
You can manage domain suppressions (bounces, unsubscribes, complaints) using the
|
37
|
+
[`Mailgun::Suppressions`](/docs/Suppressions.md) client:
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
# Instantiate the Mailgun Client with your API key
|
41
|
+
mg_client = Mailgun::Client.new('your-api-key')
|
42
|
+
supp_client = mg_client.suppressions('example.org')
|
43
|
+
|
44
|
+
# ...
|
45
|
+
```
|
46
|
+
|
47
|
+
See the [Suppressions](/docs/Suppressions.md) for usage samples and
|
48
|
+
[suppressions.rb](/lib/mailgun/suppressions.rb) for suppressions client API.
|
49
|
+
|
50
|
+
|
51
|
+
More Documentation
|
52
|
+
------------------
|
53
|
+
See the official [Mailgun Domain Docs](https://documentation.mailgun.com/api-domains.html)
|
54
|
+
for more information
|
data/docs/Events.md
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
Mailgun - Events
|
2
|
+
====================
|
3
|
+
|
4
|
+
This is the Mailgun Ruby *Events* utility.
|
5
|
+
|
6
|
+
The below assumes you've already installed the Mailgun Ruby SDK in your project.
|
7
|
+
If not, go back to the master README for a few quick install steps.
|
8
|
+
|
9
|
+
Events: Provides methods for traversing the Mailgun Events API.
|
10
|
+
|
11
|
+
|
12
|
+
Usage - Events
|
13
|
+
-----------------------------------------------------
|
14
|
+
Here's how to use the Events Handler to pull events.
|
15
|
+
|
16
|
+
```ruby
|
17
|
+
# First, instantiate the SDK with your API credentials, domain, and required parameters for example.
|
18
|
+
mg_client = Mailgun::Client.new("your-api-key")
|
19
|
+
mg_events = Mailgun::Events.new(mg_client, "your-domain")
|
20
|
+
|
21
|
+
result = mg_events.get({'limit' => 25,
|
22
|
+
'recipient' => 'joe@example.com'})
|
23
|
+
|
24
|
+
result.to_h['items'].each do | item |
|
25
|
+
# outputs "Delivered - 20140509184016.12571.48844@example.com"
|
26
|
+
puts "#{item['event']} - #{item['message']['headers']['message-id']}"
|
27
|
+
end
|
28
|
+
|
29
|
+
# Want more results?
|
30
|
+
result = mg_events.next
|
31
|
+
|
32
|
+
# Go backwards?
|
33
|
+
result = mg_events.previous
|
34
|
+
```
|
35
|
+
|
36
|
+
A few notes:
|
37
|
+
1. Next will use the pagination links to advance the result set.
|
38
|
+
Retain the mg_events object to query forward, or reverse, at any time.
|
39
|
+
2. If the result set is less than your limit, do not worry. A
|
40
|
+
second query against "next" will return the next 25 results since the
|
41
|
+
last time you called "next".
|
42
|
+
|
43
|
+
More Documentation
|
44
|
+
------------------
|
45
|
+
See the official [Mailgun Docs](http://documentation.mailgun.com/api-sending.html)
|
46
|
+
for more information.
|
@@ -0,0 +1,105 @@
|
|
1
|
+
Mailgun - Messages
|
2
|
+
====================
|
3
|
+
|
4
|
+
This is the Mailgun Ruby *Message* utilities.
|
5
|
+
|
6
|
+
The below assumes you've already installed the Mailgun Gem. If not, go back to the master README for instructions.
|
7
|
+
|
8
|
+
There are two utilities included, Message Builder and Batch Message.
|
9
|
+
|
10
|
+
Message Builder: Allows you to build a message object by calling methods for
|
11
|
+
each attribute.
|
12
|
+
Batch Message: Inherits Message Builder and allows you to iterate through
|
13
|
+
recipients from a list. Messages will fire after the 1,000th recipient has been
|
14
|
+
added.
|
15
|
+
|
16
|
+
Usage - Message Builder
|
17
|
+
-----------------------
|
18
|
+
Here's how to use Message Builder to build your Message.
|
19
|
+
|
20
|
+
```ruby
|
21
|
+
# First, instantiate the Mailgun Client with your API key
|
22
|
+
mg_client = Mailgun::Client.new("your-api-key")
|
23
|
+
mb_obj = Mailgun::MessageBuilder.new()
|
24
|
+
|
25
|
+
# Define the from address.
|
26
|
+
mb_obj.from("me@example.com", {"first"=>"Ruby", "last" => "SDK"});
|
27
|
+
|
28
|
+
# Define a to recipient.
|
29
|
+
mb_obj.add_recipient(:to, "john.doe@example.com", {"first" => "John", "last" => "Doe"});
|
30
|
+
|
31
|
+
# Define a cc recipient.
|
32
|
+
mb_obj.add_recipient(:cc, "sally.doe@example.com", {"first" => "Sally", "last" => "Doe"});
|
33
|
+
|
34
|
+
# Define the subject.
|
35
|
+
mb_obj.subject("A message from the Ruby SDK using Message Builder!");
|
36
|
+
|
37
|
+
# Define the body of the message.
|
38
|
+
mb_obj.body_text("This is the text body of the message!");
|
39
|
+
|
40
|
+
# Set the Message-Id header, provide a valid Message-Id.
|
41
|
+
mb_obj.message_id("<20141014000000.11111.11111@example.com>")
|
42
|
+
|
43
|
+
# Or clear the Message-Id header, provide nil or empty string.
|
44
|
+
mb_obj.message_id(nil)
|
45
|
+
mb_obj.message_id('')
|
46
|
+
|
47
|
+
# Campaigns and headers.
|
48
|
+
mb_obj.add_campaign_id("My-Awesome-Campaign");
|
49
|
+
mb_obj.header("Customer-Id", "12345");
|
50
|
+
|
51
|
+
# Custom variables
|
52
|
+
mb_obj.variable("Customer-Data", { :first_name => "John", :last_name => "Smith" })
|
53
|
+
|
54
|
+
# Attach a file and rename it.
|
55
|
+
mb_obj.add_attachment "/path/to/file/receipt_123491820.pdf", "Receipt.pdf"
|
56
|
+
|
57
|
+
# Attach an image inline.
|
58
|
+
mb_obj.add_inline_image "/path/to/file/header.png"
|
59
|
+
|
60
|
+
# Schedule message in the future
|
61
|
+
mb_obj.deliver_at("tomorrow 8:00AM PST");
|
62
|
+
|
63
|
+
# Finally, send your message using the client
|
64
|
+
result = mg_client.send_message("sending_domain.com", mb_obj)
|
65
|
+
|
66
|
+
puts result.body.to_s
|
67
|
+
```
|
68
|
+
|
69
|
+
Usage - Batch Message
|
70
|
+
---------------------
|
71
|
+
Here's how to use Batch Message to easily handle batch sending jobs.
|
72
|
+
|
73
|
+
```ruby
|
74
|
+
# First, instantiate the Mailgun Client with your API key
|
75
|
+
mg_client = Mailgun::Client.new("your-api-key")
|
76
|
+
|
77
|
+
# Create a Batch Message object, pass in the client and your domain.
|
78
|
+
mb_obj = Mailgun::BatchMessage.new(mg_client, "example.com")
|
79
|
+
|
80
|
+
# Define the from address.
|
81
|
+
mb_obj.from("me@example.com", {"first" => "Ruby", "last" => "SDK"});
|
82
|
+
|
83
|
+
# Define the subject.
|
84
|
+
mb_obj.subject("A message from the Ruby SDK using Message Builder!");
|
85
|
+
|
86
|
+
# Define the body of the message.
|
87
|
+
mb_obj.body_text("This is the text body of the message!");
|
88
|
+
|
89
|
+
|
90
|
+
# Loop through all of your recipients
|
91
|
+
mb_obj.add_recipient(:to, "john.doe@example.com", {"first" => "John", "last" => "Doe"});
|
92
|
+
mb_obj.add_recipient(:to, "jane.doe@example.com", {"first" => "Jane", "last" => "Doe"});
|
93
|
+
mb_obj.add_recipient(:to, "bob.doe@example.com", {"first" => "Bob", "last" => "Doe"});
|
94
|
+
...
|
95
|
+
mb_obj.add_recipient(:to, "sally.doe@example.com", {"first" => "Sally", "last" => "Doe"});
|
96
|
+
|
97
|
+
# Call finalize to get a list of message ids and totals.
|
98
|
+
message_ids = mb_obj.finalize
|
99
|
+
# {'id1234@example.com' => 1000, 'id5678@example.com' => 15}
|
100
|
+
```
|
101
|
+
|
102
|
+
More Documentation
|
103
|
+
------------------
|
104
|
+
See the official [Mailgun Docs](http://documentation.mailgun.com/api-sending.html)
|
105
|
+
for more information.
|
data/docs/Messages.md
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
Mailgun - Messages
|
2
|
+
====================
|
3
|
+
|
4
|
+
This is the Mailgun Ruby *Message* utilities.
|
5
|
+
|
6
|
+
The below assumes you've already installed the Mailgun Ruby SDK in to your
|
7
|
+
project. If not, go back to the master README for instructions.
|
8
|
+
|
9
|
+
There are two utilities included, Message Builder and Batch Message.
|
10
|
+
|
11
|
+
Message Builder: Allows you to build a message object by calling methods for
|
12
|
+
each MIME attribute.
|
13
|
+
Batch Message: Inherits Message Builder and allows you to iterate through
|
14
|
+
recipients from a list. Messages will fire after the 1,000th recipient has been
|
15
|
+
added.
|
16
|
+
|
17
|
+
Usage - Message Builder
|
18
|
+
-----------------------
|
19
|
+
Here's how to use Message Builder to build your Message.
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
# First, instantiate the Mailgun Client with your API key
|
23
|
+
mg_client = Mailgun::Client.new("your-api-key")
|
24
|
+
mb_obj = Mailgun::MessageBuilder.new
|
25
|
+
|
26
|
+
# Define the from address.
|
27
|
+
mb_obj.set_from_address("me@example.com", {"first"=>"Ruby", "last" => "SDK"})
|
28
|
+
|
29
|
+
# Define a to recipient.
|
30
|
+
mb_obj.add_recipient(:to, "john.doe@example.com", {"first" => "John", "last" => "Doe"})
|
31
|
+
|
32
|
+
# Define a cc recipient.
|
33
|
+
mb_obj.add_recipient(:cc, "sally.doe@example.com", {"first" => "Sally", "last" => "Doe"})
|
34
|
+
|
35
|
+
# Define the subject.
|
36
|
+
mb_obj.set_subject("A message from the Ruby SDK using Message Builder!")
|
37
|
+
|
38
|
+
# Define the body of the message.
|
39
|
+
mb_obj.set_text_body("This is the text body of the message!")
|
40
|
+
|
41
|
+
# Define the HTML text of the message
|
42
|
+
mb_obj.set_html_body("<html><body><p>This is the text body of the message</p></body></html>")
|
43
|
+
|
44
|
+
# Set the Message-Id header. Pass in a valid Message-Id.
|
45
|
+
mb_obj.set_message_id("<20141014000000.11111.11111@example.com>")
|
46
|
+
|
47
|
+
# Clear the Message-Id header. Pass in nil or empty string.
|
48
|
+
mb_obj.set_message_id(nil)
|
49
|
+
mb_obj.set_message_id('')
|
50
|
+
|
51
|
+
# Other Optional Parameters.
|
52
|
+
mb_obj.add_campaign_id("My-Awesome-Campaign")
|
53
|
+
mb_obj.header("Customer-Id", "12345")
|
54
|
+
mb_obj.add_attachment("./tron.jpg")
|
55
|
+
mb_obj.set_delivery_time("tomorrow 8:00AM PST")
|
56
|
+
mb_obj.set_click_tracking(true)
|
57
|
+
|
58
|
+
# Send your message through the client
|
59
|
+
mg_client.send_message("sending_domain.com", mb_obj)
|
60
|
+
```
|
61
|
+
|
62
|
+
Usage - Batch Message
|
63
|
+
---------------------
|
64
|
+
Here's how to use Batch Message to easily handle batch sending jobs.
|
65
|
+
|
66
|
+
```ruby
|
67
|
+
# First, instantiate the Mailgun Client with your API key
|
68
|
+
mg_client = Mailgun::Client.new("your-api-key")
|
69
|
+
mb_obj = Mailgun::BatchMessage.new(mg_client, "example.com")
|
70
|
+
|
71
|
+
# Define the from address.
|
72
|
+
mb_obj.set_from_address("me@example.com", {"first"=>"Ruby", "last" => "SDK"})
|
73
|
+
|
74
|
+
# Define the subject.
|
75
|
+
mb_obj.set_subject("A message from the Ruby SDK using Message Builder!")
|
76
|
+
|
77
|
+
# Define the body of the message.
|
78
|
+
mb_obj.set_text_body("Hello %recipient.first%,
|
79
|
+
This is the text body of the message
|
80
|
+
using recipient variables!
|
81
|
+
If you need to include custom data,
|
82
|
+
you could do it like this: %recipient.account-id%.")
|
83
|
+
|
84
|
+
mb_obj.add_recipient(:to, "john.doe@example.com", {"first" => "John",
|
85
|
+
"last" => "Doe",
|
86
|
+
"account-id" => 1234})
|
87
|
+
|
88
|
+
mb_obj.add_recipient(:to, "jane.doe@example.com", {"first" => "Jane",
|
89
|
+
"last" => "Doe",
|
90
|
+
"account-id" => 5678})
|
91
|
+
|
92
|
+
mb_obj.add_recipient(:to, "bob.doe@example.com", {"first" => "Bob",
|
93
|
+
"last" => "Doe",
|
94
|
+
"account-id" => 91011})
|
95
|
+
...
|
96
|
+
mb_obj.add_recipient(:to, "sally.doe@example.com", {"first" => "Sally",
|
97
|
+
"last" => "Doe",
|
98
|
+
"account-id" => 121314})
|
99
|
+
|
100
|
+
# Send your message through the client
|
101
|
+
message_ids = mb_obj.finalize
|
102
|
+
```
|
103
|
+
|
104
|
+
More Documentation
|
105
|
+
------------------
|
106
|
+
See the official [Mailgun Docs](https://documentation.mailgun.com/api-sending.html)
|
107
|
+
for more information.
|
@@ -0,0 +1,103 @@
|
|
1
|
+
Mailgun - Lists
|
2
|
+
====================
|
3
|
+
|
4
|
+
This is the Mailgun Ruby *Lists* utilities.
|
5
|
+
|
6
|
+
The below assumes you've already installed the Mailgun Ruby SDK in your project.
|
7
|
+
If not, go back to the master README for a few quick install steps.
|
8
|
+
|
9
|
+
OptInHandler: Provides methods for authenticating an Opt-In Request.
|
10
|
+
|
11
|
+
The typical flow for using this utility would be as follows:
|
12
|
+
**Recipient Requests Subscribe** -> [Validate Recipient Address] -> [Generate Opt-In Link] -> [Email Recipient Opt-In Link]
|
13
|
+
**Recipient Clicks Opt-In Link** -> [Validate Opt-In Link] -> [Subscribe User] -> [Send final confirmation]
|
14
|
+
|
15
|
+
The above flow is modeled below.
|
16
|
+
|
17
|
+
Usage - Opt-In Handler (Recipient Requests Subscribe)
|
18
|
+
-----------------------------------------------------
|
19
|
+
Here's how to use Opt-In Handler to validate Opt-In requests.
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
# First, instantiate the SDK with your API credentials, domain, and required parameters for example.
|
23
|
+
mg_client = Mailgun::Client.new("your-api-key")
|
24
|
+
mg_validate = Mailgun::Client.new("your-pub-api-key")
|
25
|
+
|
26
|
+
domain = 'example.com';
|
27
|
+
|
28
|
+
mailing_list = 'youlist@example.com';
|
29
|
+
secret_app_id = 'a_secret_passphrase';
|
30
|
+
recipient_address = 'recipient@example.com';
|
31
|
+
|
32
|
+
# Let's validate the customer's email address, using Mailgun's validation endpoint.
|
33
|
+
result = mg_validate.get('address/validate', {:address => recipient_address});
|
34
|
+
body = JSON.parse(result.body)
|
35
|
+
|
36
|
+
if body['is_valid'] == true
|
37
|
+
# Next, generate a hash.
|
38
|
+
generated_hash = Mailgun::OptInHandler.generate_hash(mailing_list, secret_app_id, recipient_address);
|
39
|
+
|
40
|
+
# Now, let's send a confirmation to the recipient with our link.
|
41
|
+
mg_client.send_message(domain, {:from => 'bob@example.com',
|
42
|
+
:to => recipient_address,
|
43
|
+
:subject => 'Please Confirm!',
|
44
|
+
:html => "<html><body>Hello,<br><br>You have requested to be subscribed
|
45
|
+
to the mailing list #{mailing_list}. Please <a
|
46
|
+
href=\"http://yourdomain.com/subscribe.php?hash=#{generated_hash}\">
|
47
|
+
confirm</a> your subscription.<br><br>Thank you!</body></html>"});
|
48
|
+
|
49
|
+
# Finally, let's add the subscriber to a Mailing List, as unsubscribed, so we can track non-conversions.
|
50
|
+
mg_client.post("lists/#{mailing_list}/members", {:address => recipient_address,
|
51
|
+
:subscribed => 'no',
|
52
|
+
:upsert => 'yes'});
|
53
|
+
end
|
54
|
+
```
|
55
|
+
|
56
|
+
Usage - Opt-In Handler (Recipient Clicks Opt In Link)
|
57
|
+
-----------------------------------------------------
|
58
|
+
Here's how to use Opt-In Handler to validate an Opt-In Hash.
|
59
|
+
|
60
|
+
```ruby
|
61
|
+
# First, instantiate the SDK with your API credentials and domain.
|
62
|
+
mg_client = Mailgun::Client.new("your-api-key")
|
63
|
+
domain = 'example.com';
|
64
|
+
|
65
|
+
# Now, validate the captured hash.
|
66
|
+
hash_validation = Mailgun::OptInHandler.validate_hash(secret_app_id, inbound_hash);
|
67
|
+
|
68
|
+
# Lastly, check to see if we have results, parse, subscribe, and send confirmation.
|
69
|
+
if !hash_validation.nil?
|
70
|
+
validated_list = hash_validation['mailing_list'];
|
71
|
+
validated_recipient = hash_validation['recipient_address'];
|
72
|
+
|
73
|
+
mg_client.put("lists/#{validated_list}/members/#{validated_recipient}",
|
74
|
+
{:address => validated_recipient,
|
75
|
+
:subscribed => 'yes'})
|
76
|
+
|
77
|
+
mg_client.send_message(domain, {:from => 'bob@example.com',
|
78
|
+
:to => validated_recipient,
|
79
|
+
:subject => 'Confirmation Received!',
|
80
|
+
:html => "<html><body>Hello,<br><br>We've successfully subscribed you to the list, #{validated_list}!<br><br>Thank you!
|
81
|
+
</body></html>"});
|
82
|
+
end
|
83
|
+
```
|
84
|
+
|
85
|
+
A few notes:
|
86
|
+
1. 'secret_app_id' can be anything. It's used as the *key* in hashing,
|
87
|
+
since your email address will vary. It should be secured like a password.
|
88
|
+
2. validateHash will return an array containing the recipient address and list
|
89
|
+
address.
|
90
|
+
3. You should *always* send an email confirmation before and after the
|
91
|
+
subscription request. This is what double-opt in means.
|
92
|
+
|
93
|
+
|
94
|
+
Available Functions
|
95
|
+
-----------------------------------------------------
|
96
|
+
|
97
|
+
`string generate_hash(string mailing_list, string secret_app_id, string recipient_address)`
|
98
|
+
|
99
|
+
`array validate_hash(string secret_app_id, string unique_hash)`
|
100
|
+
|
101
|
+
More Documentation
|
102
|
+
------------------
|
103
|
+
See the official [Mailgun Docs](https://documentation.mailgun.com/api-sending.html) for more information.
|