multi_mail 0.0.2 → 0.1.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.
- data/.gitignore +2 -1
- data/.travis.yml +10 -0
- data/README.md +283 -59
- data/Rakefile +38 -19
- data/lib/multi_mail/cloudmailin/receiver.rb +3 -13
- data/lib/multi_mail/mailgun/message.rb +67 -0
- data/lib/multi_mail/mailgun/receiver.rb +20 -13
- data/lib/multi_mail/mailgun/sender.rb +79 -2
- data/lib/multi_mail/mandrill/message.rb +74 -0
- data/lib/multi_mail/mandrill/receiver.rb +36 -16
- data/lib/multi_mail/mandrill/sender.rb +77 -2
- data/lib/multi_mail/message/base.rb +40 -0
- data/lib/multi_mail/postmark/receiver.rb +1 -1
- data/lib/multi_mail/postmark/sender.rb +35 -5
- data/lib/multi_mail/receiver/base.rb +31 -2
- data/lib/multi_mail/receiver.rb +1 -4
- data/lib/multi_mail/sender/base.rb +23 -1
- data/lib/multi_mail/sendgrid/message.rb +74 -0
- data/lib/multi_mail/sendgrid/receiver.rb +72 -23
- data/lib/multi_mail/sendgrid/sender.rb +63 -2
- data/lib/multi_mail/service.rb +48 -56
- data/lib/multi_mail/simple/receiver.rb +4 -4
- data/lib/multi_mail/version.rb +1 -1
- data/lib/multi_mail.rb +16 -1
- data/multi_mail.gemspec +4 -1
- data/spec/fixtures/empty.gif +0 -0
- data/spec/fixtures/mailgun/raw/invalid.txt +13 -0
- data/spec/fixtures/mailgun/raw/missing.txt +13 -0
- data/spec/fixtures/mailgun/raw/spam.txt +13 -0
- data/spec/fixtures/mailgun/raw/valid.txt +13 -0
- data/spec/fixtures/mandrill/invalid.txt +15 -0
- data/spec/fixtures/mandrill/missing.txt +14 -0
- data/spec/fixtures/mandrill/multiple.txt +15 -0
- data/spec/fixtures/mandrill/valid.txt +10 -5
- data/spec/fixtures/postmark/valid.txt +13 -13
- data/spec/fixtures/sendgrid/encoding.txt +90 -0
- data/spec/fixtures/sendgrid/spam.txt +94 -0
- data/spec/fixtures/sendgrid/valid.txt +136 -0
- data/spec/mailgun/message_spec.rb +251 -0
- data/spec/mailgun/receiver_spec.rb +35 -20
- data/spec/mailgun/sender_spec.rb +175 -0
- data/spec/mandrill/message_spec.rb +305 -0
- data/spec/mandrill/receiver_spec.rb +90 -46
- data/spec/mandrill/sender_spec.rb +138 -0
- data/spec/message/base_spec.rb +81 -0
- data/spec/postmark/receiver_spec.rb +4 -4
- data/spec/postmark/sender_spec.rb +118 -0
- data/spec/receiver/base_spec.rb +16 -9
- data/spec/sender/base_spec.rb +24 -10
- data/spec/sendgrid/message_spec.rb +265 -0
- data/spec/sendgrid/receiver_spec.rb +77 -0
- data/spec/sendgrid/sender_spec.rb +140 -0
- data/spec/service_spec.rb +18 -1
- data/spec/simple/receiver_spec.rb +1 -1
- data/spec/spec_helper.rb +46 -4
- metadata +226 -143
- data/lib/multi_mail/sender.rb +0 -46
- data/lib/multi_mail/simple/sender.rb +0 -14
- data/spec/sender_spec.rb +0 -13
- data/spec/simple/sender_spec.rb +0 -0
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -5,3 +5,13 @@ rvm:
|
|
5
5
|
- 1.9.3
|
6
6
|
- 2.0.0
|
7
7
|
- ree
|
8
|
+
env:
|
9
|
+
global:
|
10
|
+
# MAILGUN_API_KEY
|
11
|
+
- secure: "hQrNP1++1GVNuFp7xHIUOp938sbuko/hLdhyw+D/yNn1XXvak7UGNVvKNHvL\n8a+CxP8D3iqHitkcSEccWhzwnALiljZKl7tFfX/OPouYrPpuhhjHtv8X/y3n\nFpeMVNFXaF1QfwSEMYWNMdL24WUgBr+V5WhRsmi/BCIA+4PtCRk="
|
12
|
+
# MANDRILL_API_KEY
|
13
|
+
- secure: "sjbNGWtWzaPup1yQN+cbtY264NgpNYZrOirVuYj5PMD31emoAiaobS7+cCJH\nx0MUXskjtbzvbJwvzLwkwDpdRA2Hx4dvOKh0HrOVLy1B0bKbVdb7P3eET2aN\nE07nmVNC79jiopD+1pWcbMGXr9s4/sOogK23ktVPegrWH7c0pfI="
|
14
|
+
# SENDGRID_API_USER
|
15
|
+
- secure: "THUH/QdYAVXIFBn24PhcqChMF4XGUzDnzoRxNQMBjVZ3mTM6/dw5lGApx3HQ\nZZy4iUQ0sCWcsPo/tK4AdhZ7/NEcKh/9Uxr1J7GOKBIAJVd5veDe6RCy1eyP\niCmF6QuzVsEgprcxcOPypeybLoUd8TCIhVGPTYaOCamjwx59e3Y="
|
16
|
+
# SENDGRID_API_KEY
|
17
|
+
- secure: "ovfCD7gOOiHteTihQ9YGyUQiSdWrrI15kE2nU8qEfH8suQACBxW4By9D4CY6\ngompkj1svDscXb9u55nbOIH5JWQxM+Uc5OH6vFWBikRdyFPHN0lfsRyUXQj7\nqPkjaEIEAW0Q7bTetdpfTDV1qmCiHALmc2CaexEj9o4JOcN7AeM="
|
data/README.md
CHANGED
@@ -1,101 +1,243 @@
|
|
1
|
-
# MultiMail: easily switch
|
1
|
+
# MultiMail: easily switch email APIs
|
2
2
|
|
3
3
|
[](http://travis-ci.org/opennorth/multi_mail)
|
4
4
|
[](https://gemnasium.com/opennorth/multi_mail)
|
5
5
|
[](https://coveralls.io/r/opennorth/multi_mail)
|
6
6
|
[](https://codeclimate.com/github/opennorth/multi_mail)
|
7
7
|
|
8
|
-
Many providers
|
8
|
+
Many providers offer APIs to send, receive, and parse email. MultiMail lets you easily switch between these APIs, and integrates tightly with the [Mail](https://github.com/mikel/mail) gem.
|
9
|
+
|
10
|
+
* [Cloudmailin](http://www.cloudmailin.com/): [Example](#cloudmailin)
|
11
|
+
* [Mailgun](http://www.mailgun.com/): [Example](#mailgun)
|
12
|
+
* [Mandrill](http://mandrill.com/): [Example](#mandrill)
|
13
|
+
* [Postmark](http://postmarkapp.com/): [Example](#postmark)
|
14
|
+
* [SendGrid](http://sendgrid.com/): [Example](#sendgrid)
|
9
15
|
|
10
16
|
## Usage
|
11
17
|
|
12
|
-
|
13
|
-
|
14
|
-
service = MultiMail::Receiver.new(:provider => 'mandrill')
|
15
|
-
|
16
|
-
message = service.process data # raw POST data or params hash
|
18
|
+
### Incoming
|
17
19
|
|
18
|
-
|
20
|
+
```ruby
|
21
|
+
require 'multi_mail'
|
19
22
|
|
20
|
-
|
23
|
+
# Create an object to consume the webhook data.
|
24
|
+
service = MultiMail::Receiver.new(:provider => 'mandrill')
|
21
25
|
|
22
|
-
|
26
|
+
# Process the webhook data, whether it's raw POST data, a params hash, a Rack request, etc.
|
27
|
+
messages = service.process(data)
|
28
|
+
```
|
23
29
|
|
24
|
-
|
25
|
-
* [Mandrill](http://mandrill.com/)
|
26
|
-
* [Postmark](http://postmarkapp.com/)
|
27
|
-
* [Cloudmailin](http://www.cloudmailin.com/)
|
30
|
+
`messages` will be an array of [Mail::Message](https://github.com/mikel/mail) instances.
|
28
31
|
|
29
|
-
Any
|
32
|
+
Any non-standard parameters provided by an API are added to each message as a header. For example, Mailgun provides `stripped-text`, which is the message body without quoted parts or signature block. You can access it as `message['stripped-text'].value`.
|
30
33
|
|
31
|
-
|
34
|
+
### Outgoing
|
35
|
+
|
36
|
+
With MultiMail, you send a message the same way you do with the [Mail](https://github.com/mikel/mail#sending-an-email) gem. Just set `delivery_method`:
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
require 'multi_mail'
|
40
|
+
require 'multi_mail/postmark/sender'
|
41
|
+
|
42
|
+
message = Mail.new do
|
43
|
+
delivery_method MultiMail::Sender::Postmark, :api_key => 'your-api-key'
|
44
|
+
...
|
45
|
+
end
|
46
|
+
|
47
|
+
message.deliver
|
48
|
+
```
|
49
|
+
|
50
|
+
Alternatively, instead of setting `delivery_method` during initialization, you can set it before delivery:
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
message = Mail.new do
|
54
|
+
...
|
55
|
+
end
|
56
|
+
|
57
|
+
message.delivery_method MultiMail::Sender::Postmark, :api_key => 'your-api-key'
|
58
|
+
|
59
|
+
message.deliver
|
60
|
+
```
|
61
|
+
|
62
|
+
Or, if you are sending many messages, you can set a default `delivery_method` for all messages:
|
63
|
+
|
64
|
+
```ruby
|
65
|
+
Mail.defaults do
|
66
|
+
delivery_method MultiMail::Sender::Postmark, :api_key => 'your-api-key'
|
67
|
+
end
|
68
|
+
```
|
69
|
+
|
70
|
+
#### Track opens and clicks
|
71
|
+
|
72
|
+
Mailgun and Mandrill allow you to set open tracking and click tracking on a per-message basis:
|
32
73
|
|
33
|
-
|
34
|
-
|
35
|
-
|
74
|
+
```ruby
|
75
|
+
require 'multi_mail'
|
76
|
+
require 'multi_mail/mailgun/sender'
|
36
77
|
|
37
|
-
|
78
|
+
message = Mail.new do
|
79
|
+
delivery_method MultiMail::Sender::Mailgun,
|
80
|
+
:api_key => 'your-api-key',
|
81
|
+
:domain => 'your-domain.mailgun.org',
|
82
|
+
:track => {
|
83
|
+
:opens => true,
|
84
|
+
:clicks => false,
|
85
|
+
}
|
86
|
+
...
|
87
|
+
end
|
88
|
+
|
89
|
+
message.deliver
|
90
|
+
```
|
91
|
+
|
92
|
+
[Mailgun](http://documentation.mailgun.com/user_manual.html#tracking-clicks) and [Mandrill](http://help.mandrill.com/entries/21721852-Why-aren-t-clicks-being-tracked-) track whether a recipient has clicked a link in a message by rewriting its URL.
|
93
|
+
|
94
|
+
If want to rewrite URLs in HTML parts only – leaving URLs as-is in text parts – use `:clicks => 'htmlonly'` if you are using Mailgun; if you are using Mandrill, do not set `:clicks` and instead configure click tracking globally in your [Mandrill sending options](https://mandrillapp.com/settings/sending-options).
|
95
|
+
|
96
|
+
```ruby
|
97
|
+
require 'multi_mail'
|
98
|
+
require 'multi_mail/mandrill/sender'
|
99
|
+
|
100
|
+
message = Mail.new do
|
101
|
+
delivery_method MultiMail::Sender::Mandrill,
|
102
|
+
:api_key => 'your-api-key',
|
103
|
+
:track => {
|
104
|
+
:opens => true,
|
105
|
+
:clicks => false,
|
106
|
+
}
|
107
|
+
...
|
108
|
+
end
|
109
|
+
|
110
|
+
message.deliver
|
111
|
+
```
|
112
|
+
|
113
|
+
#### Inspect the API response
|
114
|
+
|
115
|
+
Pass `:return_response => true` to `delivery_method` and use the `deliver!` method to send the message:
|
116
|
+
|
117
|
+
```ruby
|
118
|
+
message = Mail.new do
|
119
|
+
delivery_method MultiMail::Sender::Postmark, :api_key => 'your-api-key', :return_response => true
|
120
|
+
...
|
121
|
+
end
|
122
|
+
|
123
|
+
message.deliver!
|
124
|
+
```
|
125
|
+
|
126
|
+
Note that the `deliver!` method ignores Mail's `perform_deliveries` and `raise_delivery_errors` flags.
|
127
|
+
|
128
|
+
## Cloudmailin
|
38
129
|
|
39
|
-
|
40
|
-
:provider => 'cloudmailin',
|
41
|
-
:http_post_format => 'raw',
|
42
|
-
})
|
130
|
+
### Incoming
|
43
131
|
|
44
|
-
|
132
|
+
```ruby
|
133
|
+
service = MultiMail::Receiver.new({
|
134
|
+
:provider => 'cloudmailin',
|
135
|
+
})
|
136
|
+
```
|
45
137
|
|
46
|
-
|
138
|
+
The default HTTP POST format is `raw`. Add a `:http_post_format` option to change the HTTP POST format, with possible values of `"multipart"`, `"json"` or `"raw"` (default):
|
47
139
|
|
48
|
-
|
140
|
+
```ruby
|
141
|
+
service = MultiMail::Receiver.new({
|
142
|
+
:provider => 'cloudmailin',
|
143
|
+
:http_post_format => 'raw',
|
144
|
+
})
|
145
|
+
```
|
49
146
|
|
50
|
-
See [Cloudmailin's documentation](http://docs.cloudmailin.com/http_post_formats/):
|
147
|
+
See [Cloudmailin's documentation](http://docs.cloudmailin.com/http_post_formats/) for these additional parameters provided by the API:
|
51
148
|
|
52
149
|
* `reply_plain`
|
53
150
|
* `spf-result`
|
54
151
|
|
152
|
+
**Note:** [MultiMail doesn't yet support Cloudmailin's URL attachments (attachment stores).](https://github.com/opennorth/multi_mail/issues/11) Please use regular attachments (always the case if you use the default `raw` format).
|
153
|
+
|
55
154
|
## Mailgun
|
56
155
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
156
|
+
### Incoming
|
157
|
+
|
158
|
+
```ruby
|
159
|
+
service = MultiMail::Receiver.new({
|
160
|
+
:provider => 'mailgun',
|
161
|
+
})
|
162
|
+
```
|
61
163
|
|
62
|
-
|
164
|
+
To check that a request originates from Mailgun, add a `:mailgun_api_key` option:
|
63
165
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
166
|
+
```ruby
|
167
|
+
service = MultiMail::Receiver.new({
|
168
|
+
:provider => 'mailgun',
|
169
|
+
:mailgun_api_key => 'key-xxxxxxxxxxxxxxxxxxxxxxx-x-xxxxxx',
|
170
|
+
})
|
171
|
+
```
|
69
172
|
|
70
|
-
|
173
|
+
If you are using the [raw MIME format](http://documentation.mailgun.com/user_manual.html#mime-messages-parameters), add a `:http_post_format => 'raw'` option:
|
71
174
|
|
72
|
-
|
175
|
+
```ruby
|
176
|
+
service = MultiMail::Receiver.new({
|
177
|
+
:provider => 'mailgun',
|
178
|
+
:http_post_format => 'raw',
|
179
|
+
})
|
180
|
+
```
|
73
181
|
|
74
|
-
See [Mailgun's documentation](http://documentation.mailgun.net/user_manual.html#parsed-messages-parameters):
|
182
|
+
See [Mailgun's documentation](http://documentation.mailgun.net/user_manual.html#parsed-messages-parameters) for these additional parameters provided by the API:
|
75
183
|
|
76
184
|
* `stripped-text`
|
77
185
|
* `stripped-signature`
|
78
186
|
* `stripped-html`
|
79
187
|
* `content-id-map`
|
80
188
|
|
189
|
+
### Outgoing
|
190
|
+
|
191
|
+
```ruby
|
192
|
+
require 'multi_mail/mailgun/sender'
|
193
|
+
|
194
|
+
Mail.deliver do
|
195
|
+
delivery_method MultiMail::Sender::Mailgun, :api_key => 'your-api-key', :domain => 'your-domain.mailgun.org'
|
196
|
+
...
|
197
|
+
end
|
198
|
+
```
|
199
|
+
|
200
|
+
You may pass additional arguments to `delivery_method` to use Mailgun-specific features ([see docs](http://documentation.mailgun.com/api-sending.html)):
|
201
|
+
|
202
|
+
* `o:tag`
|
203
|
+
* `o:campaign`
|
204
|
+
* `o:dkim`
|
205
|
+
* `o:deliverytime`
|
206
|
+
* `o:testmode`
|
207
|
+
* `o:tracking`
|
208
|
+
* `v:`
|
209
|
+
|
81
210
|
## Mandrill
|
82
211
|
|
83
|
-
|
84
|
-
:provider => 'mandrill',
|
85
|
-
})
|
212
|
+
### Incoming
|
86
213
|
|
87
|
-
|
214
|
+
```ruby
|
215
|
+
service = MultiMail::Receiver.new({
|
216
|
+
:provider => 'mandrill',
|
217
|
+
})
|
218
|
+
```
|
88
219
|
|
89
|
-
|
90
|
-
:provider => 'mandrill',
|
91
|
-
:spamassassin_threshold => 4.5,
|
92
|
-
})
|
220
|
+
To check that a request originates from Mandrill, add `:mandrill_webhook_key` and `:mandrill_webhook_url` options:
|
93
221
|
|
94
|
-
|
222
|
+
```ruby
|
223
|
+
service = MultiMail::Receiver.new({
|
224
|
+
:provider => 'mandrill',
|
225
|
+
:mandrill_webhook_key => 'xxxxxxxxxxxxxxxxxxxxxx',
|
226
|
+
:mandrill_webhook_url => 'http://example.com/post',
|
227
|
+
})
|
228
|
+
```
|
229
|
+
You can get your webhook key from [Mandrill's Webhooks Settings](https://mandrillapp.com/settings/webhooks).
|
95
230
|
|
96
|
-
|
231
|
+
The default SpamAssassin score needed to flag an email as spam is `5`. Add a `:spamassassin_threshold` option to increase or decrease it:
|
97
232
|
|
98
|
-
|
233
|
+
```ruby
|
234
|
+
service = MultiMail::Receiver.new({
|
235
|
+
:provider => 'mandrill',
|
236
|
+
:spamassassin_threshold => 4.5,
|
237
|
+
})
|
238
|
+
```
|
239
|
+
|
240
|
+
See [Mandrill's documentation](http://help.mandrill.com/entries/22092308-What-is-the-format-of-inbound-email-webhooks-) for these additional parameters provided by the API:
|
99
241
|
|
100
242
|
* `ts`
|
101
243
|
* `email`
|
@@ -104,22 +246,104 @@ See [Mandrill's documentation](http://help.mandrill.com/entries/22092308-What-is
|
|
104
246
|
* `spam_report-score`
|
105
247
|
* `spf-result`
|
106
248
|
|
107
|
-
|
249
|
+
### Outgoing
|
250
|
+
|
251
|
+
```ruby
|
252
|
+
require 'multi_mail/mandrill/sender'
|
253
|
+
|
254
|
+
Mail.deliver do
|
255
|
+
delivery_method MultiMail::Sender::Mandrill, :api_key => 'your-api-key'
|
256
|
+
...
|
257
|
+
end
|
258
|
+
```
|
259
|
+
|
260
|
+
You may pass additional arguments to `delivery_method` to use Mandrill-specific features ([see docs](https://mandrillapp.com/api/docs/messages.ruby.html#method-send)):
|
261
|
+
|
262
|
+
* `important`
|
263
|
+
* `auto_text` and `auto_html`
|
264
|
+
* `inline_css`
|
265
|
+
* `url_strip_qs`
|
266
|
+
* `preserve_recipients`
|
267
|
+
* `bcc_address`
|
268
|
+
* `tracking_domain` and `signing_domain`
|
269
|
+
* `merge`, `global_merge_vars` and `merge_vars`
|
270
|
+
* `tags`
|
271
|
+
* `google_analytics_domains` and `google_analytics_campaign`
|
272
|
+
* `metadata` and `recipient_metadata`
|
273
|
+
* `async`
|
274
|
+
* `ip_pool`
|
275
|
+
* `send_at`
|
108
276
|
|
109
|
-
|
110
|
-
:provider => 'postmark',
|
111
|
-
})
|
277
|
+
## Postmark
|
112
278
|
|
113
|
-
|
279
|
+
### Incoming
|
114
280
|
|
115
|
-
|
281
|
+
```ruby
|
282
|
+
service = MultiMail::Receiver.new({
|
283
|
+
:provider => 'postmark',
|
284
|
+
})
|
285
|
+
```
|
116
286
|
|
117
|
-
See [Postmark's documentation](http://developer.postmarkapp.com/developer-inbound-parse.html#mailboxhash):
|
287
|
+
See [Postmark's documentation](http://developer.postmarkapp.com/developer-inbound-parse.html#mailboxhash) for these additional parameters provided by the API:
|
118
288
|
|
119
289
|
* `MailboxHash`
|
120
290
|
* `MessageID`
|
121
291
|
* `Tag`
|
122
292
|
|
293
|
+
### Outgoing
|
294
|
+
|
295
|
+
```ruby
|
296
|
+
require 'multi_mail/postmark/sender'
|
297
|
+
|
298
|
+
Mail.deliver do
|
299
|
+
delivery_method MultiMail::Sender::Postmark, :api_key => 'your-api-key'
|
300
|
+
...
|
301
|
+
end
|
302
|
+
```
|
303
|
+
|
304
|
+
MultiMail depends on the `postmark` gem for its Postmark integration.
|
305
|
+
|
306
|
+
You may also pass a `Tag` option to `delivery_method` ([see Postmark's documentation](http://developer.postmarkapp.com/developer-build.html#message-format)).
|
307
|
+
|
308
|
+
## SendGrid
|
309
|
+
|
310
|
+
### Incoming
|
311
|
+
|
312
|
+
```ruby
|
313
|
+
service = MultiMail::Receiver.new({
|
314
|
+
:provider => 'sendgrid',
|
315
|
+
})
|
316
|
+
```
|
317
|
+
|
318
|
+
The default SpamAssassin score needed to flag an email as spam is `5`. Add a `:spamassassin_threshold` option to increase or decrease it:
|
319
|
+
|
320
|
+
```ruby
|
321
|
+
service = MultiMail::Receiver.new({
|
322
|
+
:provider => 'sendgrid',
|
323
|
+
:spamassassin_threshold => 4.5,
|
324
|
+
})
|
325
|
+
```
|
326
|
+
|
327
|
+
See [SendGrid's documentation](http://sendgrid.com/docs/API_Reference/Webhooks/parse.html) for these additional parameters provided by the API:
|
328
|
+
|
329
|
+
* `dkim`
|
330
|
+
* `SPF`
|
331
|
+
* `spam_report`
|
332
|
+
* `spam_score`
|
333
|
+
|
334
|
+
### Outgoing
|
335
|
+
|
336
|
+
```ruby
|
337
|
+
require 'multi_mail/sendgrid/sender'
|
338
|
+
|
339
|
+
Mail.deliver do
|
340
|
+
delivery_method MultiMail::Sender::SendGrid, :api_user => 'username', :api_key => 'password'
|
341
|
+
...
|
342
|
+
end
|
343
|
+
```
|
344
|
+
|
345
|
+
You may also pass a `x-smtpapi` option to `delivery_method` ([see SendGrid's documentation](http://sendgrid.com/docs/API_Reference/Web_API/mail.html)).
|
346
|
+
|
123
347
|
## Bugs? Questions?
|
124
348
|
|
125
349
|
This gem's main repository is on GitHub: [http://github.com/opennorth/multi_mail](http://github.com/opennorth/multi_mail), where your contributions, forks, bug reports, feature requests, and feedback are greatly welcomed.
|
data/Rakefile
CHANGED
@@ -48,17 +48,9 @@ task :mailgun do
|
|
48
48
|
end
|
49
49
|
|
50
50
|
if catch_all_route
|
51
|
-
action =
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
if action
|
56
|
-
bin_url = $1
|
57
|
-
else
|
58
|
-
bin_url, action = bin_url_and_action
|
59
|
-
puts "Updating the catch_all() route..."
|
60
|
-
JSON.load(RestClient.put("#{base_url}/routes/#{catch_all_route['id']}", :action => action))
|
61
|
-
end
|
51
|
+
bin_url, action = bin_url_and_action
|
52
|
+
puts "Updating the catch_all() route..."
|
53
|
+
JSON.load(RestClient.put("#{base_url}/routes/#{catch_all_route['id']}", :action => action))
|
62
54
|
else
|
63
55
|
bin_url, action = bin_url_and_action
|
64
56
|
puts "Creating a catch_all() route..."
|
@@ -77,7 +69,7 @@ task :mandrill do
|
|
77
69
|
|
78
70
|
if domain
|
79
71
|
domain_name = domain['domain']
|
80
|
-
routes = api.inbound.routes
|
72
|
+
routes = api.inbound.routes(domain_name)
|
81
73
|
match = routes.find{|route| route['pattern'] == '*'}
|
82
74
|
|
83
75
|
puts "The MX for #{domain_name} is not valid" unless domain['valid_mx']
|
@@ -95,18 +87,45 @@ task :postmark do
|
|
95
87
|
require 'rest-client'
|
96
88
|
|
97
89
|
api = Postmark::ApiClient.new(credentials[:postmark_api_key])
|
98
|
-
|
99
90
|
info = api.server_info
|
100
91
|
|
101
|
-
|
102
|
-
|
92
|
+
bin_name = JSON.load(RestClient.post('http://requestb.in/api/v1/bins', {}))['name']
|
93
|
+
url = "http://requestb.in/#{bin_name}"
|
94
|
+
puts "Setting the POST URL..."
|
95
|
+
api.update_server_info :inbound_hook_url => url
|
96
|
+
|
97
|
+
puts "#{info[:inbound_hash]}@inbound.postmarkapp.com POSTs to #{url}?inspect"
|
98
|
+
end
|
99
|
+
|
100
|
+
desc 'Create a SendGrid route forwarding to a postbin'
|
101
|
+
task :sendgrid do
|
102
|
+
require 'json'
|
103
|
+
require 'rest-client'
|
104
|
+
require 'sendgrid_webapi'
|
105
|
+
|
106
|
+
api = SendGridWebApi::Client.new(credentials[:sendgrid_username], credentials[:sendgrid_password])
|
107
|
+
routes = api.parse_email.get['parse']
|
108
|
+
|
109
|
+
if routes.empty? && ENV['DOMAIN'].nil?
|
110
|
+
abort 'usage: DOMAIN=example.com bundle exec rake sendgrid'
|
111
|
+
end
|
112
|
+
|
113
|
+
domain_name = if routes.any?
|
114
|
+
routes.first['hostname']
|
103
115
|
else
|
104
|
-
|
105
|
-
url = "http://requestb.in/#{bin_name}"
|
106
|
-
api.update_server_info :inbound_hook_url => url
|
116
|
+
ENV['DOMAIN']
|
107
117
|
end
|
108
118
|
|
109
|
-
|
119
|
+
bin_name = JSON.load(RestClient.post('http://requestb.in/api/v1/bins', {}))['name']
|
120
|
+
url = "http://requestb.in/#{bin_name}"
|
121
|
+
puts "Setting the POST URL..."
|
122
|
+
result = api.parse_email.set(:hostname => domain_name, :url => url, :spam_check => 0)
|
123
|
+
|
124
|
+
if result['error']
|
125
|
+
puts "HTTP #{result['error']['code']} #{result['error']['message']}"
|
126
|
+
else
|
127
|
+
puts "#{domain_name} POSTs to #{url}?inspect"
|
128
|
+
end
|
110
129
|
end
|
111
130
|
|
112
131
|
desc 'POST a test fixture to an URL'
|
@@ -6,7 +6,7 @@ module MultiMail
|
|
6
6
|
# that a request originates from Cloudmailin.
|
7
7
|
#
|
8
8
|
# @see http://docs.cloudmailin.com/receiving_email/securing_your_email_url_target/
|
9
|
-
class Cloudmailin
|
9
|
+
class Cloudmailin
|
10
10
|
include MultiMail::Receiver::Base
|
11
11
|
|
12
12
|
recognizes :http_post_format
|
@@ -37,21 +37,11 @@ module MultiMail
|
|
37
37
|
# `helo_domain` and `remote_ip`.
|
38
38
|
[message]
|
39
39
|
when 'multipart', 'json'
|
40
|
-
headers = Multimap.new
|
41
|
-
params['headers'].each do |key,value|
|
42
|
-
if Array === value
|
43
|
-
value.each do |v|
|
44
|
-
headers[key] = v
|
45
|
-
end
|
46
|
-
else
|
47
|
-
headers[key] = value
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
40
|
# Mail changes `self`.
|
41
|
+
headers = self.class.multimap(params['headers'])
|
52
42
|
http_post_format = @http_post_format
|
53
|
-
|
54
43
|
this = self
|
44
|
+
|
55
45
|
message = Mail.new do
|
56
46
|
headers headers
|
57
47
|
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module MultiMail
|
2
|
+
module Message
|
3
|
+
# @see http://documentation.mailgun.com/api-sending.html
|
4
|
+
class Mailgun < MultiMail::Message::Base
|
5
|
+
# Returns the message headers in Mailgun format.
|
6
|
+
#
|
7
|
+
# @return [Multimap] the message headers in Mailgun format
|
8
|
+
def mailgun_headers
|
9
|
+
hash = Multimap.new
|
10
|
+
header_fields.each do |field|
|
11
|
+
key = field.name.downcase
|
12
|
+
unless %w(from to cc bcc subject message-id).include?(key)
|
13
|
+
hash["h:#{field.name}"] = field.value
|
14
|
+
end
|
15
|
+
end
|
16
|
+
hash
|
17
|
+
end
|
18
|
+
|
19
|
+
# Returns the message's attachments in Mailgun format.
|
20
|
+
#
|
21
|
+
# @return [Multimap] the attachments in Mailgun format
|
22
|
+
# @see http://documentation.mailgun.com/user_manual.html#inline-image
|
23
|
+
def mailgun_attachments
|
24
|
+
hash = Multimap.new
|
25
|
+
attachments.each do |attachment|
|
26
|
+
key = attachment.content_type.start_with?('image/') ? 'inline' : 'attachment'
|
27
|
+
hash[key] = Faraday::UploadIO.new(StringIO.new(attachment.body.decoded), attachment.content_type, attachment.filename)
|
28
|
+
end
|
29
|
+
hash
|
30
|
+
end
|
31
|
+
|
32
|
+
# Returns the message as parameters to POST to Mailgun.
|
33
|
+
#
|
34
|
+
# @return [Hash] the message as parameters to POST to Mailgun
|
35
|
+
def to_mailgun_hash
|
36
|
+
hash = Multimap.new
|
37
|
+
|
38
|
+
%w(from subject).each do |field|
|
39
|
+
if self[field]
|
40
|
+
hash[field] = self[field].value
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
%w(to cc bcc).each do |field|
|
45
|
+
if self[field]
|
46
|
+
if self[field].value.respond_to?(:each)
|
47
|
+
self[field].value.each do |value|
|
48
|
+
hash[field] = value
|
49
|
+
end
|
50
|
+
else
|
51
|
+
hash[field] = self[field].value
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
if body_text && !body_text.empty?
|
57
|
+
hash['text'] = body_text
|
58
|
+
end
|
59
|
+
if body_html && !body_html.empty?
|
60
|
+
hash['html'] = body_html
|
61
|
+
end
|
62
|
+
|
63
|
+
normalize(hash.merge(mailgun_attachments).merge(mailgun_headers).to_hash)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|