multi_mail 0.1.0 → 0.1.1
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/README.md +57 -34
- data/bin/multi_mail_post +71 -0
- data/lib/mail_ext/message.rb +11 -0
- data/lib/multi_mail.rb +25 -8
- data/lib/multi_mail/cloudmailin/receiver.rb +24 -3
- data/lib/multi_mail/mailgun/message.rb +6 -1
- data/lib/multi_mail/mailgun/sender.rb +4 -4
- data/lib/multi_mail/mandrill/message.rb +4 -3
- data/lib/multi_mail/mandrill/sender.rb +9 -2
- data/lib/multi_mail/message/base.rb +14 -0
- data/lib/multi_mail/postmark/message.rb +74 -0
- data/lib/multi_mail/postmark/receiver.rb +2 -1
- data/lib/multi_mail/postmark/sender.rb +54 -24
- data/lib/multi_mail/sendgrid/message.rb +4 -4
- data/lib/multi_mail/sendgrid/sender.rb +2 -2
- data/lib/multi_mail/simple/receiver.rb +31 -1
- data/lib/multi_mail/version.rb +1 -1
- data/multi_mail.gemspec +2 -1
- data/spec/cloudmailin/receiver_spec.rb +89 -84
- data/spec/fixtures/cloudmailin/json/attachment_store.txt +65 -0
- data/spec/fixtures/cloudmailin/multipart/attachment_store.txt +174 -0
- data/spec/fixtures/cloudmailin/raw/attachment_store.txt +162 -0
- data/spec/fixtures/mailgun/parsed/valid.txt +107 -101
- data/spec/fixtures/simple/invalid.txt +4 -0
- data/spec/fixtures/simple/missing.txt +4 -0
- data/spec/fixtures/simple/valid.txt +1 -1
- data/spec/mail_ext/message_spec.rb +45 -0
- data/spec/mailgun/message_spec.rb +38 -8
- data/spec/mailgun/receiver_spec.rb +104 -110
- data/spec/mailgun/sender_spec.rb +13 -7
- data/spec/mandrill/message_spec.rb +25 -1
- data/spec/mandrill/receiver_spec.rb +81 -83
- data/spec/mandrill/sender_spec.rb +13 -6
- data/spec/message/base_spec.rb +33 -1
- data/spec/postmark/message_spec.rb +292 -0
- data/spec/postmark/receiver_spec.rb +46 -48
- data/spec/postmark/sender_spec.rb +10 -10
- data/spec/sendgrid/message_spec.rb +6 -1
- data/spec/sendgrid/receiver_spec.rb +56 -58
- data/spec/sendgrid/sender_spec.rb +9 -7
- data/spec/service_spec.rb +1 -1
- data/spec/simple/receiver_spec.rb +38 -25
- data/spec/spec_helper.rb +6 -8
- metadata +185 -203
@@ -0,0 +1,4 @@
|
|
1
|
+
HTTP/1.1 200 OK
|
2
|
+
Content-Type: application/x-www-form-urlencoded
|
3
|
+
|
4
|
+
message=Return-Path%3A+%3Cjames%40opennorth.ca%3E%0AReceived%3A+from+%5B192.168.0.104%5D+%28%5B69.165.204.186%5D%29%0A++++++++by+mx.google.com+with+ESMTPS+id+ez8sm24876706igb.17.2012.12.27.12.25.27%0A++++++++%28version%3DTLSv1%2FSSLv3+cipher%3DOTHER%29%3B%0A++++++++Thu%2C+27+Dec+2012+12%3A25%3A28+-0800+%28PST%29%0AFrom%3A+James+McKinney+%3Cjames%40opennorth.ca%3E%0AContent-Type%3A+multipart%2Falternative%3B+boundary%3D%22Apple-Mail%3D_9BF84D11-673B-4F5C-B5F7-46FA0E73983F%22%0ASubject%3A+Test%0ADate%3A+Thu%2C+27+Dec+2012+15%3A25%3A37+-0500%0AMessage-Id%3A+%3C24D8D853-1C75-4F64-ABA5-33A6C81471FA%40opennorth.ca%3E%0ATo%3A+foo%2Bbar%40govkit.org%0AMime-Version%3A+1.0+%28Apple+Message+framework+v1283%29%0AX-Mailer%3A+Apple+Mail+%282.1283%29%0A%0A%0A--Apple-Mail%3D_9BF84D11-673B-4F5C-B5F7-46FA0E73983F%0AContent-Transfer-Encoding%3A+7bit%0AContent-Type%3A+text%2Fplain%3B%0A++charset%3Dus-ascii%0A%0Abold+text%0A%0A%0A%3E+multiline%0A%3E+quoted%0A%3E+text%0A%0A--%0ASignature+block%0A--Apple-Mail%3D_9BF84D11-673B-4F5C-B5F7-46FA0E73983F%0AContent-Transfer-Encoding%3A+7bit%0AContent-Type%3A+text%2Fhtml%3B%0A++charset%3Dus-ascii%0A%0A%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody+style%3D%22word-wrap%3A+break-word%3B+-webkit-nbsp-mode%3A+space%3B+-webkit-line-break%3A+after-white-space%3B+%22%3E%3Cdiv%3E%3Cb%3Ebold+text%3C%2Fb%3E%3C%2Fdiv%3E%3Cdiv%3E%3Cbr%3E%3C%2Fdiv%3E%3Cdiv%3E%3Cblockquote+type%3D%22cite%22%3E%3C%2Fblockquote%3E%3C%2Fdiv%3E%3Cdiv%3E%3Cblockquote+type%3D%22cite%22%3Emultiline%3C%2Fblockquote%3E%3C%2Fdiv%3E%3Cblockquote+type%3D%22cite%22%3E%3Cdiv%3Equoted%3C%2Fdiv%3E%3Cdiv%3Etext%3C%2Fdiv%3E%3C%2Fblockquote%3E%3Cbr%3E%3Cdiv%3E--%3C%2Fdiv%3E%3Cdiv%3ESignature+block%3C%2Fdiv%3E%3C%2Fbody%3E%3C%2Fhtml%3E%0A--Apple-Mail%3D_9BF84D11-673B-4F5C-B5F7-46FA0E73983F--%0A×tamp=1366071615&token=5o56tmpwd3dnwthehwclemd-i-7u2gv9vb3u745ywj67d0mc87&signature=xxx
|
@@ -0,0 +1,4 @@
|
|
1
|
+
HTTP/1.1 200 OK
|
2
|
+
Content-Type: application/x-www-form-urlencoded
|
3
|
+
|
4
|
+
message=Return-Path%3A+%3Cjames%40opennorth.ca%3E%0AReceived%3A+from+%5B192.168.0.104%5D+%28%5B69.165.204.186%5D%29%0A++++++++by+mx.google.com+with+ESMTPS+id+ez8sm24876706igb.17.2012.12.27.12.25.27%0A++++++++%28version%3DTLSv1%2FSSLv3+cipher%3DOTHER%29%3B%0A++++++++Thu%2C+27+Dec+2012+12%3A25%3A28+-0800+%28PST%29%0AFrom%3A+James+McKinney+%3Cjames%40opennorth.ca%3E%0AContent-Type%3A+multipart%2Falternative%3B+boundary%3D%22Apple-Mail%3D_9BF84D11-673B-4F5C-B5F7-46FA0E73983F%22%0ASubject%3A+Test%0ADate%3A+Thu%2C+27+Dec+2012+15%3A25%3A37+-0500%0AMessage-Id%3A+%3C24D8D853-1C75-4F64-ABA5-33A6C81471FA%40opennorth.ca%3E%0ATo%3A+foo%2Bbar%40govkit.org%0AMime-Version%3A+1.0+%28Apple+Message+framework+v1283%29%0AX-Mailer%3A+Apple+Mail+%282.1283%29%0A%0A%0A--Apple-Mail%3D_9BF84D11-673B-4F5C-B5F7-46FA0E73983F%0AContent-Transfer-Encoding%3A+7bit%0AContent-Type%3A+text%2Fplain%3B%0A++charset%3Dus-ascii%0A%0Abold+text%0A%0A%0A%3E+multiline%0A%3E+quoted%0A%3E+text%0A%0A--%0ASignature+block%0A--Apple-Mail%3D_9BF84D11-673B-4F5C-B5F7-46FA0E73983F%0AContent-Transfer-Encoding%3A+7bit%0AContent-Type%3A+text%2Fhtml%3B%0A++charset%3Dus-ascii%0A%0A%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody+style%3D%22word-wrap%3A+break-word%3B+-webkit-nbsp-mode%3A+space%3B+-webkit-line-break%3A+after-white-space%3B+%22%3E%3Cdiv%3E%3Cb%3Ebold+text%3C%2Fb%3E%3C%2Fdiv%3E%3Cdiv%3E%3Cbr%3E%3C%2Fdiv%3E%3Cdiv%3E%3Cblockquote+type%3D%22cite%22%3E%3C%2Fblockquote%3E%3C%2Fdiv%3E%3Cdiv%3E%3Cblockquote+type%3D%22cite%22%3Emultiline%3C%2Fblockquote%3E%3C%2Fdiv%3E%3Cblockquote+type%3D%22cite%22%3E%3Cdiv%3Equoted%3C%2Fdiv%3E%3Cdiv%3Etext%3C%2Fdiv%3E%3C%2Fblockquote%3E%3Cbr%3E%3Cdiv%3E--%3C%2Fdiv%3E%3Cdiv%3ESignature+block%3C%2Fdiv%3E%3C%2Fbody%3E%3C%2Fhtml%3E%0A--Apple-Mail%3D_9BF84D11-673B-4F5C-B5F7-46FA0E73983F--%0A
|
@@ -1,4 +1,4 @@
|
|
1
1
|
HTTP/1.1 200 OK
|
2
2
|
Content-Type: application/x-www-form-urlencoded
|
3
3
|
|
4
|
-
message=Return-Path%3A+%3Cjames%40opennorth.ca%3E%0AReceived%3A+from+%5B192.168.0.104%5D+%28%5B69.165.204.186%5D%29%0A++++++++by+mx.google.com+with+ESMTPS+id+ez8sm24876706igb.17.2012.12.27.12.25.27%0A++++++++%28version%3DTLSv1%2FSSLv3+cipher%3DOTHER%29%3B%0A++++++++Thu%2C+27+Dec+2012+12%3A25%3A28+-0800+%28PST%29%0AFrom%3A+James+McKinney+%3Cjames%40opennorth.ca%3E%0AContent-Type%3A+multipart%2Falternative%3B+boundary%3D%22Apple-Mail%3D_9BF84D11-673B-4F5C-B5F7-46FA0E73983F%22%0ASubject%3A+Test%0ADate%3A+Thu%2C+27+Dec+2012+15%3A25%3A37+-0500%0AMessage-Id%3A+%3C24D8D853-1C75-4F64-ABA5-33A6C81471FA%40opennorth.ca%3E%0ATo%3A+foo%2Bbar%40govkit.org%0AMime-Version%3A+1.0+%28Apple+Message+framework+v1283%29%0AX-Mailer%3A+Apple+Mail+%282.1283%29%0A%0A%0A--Apple-Mail%3D_9BF84D11-673B-4F5C-B5F7-46FA0E73983F%0AContent-Transfer-Encoding%3A+7bit%0AContent-Type%3A+text%2Fplain%3B%0A++charset%3Dus-ascii%0A%0Abold+text%0A%0A%0A%3E+multiline%0A%3E+quoted%0A%3E+text%0A%0A--%0ASignature+block%0A--Apple-Mail%3D_9BF84D11-673B-4F5C-B5F7-46FA0E73983F%0AContent-Transfer-Encoding%3A+7bit%0AContent-Type%3A+text%2Fhtml%3B%0A++charset%3Dus-ascii%0A%0A%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody+style%3D%22word-wrap%3A+break-word%3B+-webkit-nbsp-mode%3A+space%3B+-webkit-line-break%3A+after-white-space%3B+%22%3E%3Cdiv%3E%3Cb%3Ebold+text%3C%2Fb%3E%3C%2Fdiv%3E%3Cdiv%3E%3Cbr%3E%3C%2Fdiv%3E%3Cdiv%3E%3Cblockquote+type%3D%22cite%22%3E%3C%2Fblockquote%3E%3C%2Fdiv%3E%3Cdiv%3E%3Cblockquote+type%3D%22cite%22%3Emultiline%3C%2Fblockquote%3E%3C%2Fdiv%3E%3Cblockquote+type%3D%22cite%22%3E%3Cdiv%3Equoted%3C%2Fdiv%3E%3Cdiv%3Etext%3C%2Fdiv%3E%3C%2Fblockquote%3E%3Cbr%3E%3Cdiv%3E--%3C%2Fdiv%3E%3Cdiv%3ESignature+block%3C%2Fdiv%3E%3C%2Fbody%3E%3C%2Fhtml%3E%0A--Apple-Mail%3D_9BF84D11-673B-4F5C-B5F7-46FA0E73983F--%0A
|
4
|
+
message=Return-Path%3A+%3Cjames%40opennorth.ca%3E%0AReceived%3A+from+%5B192.168.0.104%5D+%28%5B69.165.204.186%5D%29%0A++++++++by+mx.google.com+with+ESMTPS+id+ez8sm24876706igb.17.2012.12.27.12.25.27%0A++++++++%28version%3DTLSv1%2FSSLv3+cipher%3DOTHER%29%3B%0A++++++++Thu%2C+27+Dec+2012+12%3A25%3A28+-0800+%28PST%29%0AFrom%3A+James+McKinney+%3Cjames%40opennorth.ca%3E%0AContent-Type%3A+multipart%2Falternative%3B+boundary%3D%22Apple-Mail%3D_9BF84D11-673B-4F5C-B5F7-46FA0E73983F%22%0ASubject%3A+Test%0ADate%3A+Thu%2C+27+Dec+2012+15%3A25%3A37+-0500%0AMessage-Id%3A+%3C24D8D853-1C75-4F64-ABA5-33A6C81471FA%40opennorth.ca%3E%0ATo%3A+foo%2Bbar%40govkit.org%0AMime-Version%3A+1.0+%28Apple+Message+framework+v1283%29%0AX-Mailer%3A+Apple+Mail+%282.1283%29%0A%0A%0A--Apple-Mail%3D_9BF84D11-673B-4F5C-B5F7-46FA0E73983F%0AContent-Transfer-Encoding%3A+7bit%0AContent-Type%3A+text%2Fplain%3B%0A++charset%3Dus-ascii%0A%0Abold+text%0A%0A%0A%3E+multiline%0A%3E+quoted%0A%3E+text%0A%0A--%0ASignature+block%0A--Apple-Mail%3D_9BF84D11-673B-4F5C-B5F7-46FA0E73983F%0AContent-Transfer-Encoding%3A+7bit%0AContent-Type%3A+text%2Fhtml%3B%0A++charset%3Dus-ascii%0A%0A%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody+style%3D%22word-wrap%3A+break-word%3B+-webkit-nbsp-mode%3A+space%3B+-webkit-line-break%3A+after-white-space%3B+%22%3E%3Cdiv%3E%3Cb%3Ebold+text%3C%2Fb%3E%3C%2Fdiv%3E%3Cdiv%3E%3Cbr%3E%3C%2Fdiv%3E%3Cdiv%3E%3Cblockquote+type%3D%22cite%22%3E%3C%2Fblockquote%3E%3C%2Fdiv%3E%3Cdiv%3E%3Cblockquote+type%3D%22cite%22%3Emultiline%3C%2Fblockquote%3E%3C%2Fdiv%3E%3Cblockquote+type%3D%22cite%22%3E%3Cdiv%3Equoted%3C%2Fdiv%3E%3Cdiv%3Etext%3C%2Fdiv%3E%3C%2Fblockquote%3E%3Cbr%3E%3Cdiv%3E--%3C%2Fdiv%3E%3Cdiv%3ESignature+block%3C%2Fdiv%3E%3C%2Fbody%3E%3C%2Fhtml%3E%0A--Apple-Mail%3D_9BF84D11-673B-4F5C-B5F7-46FA0E73983F--%0A×tamp=1366071615&token=5o56tmpwd3dnwthehwclemd-i-7u2gv9vb3u745ywj67d0mc87&signature=bc2ab6c1080d52f2a06928b93f21e86c2d28c548e2ef64354f8ba1a95bb53cd6
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe Mail::Message do
|
4
|
+
# @see https://github.com/mikel/mail/blob/master/spec/mail/message_spec.rb#L491
|
5
|
+
describe 'setting headers' do
|
6
|
+
it 'should accept them in block form' do
|
7
|
+
message = Mail.new do
|
8
|
+
tag 'foo'
|
9
|
+
end
|
10
|
+
message.tag.should == 'foo'
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should accept them in assignment form' do
|
14
|
+
message = Mail.new
|
15
|
+
message.tag = 'foo'
|
16
|
+
message.tag.should == 'foo'
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should accept them in key, value form as symbols' do
|
20
|
+
message = Mail.new
|
21
|
+
message[:tag] = 'foo'
|
22
|
+
message.tag.should == 'foo'
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should accept them in key, value form as strings' do
|
26
|
+
message = Mail.new
|
27
|
+
message['tag'] = 'foo'
|
28
|
+
message.tag.should == 'foo'
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should accept them as a hash with symbols' do
|
32
|
+
message = Mail.new({
|
33
|
+
:tag => 'foo',
|
34
|
+
})
|
35
|
+
message.tag.should == 'foo'
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should accept them as a hash with strings' do
|
39
|
+
message = Mail.new({
|
40
|
+
'tag' => 'foo',
|
41
|
+
})
|
42
|
+
message.tag.should == 'foo'
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
-
require 'multi_mail/mailgun/message'
|
3
2
|
|
4
3
|
describe MultiMail::Message::Mailgun do
|
5
4
|
let :message do
|
@@ -121,6 +120,19 @@ describe MultiMail::Message::Mailgun do
|
|
121
120
|
MultiMail::Message::Mailgun.new
|
122
121
|
end
|
123
122
|
|
123
|
+
let :message_with_one_tag do
|
124
|
+
MultiMail::Message::Mailgun.new do
|
125
|
+
tag 'foo'
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
let :message_with_many_tags do
|
130
|
+
MultiMail::Message::Mailgun.new do
|
131
|
+
tag 'foo'
|
132
|
+
tag 'bar'
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
124
136
|
describe '#mailgun_attachments' do
|
125
137
|
it 'should return the attachments' do
|
126
138
|
attachments = message.mailgun_attachments
|
@@ -196,13 +208,13 @@ describe MultiMail::Message::Mailgun do
|
|
196
208
|
it 'should return the message as Mailgun parameters' do
|
197
209
|
hash = message.to_mailgun_hash
|
198
210
|
|
199
|
-
hash[:from].should
|
200
|
-
hash[:to].should
|
201
|
-
hash[:cc].should
|
202
|
-
hash[:bcc].should
|
203
|
-
hash[:subject].should
|
204
|
-
hash[:text].should
|
205
|
-
hash[:html].should
|
211
|
+
hash[:from].should == [%("John Doe" <foo@example.com>)]
|
212
|
+
hash[:to].should == [%("Jane Doe" <bar@example.com>), '<baz@example.com>']
|
213
|
+
hash[:cc].should == ['cc@example.com']
|
214
|
+
hash[:bcc].should == ['bcc@example.com']
|
215
|
+
hash[:subject].should == ['test']
|
216
|
+
hash[:text].should == ['hello']
|
217
|
+
hash[:html].should == ['<p>hello</p>']
|
206
218
|
hash[:'h:Reply-To'].should == ['noreply@example.com']
|
207
219
|
|
208
220
|
Time.parse(hash[:'h:Date'][0]).should be_within(1).of(Time.at(946702800))
|
@@ -225,6 +237,12 @@ describe MultiMail::Message::Mailgun do
|
|
225
237
|
hash.size.should == 16
|
226
238
|
end
|
227
239
|
|
240
|
+
it 'should return the recipients without names' do
|
241
|
+
hash = message_without_names.to_mailgun_hash
|
242
|
+
hash[:from].should == ['foo@example.com']
|
243
|
+
hash[:to].should == ['bar@example.com', 'baz@example.com']
|
244
|
+
end
|
245
|
+
|
228
246
|
it 'should convert the message without a text body' do
|
229
247
|
message_without_text_body.to_mailgun_hash.should == {
|
230
248
|
:from => ['foo@example.com'],
|
@@ -247,5 +265,17 @@ describe MultiMail::Message::Mailgun do
|
|
247
265
|
it 'should convert an empty message' do
|
248
266
|
empty_message.to_mailgun_hash.should == {}
|
249
267
|
end
|
268
|
+
|
269
|
+
it 'should convert the message with one tag' do
|
270
|
+
message_with_one_tag.to_mailgun_hash.should == {
|
271
|
+
:'o:tag' => ['foo'],
|
272
|
+
}
|
273
|
+
end
|
274
|
+
|
275
|
+
it 'should convert the message with many tags' do
|
276
|
+
message_with_many_tags.to_mailgun_hash.should == {
|
277
|
+
:'o:tag' => ['foo', 'bar'],
|
278
|
+
}
|
279
|
+
end
|
250
280
|
end
|
251
281
|
end
|
@@ -2,141 +2,135 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
|
2
2
|
require 'multi_mail/mailgun/receiver'
|
3
3
|
|
4
4
|
describe MultiMail::Receiver::Mailgun do
|
5
|
-
context '
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
end
|
5
|
+
context 'with invalid HTTP POST format' do
|
6
|
+
let :service do
|
7
|
+
MultiMail::Receiver.new({
|
8
|
+
:provider => :mailgun,
|
9
|
+
:mailgun_api_key => 'foo',
|
10
|
+
:http_post_format => 'invalid',
|
11
|
+
})
|
12
|
+
end
|
14
13
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
end
|
14
|
+
describe '#transform' do
|
15
|
+
it 'should raise an error if :http_post_format is invalid' do
|
16
|
+
expect{ service.transform({}) }.to raise_error(ArgumentError)
|
19
17
|
end
|
20
18
|
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'without optional arguments' do
|
22
|
+
let :service do
|
23
|
+
MultiMail::Receiver.new(:provider => :mailgun)
|
24
|
+
end
|
25
|
+
|
26
|
+
def params(fixture)
|
27
|
+
MultiMail::Receiver::Mailgun.parse(response('mailgun/parsed', fixture))
|
28
|
+
end
|
21
29
|
|
22
|
-
|
23
|
-
|
24
|
-
|
30
|
+
describe '#valid?' do
|
31
|
+
it 'should return true if the response is valid' do
|
32
|
+
service.valid?(params('valid')).should == true
|
25
33
|
end
|
26
34
|
|
27
|
-
|
28
|
-
|
35
|
+
it 'should return true if the response is invalid' do
|
36
|
+
service.valid?(params('invalid')).should == true
|
29
37
|
end
|
30
38
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
39
|
+
it 'should return true if parameters are missing' do
|
40
|
+
service.valid?(params('missing')).should == true
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
35
44
|
|
36
|
-
|
37
|
-
|
38
|
-
|
45
|
+
[false, true].each do |action_dispatch|
|
46
|
+
let :action_dispatch do
|
47
|
+
action_dispatch
|
48
|
+
end
|
39
49
|
|
40
|
-
|
41
|
-
|
50
|
+
['parsed', 'raw', '', nil].each do |http_post_format|
|
51
|
+
context "with #{http_post_format.inspect} format and #{action_dispatch ? 'ActionDispatch' : 'Rack'}" do
|
52
|
+
let :actual_http_post_format do
|
53
|
+
http_post_format.to_s.empty? ? 'parsed' : http_post_format
|
42
54
|
end
|
43
|
-
end
|
44
|
-
end
|
45
55
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
56
|
+
let :service do
|
57
|
+
MultiMail::Receiver.new({
|
58
|
+
:provider => :mailgun,
|
59
|
+
:mailgun_api_key => 'foo',
|
60
|
+
:http_post_format => http_post_format,
|
61
|
+
})
|
62
|
+
end
|
50
63
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
http_post_format
|
55
|
-
end
|
64
|
+
def params(fixture)
|
65
|
+
MultiMail::Receiver::Mailgun.parse(response("mailgun/#{actual_http_post_format}", fixture, action_dispatch))
|
66
|
+
end
|
56
67
|
|
57
|
-
|
58
|
-
|
68
|
+
describe '#valid?' do
|
69
|
+
it 'should return true if the response is valid' do
|
70
|
+
service.valid?(params('valid')).should == true
|
59
71
|
end
|
60
72
|
|
61
|
-
|
62
|
-
|
63
|
-
:provider => :mailgun,
|
64
|
-
:mailgun_api_key => 'foo',
|
65
|
-
:http_post_format => http_post_format,
|
66
|
-
})
|
73
|
+
it 'should return false if the response is invalid' do
|
74
|
+
service.valid?(params('invalid')).should == false
|
67
75
|
end
|
68
76
|
|
69
|
-
|
70
|
-
|
77
|
+
it 'should raise an error if parameters are missing' do
|
78
|
+
expect{ service.valid?(params('missing')) }.to raise_error(IndexError)
|
71
79
|
end
|
80
|
+
end
|
72
81
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
82
|
+
describe '#transform' do
|
83
|
+
it 'should return a mail message' do
|
84
|
+
messages = service.transform(params('valid'))
|
85
|
+
messages.size.should == 1
|
86
|
+
message = messages[0]
|
87
|
+
|
88
|
+
# Headers
|
89
|
+
message.date.should == DateTime.parse('Mon, 15 Apr 2013 20:20:12 -04:00')
|
90
|
+
message.from.should == ['james@opennorth.ca']
|
91
|
+
message.to.should == ['foo+bar@multimail.mailgun.org']
|
92
|
+
message.subject.should == 'Test'
|
93
|
+
|
94
|
+
# Body
|
95
|
+
message.multipart?.should == true
|
96
|
+
message.parts.size.should == 4
|
97
|
+
text_part = message.parts.find{|part| part.content_type == 'text/plain'}
|
98
|
+
html_part = message.parts.find{|part| part.content_type == 'text/html; charset=UTF-8'}
|
99
|
+
text_part.body.decoded.should == "bold text\n\n\n\nsome more bold text\n\n\n\nsome italic text\n\n> multiline\n> quoted\n> text\n\n\n--\nSignature block"
|
100
|
+
html_part.body.decoded.should == %(<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><b>bold text</b><div><br></div><div></div></body></html><html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><head></head><br><div></div><div><br></div><div><b>some more bold text</b></div><div><b><br></b></div><div><b></b></div></body></html><html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><b></b></div><div><b><span class="Apple-style-span" style="font-weight: normal; "><br></span></b></div><div><b><span class="Apple-style-span" style="font-weight: normal; "><i>some italic text</i></span></b></div><div><b><span class="Apple-style-span" style="font-weight: normal; "><br></span></b></div><div><blockquote type="cite">multiline</blockquote><blockquote type="cite">quoted</blockquote><blockquote type="cite">text</blockquote></div><div><br></div><div>--</div><div>Signature block</div></body></html>)
|
101
|
+
|
102
|
+
# Attachments
|
103
|
+
attachment0 = message.attachments.find{|attachment| attachment.filename == 'foo.txt'}
|
104
|
+
attachment1 = message.attachments.find{|attachment| attachment.filename == 'bar.txt'}
|
105
|
+
attachment0.read.should == "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n"
|
106
|
+
attachment1.read.should == "Nam accumsan euismod eros et rhoncus.\n"
|
107
|
+
|
108
|
+
# Extra Mailgun parameters
|
109
|
+
# @note Due to a Mailgun bug, `stripped-text` contains "some italic
|
110
|
+
# text" but `stripped-html` doesn't. `stripped-signature` and
|
111
|
+
# `stripped-text` use CRLF line endings.
|
112
|
+
if actual_http_post_format == 'raw'
|
113
|
+
message['stripped-text'].should be_nil
|
114
|
+
message['stripped-signature'].should be_nil
|
115
|
+
message['stripped-html'].should be_nil
|
116
|
+
else
|
117
|
+
message['stripped-text'].value.should == "bold text\r\n\r\n\r\n\r\nsome more bold text\r\n\r\n\r\n\r\nsome italic text"
|
118
|
+
message['stripped-signature'].value.should == "--\r\nSignature block"
|
119
|
+
message['stripped-html'].value.should == '<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><b>bold text</b><div><br></div><div></div></body><html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div></div><div><br></div><div><b>some more bold text</b></div><div><b><br></b></div><div><b></b></div></body></html><html><head></head></html></html>'
|
84
120
|
end
|
85
121
|
end
|
122
|
+
end
|
86
123
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
# Headers
|
94
|
-
message.date.should == DateTime.parse('Mon, 15 Apr 2013 20:20:12 -04:00')
|
95
|
-
message.from.should == ['james@opennorth.ca']
|
96
|
-
message.to.should == ['foo+bar@multimail.mailgun.org']
|
97
|
-
message.subject.should == 'Test'
|
98
|
-
|
99
|
-
# Body
|
100
|
-
message.multipart?.should == true
|
101
|
-
message.parts.size.should == 4
|
102
|
-
text_part = message.parts.find{|part| part.content_type == 'text/plain'}
|
103
|
-
html_part = message.parts.find{|part| part.content_type == 'text/html; charset=UTF-8'}
|
104
|
-
text_part.body.decoded.should == "bold text\n\n\n\nsome more bold text\n\n\n\nsome italic text\n\n> multiline\n> quoted\n> text\n\n\n--\nSignature block"
|
105
|
-
html_part.body.decoded.should == %(<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><b>bold text</b><div><br></div><div></div></body></html><html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><head></head><br><div></div><div><br></div><div><b>some more bold text</b></div><div><b><br></b></div><div><b></b></div></body></html><html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><b></b></div><div><b><span class="Apple-style-span" style="font-weight: normal; "><br></span></b></div><div><b><span class="Apple-style-span" style="font-weight: normal; "><i>some italic text</i></span></b></div><div><b><span class="Apple-style-span" style="font-weight: normal; "><br></span></b></div><div><blockquote type="cite">multiline</blockquote><blockquote type="cite">quoted</blockquote><blockquote type="cite">text</blockquote></div><div><br></div><div>--</div><div>Signature block</div></body></html>)
|
106
|
-
|
107
|
-
# Attachments
|
108
|
-
attachment0 = message.attachments.find{|attachment| attachment.filename == 'foo.txt'}
|
109
|
-
attachment1 = message.attachments.find{|attachment| attachment.filename == 'bar.txt'}
|
110
|
-
attachment0.read.should == "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n"
|
111
|
-
attachment1.read.should == "Nam accumsan euismod eros et rhoncus.\n"
|
112
|
-
|
113
|
-
# Extra Mailgun parameters
|
114
|
-
# @note Due to a Mailgun bug, `stripped-text` contains "some italic
|
115
|
-
# text" but `stripped-html` doesn't. `stripped-signature` and
|
116
|
-
# `stripped-text` use CRLF line endings.
|
117
|
-
if actual_http_post_format == 'raw'
|
118
|
-
message['stripped-text'].should be_nil
|
119
|
-
message['stripped-signature'].should be_nil
|
120
|
-
message['stripped-html'].should be_nil
|
121
|
-
else
|
122
|
-
message['stripped-text'].value.should == "bold text\r\n\r\n\r\n\r\nsome more bold text\r\n\r\n\r\n\r\nsome italic text"
|
123
|
-
message['stripped-signature'].value.should == "--\r\nSignature block"
|
124
|
-
message['stripped-html'].value.should == '<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><b>bold text</b><div><br></div><div></div></body><html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div></div><div><br></div><div><b>some more bold text</b></div><div><b><br></b></div><div><b></b></div></body></html><html><head></head></html></html>'
|
125
|
-
end
|
126
|
-
end
|
124
|
+
describe '#spam?' do
|
125
|
+
it 'should return true if the response is spam' do
|
126
|
+
# The raw MIME HTTP POST format doesn't perform spam filtering.
|
127
|
+
message = service.transform(params('spam'))[0]
|
128
|
+
service.spam?(message).should == (actual_http_post_format != 'raw')
|
127
129
|
end
|
128
130
|
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
message = service.transform(params('spam'))[0]
|
133
|
-
service.spam?(message).should == (actual_http_post_format != 'raw')
|
134
|
-
end
|
135
|
-
|
136
|
-
it 'should return false if the response is ham' do
|
137
|
-
message = service.transform(params('valid'))[0]
|
138
|
-
service.spam?(message).should == false
|
139
|
-
end
|
131
|
+
it 'should return false if the response is ham' do
|
132
|
+
message = service.transform(params('valid'))[0]
|
133
|
+
service.spam?(message).should == false
|
140
134
|
end
|
141
135
|
end
|
142
136
|
end
|
data/spec/mailgun/sender_spec.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
-
require 'multi_mail/mailgun/sender'
|
3
2
|
|
4
3
|
describe MultiMail::Sender::Mailgun do
|
5
4
|
let :message do
|
@@ -52,38 +51,41 @@ describe MultiMail::Sender::Mailgun do
|
|
52
51
|
it 'should raise an error if :api_key is missing' do
|
53
52
|
expect{
|
54
53
|
message.delivery_method MultiMail::Sender::Mailgun, :domain => 'xxx'
|
55
|
-
message.deliver # request not sent
|
56
54
|
}.to raise_error(ArgumentError, "Missing required arguments: api_key")
|
57
55
|
end
|
58
56
|
|
59
57
|
it 'should raise an error if :domain is missing' do
|
60
58
|
expect{
|
61
59
|
message.delivery_method MultiMail::Sender::Mailgun, :api_key => 'xxx'
|
62
|
-
message.deliver # request not sent
|
63
60
|
}.to raise_error(ArgumentError, "Missing required arguments: domain")
|
64
61
|
end
|
65
62
|
|
66
63
|
it 'should raise an error if :api_key is nil' do
|
67
64
|
expect{
|
68
65
|
message.delivery_method MultiMail::Sender::Mailgun, :api_key => nil, :domain => 'xxx'
|
69
|
-
message.deliver # request not sent
|
70
66
|
}.to raise_error(ArgumentError, "Missing required arguments: api_key")
|
71
67
|
end
|
72
68
|
|
73
69
|
it 'should raise an error if :domain is nil' do
|
74
70
|
expect{
|
75
71
|
message.delivery_method MultiMail::Sender::Mailgun, :api_key => 'xxx', :domain => nil
|
76
|
-
message.deliver # request not sent
|
77
72
|
}.to raise_error(ArgumentError, "Missing required arguments: domain")
|
78
73
|
end
|
79
74
|
|
80
|
-
it 'should raise an error if :
|
75
|
+
it 'should raise an error if :api_key is invalid' do
|
81
76
|
expect{
|
82
|
-
message.delivery_method MultiMail::Sender::Mailgun, :api_key => 'xxx', :domain => '
|
77
|
+
message.delivery_method MultiMail::Sender::Mailgun, :api_key => 'xxx', :domain => 'multimail.mailgun.org'
|
83
78
|
message.deliver
|
84
79
|
}.to raise_error(MultiMail::InvalidAPIKey)
|
85
80
|
end
|
86
81
|
|
82
|
+
it 'should raise an error if :domain is invalid' do
|
83
|
+
expect{
|
84
|
+
message.delivery_method MultiMail::Sender::Mailgun, :api_key => ENV['MAILGUN_API_KEY'], :domain => 'xxx'
|
85
|
+
message.deliver
|
86
|
+
}.to raise_error(MultiMail::InvalidRequest, "Domain not found: xxx")
|
87
|
+
end
|
88
|
+
|
87
89
|
it 'should assign custom settings' do
|
88
90
|
sender = MultiMail::Sender::Mailgun.new(:api_key => 'xxx', :domain => 'xxx')
|
89
91
|
|
@@ -168,6 +170,10 @@ describe MultiMail::Sender::Mailgun do
|
|
168
170
|
expect{message_without_to.deliver!}.to raise_error(MultiMail::MissingRecipients, "'to' parameter is missing")
|
169
171
|
end
|
170
172
|
|
173
|
+
it 'should send a message without a subject' do
|
174
|
+
expect{message_without_subject.deliver!}.to_not raise_error
|
175
|
+
end
|
176
|
+
|
171
177
|
it 'should not send a message without a body' do
|
172
178
|
expect{message_without_body.deliver!}.to raise_error(MultiMail::MissingBody, "Need at least one of 'text' or 'html' parameters specified")
|
173
179
|
end
|