multi_mail 0.1.3 → 0.1.4
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/.gitignore +0 -1
- data/.rspec +2 -0
- data/.travis.yml +2 -3
- data/.yardopts +0 -1
- data/Gemfile +1 -1
- data/LICENSE +1 -1
- data/README.md +192 -31
- data/lib/multi_mail.rb +4 -2
- data/lib/multi_mail/cloudmailin/message.rb +7 -0
- data/lib/multi_mail/cloudmailin/receiver.rb +7 -7
- data/lib/multi_mail/mailgun/message.rb +2 -0
- data/lib/multi_mail/mailgun/receiver.rb +18 -18
- data/lib/multi_mail/mailgun/sender.rb +1 -1
- data/lib/multi_mail/mandrill/message.rb +2 -0
- data/lib/multi_mail/mandrill/receiver.rb +10 -10
- data/lib/multi_mail/mandrill/sender.rb +28 -6
- data/lib/multi_mail/postmark/message.rb +2 -0
- data/lib/multi_mail/postmark/receiver.rb +13 -5
- data/lib/multi_mail/postmark/sender.rb +22 -2
- data/lib/multi_mail/sendgrid/message.rb +2 -0
- data/lib/multi_mail/sendgrid/receiver.rb +8 -7
- data/lib/multi_mail/version.rb +1 -1
- data/multi_mail.gemspec +13 -15
- data/spec/cloudmailin/receiver_spec.rb +5 -5
- data/spec/mailgun/receiver_spec.rb +8 -8
- data/spec/mandrill/receiver_spec.rb +8 -8
- data/spec/mandrill/sender_spec.rb +53 -17
- data/spec/postmark/receiver_spec.rb +5 -5
- data/spec/postmark/sender_spec.rb +48 -0
- data/spec/sendgrid/receiver_spec.rb +5 -5
- data/spec/sendgrid/sender_spec.rb +3 -3
- data/spec/simple/receiver_spec.rb +1 -1
- data/spec/spec_helper.rb +5 -13
- metadata +17 -58
- data/USAGE +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a14ecc758499e8df176c767f62299f37df33cb18
|
4
|
+
data.tar.gz: 32b938fec60cb8e6ae4b458bc5e88ccdcfd5237f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 00473360787d54704565c3c4be5c25af31e27254fc64495ea229e59d934a64f8a645bd43b0687a39ebba94f5b488a0aa76192aee6c6b24b5384a79c4d501fa10
|
7
|
+
data.tar.gz: 7b43f573c40d70d6eab2f2a5f5fc2456f3b3cff2941701f2ec748ee1a8b509806a8828f230ae2dfaddc93da0f9e777487bad7da586084c685c0e3078d419ee6e
|
data/.gitignore
CHANGED
data/.rspec
ADDED
data/.travis.yml
CHANGED
data/.yardopts
CHANGED
data/Gemfile
CHANGED
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
-
# MultiMail:
|
1
|
+
# MultiMail: Easily switch email APIs
|
2
2
|
|
3
|
-
[](https://badge.fury.io/rb/multi_mail)
|
4
|
+
[](https://travis-ci.org/jpmckinney/multi_mail)
|
5
|
+
[](https://gemnasium.com/jpmckinney/multi_mail)
|
6
|
+
[](https://coveralls.io/r/jpmckinney/multi_mail)
|
7
|
+
[](https://codeclimate.com/github/jpmckinney/multi_mail)
|
7
8
|
|
8
9
|
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
|
|
@@ -12,7 +13,7 @@ Many providers offer APIs to send, receive, and parse email. MultiMail lets you
|
|
12
13
|
* [Mandrill](http://mandrill.com/): [Example](#mandrill)
|
13
14
|
* [Postmark](http://postmarkapp.com/): [Example](#postmark)
|
14
15
|
* [SendGrid](http://sendgrid.com/): [Example](#sendgrid)
|
15
|
-
* MTA like [Postfix](
|
16
|
+
* MTA like [Postfix](https://en.wikipedia.org/wiki/Postfix_\(software\)) or [qmail](https://en.wikipedia.org/wiki/Qmail): [Example](#mta)
|
16
17
|
|
17
18
|
## Usage
|
18
19
|
|
@@ -30,7 +31,7 @@ messages = service.process(data)
|
|
30
31
|
|
31
32
|
`messages` will be an array of [Mail::Message](https://github.com/mikel/mail) instances.
|
32
33
|
|
33
|
-
Any non-standard parameters provided by an API are added to each message as
|
34
|
+
Any non-standard parameters provided by an API are added to each message as an instance variable. 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`. The instance variable is the non-standard parameter in lowercase with underscores instead of hyphens.
|
34
35
|
|
35
36
|
### Outgoing
|
36
37
|
|
@@ -41,7 +42,19 @@ require 'multi_mail'
|
|
41
42
|
|
42
43
|
message = Mail.new do
|
43
44
|
delivery_method MultiMail::Sender::Postmark, :api_key => 'your-api-key'
|
44
|
-
|
45
|
+
|
46
|
+
to 'user@wookiecookies.com'
|
47
|
+
from 'Chewbacca <chewy@wookiecookies.com>'
|
48
|
+
subject 'How About Some Cookies?'
|
49
|
+
|
50
|
+
text_part do
|
51
|
+
body 'I am just some plain text!'
|
52
|
+
end
|
53
|
+
|
54
|
+
html_part do
|
55
|
+
content_type 'text/html; charset=UTF-8'
|
56
|
+
body '<html><body><h1>I am a header</h1><p>And I am a paragraph</p></body></html>'
|
57
|
+
end
|
45
58
|
end
|
46
59
|
|
47
60
|
message.deliver
|
@@ -51,7 +64,18 @@ Alternatively, instead of setting `delivery_method` during initialization, you c
|
|
51
64
|
|
52
65
|
```ruby
|
53
66
|
message = Mail.new do
|
54
|
-
|
67
|
+
to 'user@wookiecookies.com'
|
68
|
+
from 'Chewbacca <chewy@wookiecookies.com>'
|
69
|
+
subject 'How About Some Cookies?'
|
70
|
+
|
71
|
+
text_part do
|
72
|
+
body 'I am just some plain text!'
|
73
|
+
end
|
74
|
+
|
75
|
+
html_part do
|
76
|
+
content_type 'text/html; charset=UTF-8'
|
77
|
+
body '<html><body><h1>I am a header</h1><p>And I am a paragraph</p></body></html>'
|
78
|
+
end
|
55
79
|
end
|
56
80
|
|
57
81
|
message.delivery_method MultiMail::Sender::Postmark, :api_key => 'your-api-key'
|
@@ -67,6 +91,78 @@ Mail.defaults do
|
|
67
91
|
end
|
68
92
|
```
|
69
93
|
|
94
|
+
#### ActionMailer
|
95
|
+
|
96
|
+
First, add the delivery method to ActionMailer:
|
97
|
+
|
98
|
+
```
|
99
|
+
ActionMailer::Base.add_delivery_method :postmark, MultiMail::Sender::Postmark, :api_key => 'your-api-key'
|
100
|
+
```
|
101
|
+
|
102
|
+
Set the default delivery method for all ActionMailer classes in `config/environments/<ENV>.rb`:
|
103
|
+
|
104
|
+
```
|
105
|
+
config.action_mailer.delivery_method = :postmark
|
106
|
+
```
|
107
|
+
|
108
|
+
Or, set the delivery method in an ActionMailer class:
|
109
|
+
|
110
|
+
```
|
111
|
+
class UserMailer < ActionMailer::Base
|
112
|
+
default :delivery_method => :postmark
|
113
|
+
end
|
114
|
+
```
|
115
|
+
|
116
|
+
Or, set the delivery method in an ActionMailer method:
|
117
|
+
|
118
|
+
```
|
119
|
+
class UserMailer < ActionMailer::Base
|
120
|
+
def welcome_email(user)
|
121
|
+
mail({
|
122
|
+
:to => user.email,
|
123
|
+
:subject => 'Welcome to My Awesome Site',
|
124
|
+
:delivery_method => :postmark,
|
125
|
+
})
|
126
|
+
end
|
127
|
+
end
|
128
|
+
```
|
129
|
+
|
130
|
+
Set the delivery method's default options for all ActionMailer classes in `config/environments/<ENV>.rb`:
|
131
|
+
|
132
|
+
```
|
133
|
+
config.action_mailer.postmark_settings = {:api_key => 'your-api-key'}
|
134
|
+
```
|
135
|
+
|
136
|
+
Or, set the delivery method's options in an ActionMailer method:
|
137
|
+
|
138
|
+
```
|
139
|
+
class UserMailer < ActionMailer::Base
|
140
|
+
def welcome_email(mail)
|
141
|
+
mail({
|
142
|
+
:to => user.email,
|
143
|
+
:subject => 'Welcome to My Awesome Site',
|
144
|
+
:delivery_method_options => {:api_key => 'your-api-key'},
|
145
|
+
})
|
146
|
+
end
|
147
|
+
end
|
148
|
+
```
|
149
|
+
|
150
|
+
Or, set the delivery method's options in an ActionMailer action:
|
151
|
+
|
152
|
+
```
|
153
|
+
class UserMailer < ActionMailer::Base
|
154
|
+
after_action :set_delivery_method_options
|
155
|
+
|
156
|
+
...
|
157
|
+
|
158
|
+
private
|
159
|
+
|
160
|
+
def set_delivery_method_options
|
161
|
+
mail.delivery_method.settings.merge!({:api_key => 'your-api-key'})
|
162
|
+
end
|
163
|
+
end
|
164
|
+
```
|
165
|
+
|
70
166
|
#### Tagging
|
71
167
|
|
72
168
|
Mailgun, Mandrill and Postmark allow you to tag messages in order to accumulate statistics by tag, which will be accessible through their user interface:
|
@@ -90,19 +186,19 @@ Mailgun accepts at most [3 tags](http://documentation.mailgun.com/user_manual.ht
|
|
90
186
|
|
91
187
|
#### Track opens and clicks
|
92
188
|
|
93
|
-
Mailgun and
|
189
|
+
Mailgun, Mandrill and Postmark allow you to set open tracking, and Mailgun and Mandrill allow you to set click tracking on a per-message basis:
|
94
190
|
|
95
191
|
```ruby
|
96
192
|
require 'multi_mail'
|
97
193
|
|
98
194
|
message = Mail.new do
|
99
195
|
delivery_method MultiMail::Sender::Mailgun,
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
196
|
+
:api_key => 'your-api-key',
|
197
|
+
:domain => 'your-domain.mailgun.org',
|
198
|
+
:track => {
|
199
|
+
:opens => true,
|
200
|
+
:clicks => false,
|
201
|
+
}
|
106
202
|
...
|
107
203
|
end
|
108
204
|
|
@@ -200,7 +296,19 @@ See [Mailgun's documentation](http://documentation.mailgun.net/user_manual.html#
|
|
200
296
|
```ruby
|
201
297
|
Mail.deliver do
|
202
298
|
delivery_method MultiMail::Sender::Mailgun, :api_key => 'your-api-key', :domain => 'your-domain.mailgun.org'
|
203
|
-
|
299
|
+
|
300
|
+
to _to_
|
301
|
+
from _from_
|
302
|
+
subject _subject_
|
303
|
+
|
304
|
+
text_part do
|
305
|
+
body _text_
|
306
|
+
end
|
307
|
+
|
308
|
+
html_part do
|
309
|
+
content_type 'text/html; charset=UTF-8'
|
310
|
+
body _html_
|
311
|
+
end
|
204
312
|
end
|
205
313
|
```
|
206
314
|
|
@@ -213,6 +321,14 @@ You may pass additional arguments to `delivery_method` to use Mailgun-specific f
|
|
213
321
|
* `o:tracking`
|
214
322
|
* `v:`
|
215
323
|
|
324
|
+
```ruby
|
325
|
+
Mail.deliver do
|
326
|
+
delivery_method MultiMail::Sender::Mailgun, :api_key => 'your-api-key', :domain => 'your-domain.mailgun.org',
|
327
|
+
:o:campaign => 'campaign', :o:dkim => 'yes (or no)',...
|
328
|
+
...
|
329
|
+
end
|
330
|
+
```
|
331
|
+
|
216
332
|
## Mandrill
|
217
333
|
|
218
334
|
### Incoming
|
@@ -256,7 +372,19 @@ See [Mandrill's documentation](http://help.mandrill.com/entries/22092308-What-is
|
|
256
372
|
```ruby
|
257
373
|
Mail.deliver do
|
258
374
|
delivery_method MultiMail::Sender::Mandrill, :api_key => 'your-api-key'
|
259
|
-
|
375
|
+
|
376
|
+
to _to_
|
377
|
+
from _from_email_ + _from_name_
|
378
|
+
subject _subject_
|
379
|
+
|
380
|
+
text_part do
|
381
|
+
body _text_
|
382
|
+
end
|
383
|
+
|
384
|
+
html_part do
|
385
|
+
content_type 'text/html; charset=UTF-8'
|
386
|
+
body _html_
|
387
|
+
end
|
260
388
|
end
|
261
389
|
```
|
262
390
|
|
@@ -275,6 +403,16 @@ You may pass additional arguments to `delivery_method` to use Mandrill-specific
|
|
275
403
|
* `async`
|
276
404
|
* `ip_pool`
|
277
405
|
* `send_at`
|
406
|
+
* `template_name`
|
407
|
+
* `template_content`
|
408
|
+
|
409
|
+
```ruby
|
410
|
+
Mail.deliver do
|
411
|
+
delivery_method MultiMail::Sender::Mandrill, :api_key => 'your-api-key',
|
412
|
+
:async => true, :ip_pool => 'main_pool', ...
|
413
|
+
...
|
414
|
+
end
|
415
|
+
```
|
278
416
|
|
279
417
|
## Postmark
|
280
418
|
|
@@ -296,7 +434,19 @@ See [Postmark's documentation](http://developer.postmarkapp.com/developer-inboun
|
|
296
434
|
```ruby
|
297
435
|
Mail.deliver do
|
298
436
|
delivery_method MultiMail::Sender::Postmark, :api_key => 'your-api-key'
|
299
|
-
|
437
|
+
|
438
|
+
to _To_
|
439
|
+
from _From_
|
440
|
+
subject _Subject_
|
441
|
+
|
442
|
+
text_part do
|
443
|
+
body _TextBody_
|
444
|
+
end
|
445
|
+
|
446
|
+
html_part do
|
447
|
+
content_type 'text/html; charset=UTF-8'
|
448
|
+
body _HtmlBody_
|
449
|
+
end
|
300
450
|
end
|
301
451
|
```
|
302
452
|
|
@@ -331,12 +481,33 @@ See [SendGrid's documentation](http://sendgrid.com/docs/API_Reference/Webhooks/p
|
|
331
481
|
```ruby
|
332
482
|
Mail.deliver do
|
333
483
|
delivery_method MultiMail::Sender::SendGrid, :api_user => 'username', :api_key => 'password'
|
334
|
-
|
484
|
+
|
485
|
+
to _to_
|
486
|
+
from _from_ + _fromname_
|
487
|
+
subject _subject_
|
488
|
+
|
489
|
+
text_part do
|
490
|
+
body _text_
|
491
|
+
end
|
492
|
+
|
493
|
+
html_part do
|
494
|
+
content_type 'text/html; charset=UTF-8'
|
495
|
+
body _html_
|
496
|
+
end
|
335
497
|
end
|
336
498
|
```
|
337
499
|
|
338
500
|
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)).
|
339
501
|
|
502
|
+
```ruby
|
503
|
+
Mail.deliver do
|
504
|
+
delivery_method MultiMail::Sender::SendGrid, :api_user => 'username', :api_key => 'password',
|
505
|
+
:x-smtpapi => '{ "some_json" : "with_some_data" }'
|
506
|
+
...
|
507
|
+
end
|
508
|
+
```
|
509
|
+
|
510
|
+
|
340
511
|
## MTA
|
341
512
|
|
342
513
|
### Incoming
|
@@ -367,16 +538,6 @@ service = MultiMail::Receiver.new({
|
|
367
538
|
|
368
539
|
It's recommended to use a secret key, to ensure that the requests are sent by Postfix and qmail and not by other sources on the internet.
|
369
540
|
|
370
|
-
## Bugs? Questions?
|
371
|
-
|
372
|
-
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.
|
373
|
-
|
374
|
-
## Acknowledgements
|
375
|
-
|
376
|
-
This gem is developed by [Open North](http://www.opennorth.ca/) through a partnership with the [Participatory Politics Foundation](http://www.participatorypolitics.org/).
|
377
|
-
|
378
|
-
## Copyright
|
379
|
-
|
380
541
|
This gem re-uses code from [fog](https://github.com/fog/fog), released under the MIT license.
|
381
542
|
|
382
|
-
Copyright (c) 2012
|
543
|
+
Copyright (c) 2012 James McKinney, released under the MIT license
|
data/lib/multi_mail.rb
CHANGED
@@ -2,7 +2,6 @@ require 'base64'
|
|
2
2
|
require 'cgi'
|
3
3
|
require 'json'
|
4
4
|
require 'openssl'
|
5
|
-
require 'iconv' unless RUBY_VERSION >= '1.9'
|
6
5
|
|
7
6
|
require 'faraday'
|
8
7
|
require 'mail'
|
@@ -23,6 +22,8 @@ module MultiMail
|
|
23
22
|
class InvalidAPIKey < InvalidRequest; end
|
24
23
|
# Raise if a message is invalid.
|
25
24
|
class InvalidMessage < InvalidRequest; end
|
25
|
+
# Raise if a message template is invalid.
|
26
|
+
class InvalidTemplate < InvalidRequest; end
|
26
27
|
|
27
28
|
# Raise if a message header is invalid
|
28
29
|
class InvalidHeader < InvalidMessage; end
|
@@ -60,7 +61,7 @@ module MultiMail
|
|
60
61
|
#
|
61
62
|
# @param [Mail::Message] message a message
|
62
63
|
# @return [Boolean] whether a message is an autoresponse
|
63
|
-
# @see https://github.com/
|
64
|
+
# @see https://github.com/jpmckinney/multi_mail/wiki/Detecting-autoresponders
|
64
65
|
def autoresponse?(message)
|
65
66
|
!!(
|
66
67
|
# If any of the following headers are present and have the given value.
|
@@ -106,6 +107,7 @@ require 'multi_mail/receiver'
|
|
106
107
|
require 'multi_mail/message/base'
|
107
108
|
require 'multi_mail/receiver/base'
|
108
109
|
require 'multi_mail/sender/base'
|
110
|
+
require 'multi_mail/cloudmailin/message'
|
109
111
|
require 'multi_mail/mailgun/message'
|
110
112
|
require 'multi_mail/mailgun/sender'
|
111
113
|
require 'multi_mail/mandrill/message'
|
@@ -24,17 +24,17 @@ module MultiMail
|
|
24
24
|
end
|
25
25
|
|
26
26
|
# @param [Hash] params the content of Cloudmailin's webhook
|
27
|
-
# @return [Array<
|
27
|
+
# @return [Array<MultiMail::Message::Cloudmailin>] messages
|
28
28
|
# @see http://docs.cloudmailin.com/http_post_formats/multipart/
|
29
29
|
# @see http://docs.cloudmailin.com/http_post_formats/json/
|
30
30
|
# @see http://docs.cloudmailin.com/http_post_formats/raw/
|
31
31
|
def transform(params)
|
32
32
|
case @http_post_format
|
33
33
|
when 'raw', '', nil
|
34
|
-
message = self.class.condense(Mail.new(params['message']))
|
34
|
+
message = self.class.condense(MultiMail::Message::Cloudmailin.new(Mail.new(params['message'])))
|
35
35
|
|
36
36
|
# Extra Cloudmailin parameters.
|
37
|
-
message
|
37
|
+
message.spf_result = params['envelope']['spf']['result']
|
38
38
|
|
39
39
|
if @attachment_store
|
40
40
|
params['attachments'].each do |_,attachment|
|
@@ -52,7 +52,7 @@ module MultiMail
|
|
52
52
|
attachment_store = @attachment_store
|
53
53
|
this = self
|
54
54
|
|
55
|
-
message =
|
55
|
+
message = MultiMail::Message::Cloudmailin.new do
|
56
56
|
headers headers
|
57
57
|
|
58
58
|
text_part do
|
@@ -92,8 +92,8 @@ module MultiMail
|
|
92
92
|
|
93
93
|
# Extra Cloudmailin parameters. The multipart format uses CRLF whereas
|
94
94
|
# the JSON format uses LF. Normalize to LF.
|
95
|
-
message
|
96
|
-
message
|
95
|
+
message.reply_plain = params['reply_plain'].gsub("\r\n", "\n")
|
96
|
+
message.spf_result = params['envelope']['spf']['result']
|
97
97
|
|
98
98
|
[message]
|
99
99
|
else
|
@@ -104,7 +104,7 @@ module MultiMail
|
|
104
104
|
# @param [Mail::Message] message a message
|
105
105
|
# @return [Boolean] whether the message is spam
|
106
106
|
def spam?(message)
|
107
|
-
message
|
107
|
+
message.spf_result == 'fail'
|
108
108
|
end
|
109
109
|
end
|
110
110
|
end
|