multi_mail 0.0.1 → 0.0.2

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.
Files changed (59) hide show
  1. data/.travis.yml +4 -0
  2. data/.yardopts +4 -0
  3. data/Gemfile +1 -1
  4. data/README.md +107 -12
  5. data/Rakefile +75 -52
  6. data/lib/multi_mail/cloudmailin/receiver.rb +100 -0
  7. data/lib/multi_mail/mailgun/receiver.rb +74 -36
  8. data/lib/multi_mail/mailgun/sender.rb +14 -0
  9. data/lib/multi_mail/mandrill/receiver.rb +77 -35
  10. data/lib/multi_mail/mandrill/sender.rb +14 -0
  11. data/lib/multi_mail/postmark/receiver.rb +68 -0
  12. data/lib/multi_mail/postmark/sender.rb +14 -0
  13. data/lib/multi_mail/receiver/base.rb +125 -8
  14. data/lib/multi_mail/receiver.rb +10 -4
  15. data/lib/multi_mail/sender/base.rb +7 -0
  16. data/lib/multi_mail/sender.rb +10 -4
  17. data/lib/multi_mail/sendgrid/receiver.rb +42 -0
  18. data/lib/multi_mail/sendgrid/sender.rb +11 -0
  19. data/lib/multi_mail/service.rb +15 -4
  20. data/lib/multi_mail/simple/receiver.rb +15 -0
  21. data/lib/multi_mail/simple/sender.rb +14 -0
  22. data/lib/multi_mail/version.rb +1 -1
  23. data/lib/multi_mail.rb +71 -3
  24. data/multi_mail.gemspec +12 -5
  25. data/spec/cloudmailin/receiver_spec.rb +112 -0
  26. data/spec/fixtures/cloudmailin/json/spam.txt +59 -0
  27. data/spec/fixtures/cloudmailin/json/valid.txt +59 -0
  28. data/spec/fixtures/cloudmailin/multipart/spam.txt +135 -0
  29. data/spec/fixtures/cloudmailin/multipart/valid.txt +135 -0
  30. data/spec/fixtures/cloudmailin/raw/spam.txt +137 -0
  31. data/spec/fixtures/cloudmailin/raw/valid.txt +137 -0
  32. data/spec/fixtures/mailgun/parsed/invalid.txt +8 -0
  33. data/spec/fixtures/mailgun/parsed/missing.txt +8 -0
  34. data/spec/fixtures/mailgun/parsed/spam.txt +8 -0
  35. data/spec/fixtures/mailgun/parsed/valid.txt +187 -0
  36. data/spec/fixtures/mandrill/spam.txt +9 -0
  37. data/spec/fixtures/mandrill/valid.txt +10 -0
  38. data/spec/fixtures/multipart.txt +99 -0
  39. data/spec/fixtures/postmark/spam.txt +83 -0
  40. data/spec/fixtures/postmark/valid.txt +92 -0
  41. data/spec/fixtures/simple/valid.txt +4 -0
  42. data/spec/mailgun/receiver_spec.rb +105 -50
  43. data/spec/mailgun/sender_spec.rb +0 -0
  44. data/spec/mandrill/receiver_spec.rb +35 -35
  45. data/spec/mandrill/sender_spec.rb +0 -0
  46. data/spec/multi_mail_spec.rb +63 -0
  47. data/spec/postmark/receiver_spec.rb +60 -0
  48. data/spec/postmark/sender_spec.rb +0 -0
  49. data/spec/receiver/base_spec.rb +73 -8
  50. data/spec/sender/base_spec.rb +21 -0
  51. data/spec/service_spec.rb +2 -2
  52. data/spec/simple/receiver_spec.rb +36 -0
  53. data/spec/simple/sender_spec.rb +0 -0
  54. data/spec/spec_helper.rb +123 -10
  55. metadata +141 -21
  56. data/spec/fixtures/mailgun/invalid.txt +0 -8
  57. data/spec/fixtures/mailgun/missing.txt +0 -8
  58. data/spec/fixtures/mailgun/spam.txt +0 -8
  59. data/spec/fixtures/mailgun/valid.txt +0 -8
@@ -0,0 +1,99 @@
1
+ Received: from mail-ia0-f170.google.com (mail-ia0-f170.google.com [209.85.210.170])
2
+ by ip-10-254-10-35 (Postfix) with ESMTPS id D6B554B407F
3
+ for <foo+bar@govkit.org>; Tue, 16 Apr 2013 16:59:11 +0000 (UTC)
4
+ Received: by mail-ia0-f170.google.com with SMTP id 21so418031iay.1
5
+ for <foo+bar@govkit.org>; Tue, 16 Apr 2013 09:59:11 -0700 (PDT)
6
+ X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
7
+ d=google.com; s=20120113;
8
+ h=x-received:from:content-type:subject:date:message-id:to
9
+ :mime-version:x-mailer:x-gm-message-state;
10
+ bh=t65yBTqkEtSef4tR7ISM9vxoaTyBuQsL0pSLruHpibE=;
11
+ b=dTBm7fXAoceod/ldOdJMbvMc1bhPTn60q9wh2PYKRcptz1FSV1OrU/JyXi2G9ju9kB
12
+ jSXystAlcoq7P4CrbBwaC5oI0ah4bvttUel7Z7+1y6+ynEhq/SllXzthTnFaE2BaWBer
13
+ eoaQW4D02SVxCcn5jCOjVR6gJMSWmMET+SfBplpnaTFy+HOr8l0pfNTmD9Vojybrbn+e
14
+ oPiyCRd12aEo1o4celDDwHpVXmN9c/RJTM6d1/b0hw9fNC5Fehbo1u1Q5J6G1ORMyNkM
15
+ KYOmQRE+5Ya1+377s/heGwVw8YoIfepzvIlpTyqA7B8O49X/T2GDH8HIiOC92BFZuqA4
16
+ fYkg==
17
+ X-Received: by 10.50.55.73 with SMTP id q9mr1850586igp.44.1366131550864;
18
+ Tue, 16 Apr 2013 09:59:10 -0700 (PDT)
19
+ Received: from [192.168.0.110] ([69.165.215.199])
20
+ by mx.google.com with ESMTPS id m4sm1430594igd.0.2013.04.16.09.59.08
21
+ (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128);
22
+ Tue, 16 Apr 2013 09:59:09 -0700 (PDT)
23
+ From: James McKinney <james@opennorth.ca>
24
+ Content-Type: multipart/alternative; boundary="Apple-Mail=_DB17A68A-87B7-4691-928D-1B6E57DD137B"
25
+ Subject: Test
26
+ Date: Tue, 15 Apr 2013 20:20:12 -0400
27
+ Message-Id: <2C60A16D-5B23-4BA6-9211-867AF28F251A@opennorth.ca>
28
+ To: foo+bar@govkit.org
29
+ Mime-Version: 1.0 (Apple Message framework v1283)
30
+ X-Mailer: Apple Mail (2.1283)
31
+ X-Gm-Message-State: ALoCoQnOht/eguXrGfkiTTa/As+g7RBOQscv5d85HA1rB4BzpPvN9f6jnZogS/cYGAOC4ns38GkP
32
+
33
+
34
+ --Apple-Mail=_DB17A68A-87B7-4691-928D-1B6E57DD137B
35
+ Content-Transfer-Encoding: 7bit
36
+ Content-Type: text/plain;
37
+ charset=us-ascii
38
+
39
+ bold text
40
+
41
+
42
+
43
+ some more bold text
44
+
45
+
46
+
47
+ some italic text
48
+
49
+ > multiline
50
+ > quoted
51
+ > text
52
+
53
+
54
+ --
55
+ Signature block
56
+ --Apple-Mail=_DB17A68A-87B7-4691-928D-1B6E57DD137B
57
+ Content-Type: multipart/mixed;
58
+ boundary="Apple-Mail=_62F1A9B0-BB56-4D14-9454-A18AF00A4AA1"
59
+
60
+
61
+ --Apple-Mail=_62F1A9B0-BB56-4D14-9454-A18AF00A4AA1
62
+ Content-Transfer-Encoding: 7bit
63
+ Content-Type: text/html;
64
+ charset=us-ascii
65
+
66
+ <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>
67
+ --Apple-Mail=_62F1A9B0-BB56-4D14-9454-A18AF00A4AA1
68
+ Content-Disposition: attachment;
69
+ filename=foo.txt
70
+ Content-Type: text/plain;
71
+ name="foo.txt"
72
+ Content-Transfer-Encoding: 7bit
73
+
74
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit.
75
+
76
+ --Apple-Mail=_62F1A9B0-BB56-4D14-9454-A18AF00A4AA1
77
+ Content-Transfer-Encoding: 7bit
78
+ Content-Type: text/html;
79
+ charset=us-ascii
80
+
81
+ <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>
82
+ --Apple-Mail=_62F1A9B0-BB56-4D14-9454-A18AF00A4AA1
83
+ Content-Disposition: attachment;
84
+ filename=bar.txt
85
+ Content-Type: text/plain;
86
+ name="bar.txt"
87
+ Content-Transfer-Encoding: 7bit
88
+
89
+ Nam accumsan euismod eros et rhoncus.
90
+
91
+ --Apple-Mail=_62F1A9B0-BB56-4D14-9454-A18AF00A4AA1
92
+ Content-Transfer-Encoding: 7bit
93
+ Content-Type: text/html;
94
+ charset=us-ascii
95
+
96
+ <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>
97
+ --Apple-Mail=_62F1A9B0-BB56-4D14-9454-A18AF00A4AA1--
98
+
99
+ --Apple-Mail=_DB17A68A-87B7-4691-928D-1B6E57DD137B--
@@ -0,0 +1,83 @@
1
+ HTTP/1.1 200 OK
2
+ User-Agent: Postmark
3
+ Host: requestb.in
4
+ Content-Type: application/json
5
+ Content-Length: 2768
6
+ Connection: close
7
+ Accept: application/json
8
+
9
+ {
10
+ "From": "james@opennorth.ca",
11
+ "FromFull": {
12
+ "Email": "james@opennorth.ca",
13
+ "Name": "James McKinney"
14
+ },
15
+ "To": "4354473e2e6ab001fa836f627a54004e@inbound.postmarkapp.com",
16
+ "ToFull": [
17
+ {
18
+ "Email": "4354473e2e6ab001fa836f627a54004e@inbound.postmarkapp.com",
19
+ "Name": ""
20
+ }
21
+ ],
22
+ "Cc": "",
23
+ "CcFull": [],
24
+ "ReplyTo": "",
25
+ "Subject": "",
26
+ "MessageID": "1511e3f0-2341-44ab-b272-6861d3992494",
27
+ "Date": "Wed, 15 May 2013 14:31:58 -0400",
28
+ "MailboxHash": "",
29
+ "TextBody": "XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X\n ",
30
+ "HtmlBody": "",
31
+ "Tag": "",
32
+ "Headers": [
33
+ {
34
+ "Name": "X-Spam-Checker-Version",
35
+ "Value": "SpamAssassin 3.3.1 (2010-03-16) on ip-10-90-190-53"
36
+ },
37
+ {
38
+ "Name": "X-Spam-Status",
39
+ "Value": "Yes"
40
+ },
41
+ {
42
+ "Name": "X-Spam-Score",
43
+ "Value": "1000.0"
44
+ },
45
+ {
46
+ "Name": "X-Spam-Tests",
47
+ "Value": "GTUBE,RCVD_IN_DNSWL_BLOCKED,SPF_PASS,TVD_SPACE_RATIO"
48
+ },
49
+ {
50
+ "Name": "Received-SPF",
51
+ "Value": "Pass (sender SPF authorized) identity=mailfrom; client-ip=209.85.128.173; helo=mail-ve0-f173.google.com; envelope-from=james@opennorth.ca; receiver=4354473e2e6ab001fa836f627a54004e@inbound.postmarkapp.com"
52
+ },
53
+ {
54
+ "Name": "X-Google-DKIM-Signature",
55
+ "Value": "v=1; a=rsa-sha256; c=relaxed\/relaxed; d=google.com; s=20120113; h=x-received:from:content-type:content-transfer-encoding:subject:date :message-id:to:mime-version:x-mailer:x-gm-message-state; bh=id84uDPa9SMZAVd+g2pYg3Hl9aPfnapoGlOygxrIuV4=; b=FBOYbZeMltWT5lSQqGEQeOrI0zlmPh+k+OrdlX0RTfHDNjXKcWUnMNQI5nCLCZmMx2 kc4wjWBhJUyKL49GmXPlsNmklwhtJw9jXykyY3lp67ADeIxvNQap9GdTcmmPD1tbwZCD MMXVUGOSNc2avykFJVgGGb72ODhXWK0Id+aCGfH2RlQbIiLnZ665ESn4De7LBGBjWM3B Y50rmKM8p0Y1l487Gr4FYhkbvoPzQRCgnzUSuRhwW8KDD1Wc4pDmZw+xsT8gVs9WE4uU 4pmB17MmH79jNJ1BQmnYGKqVFmfd8qUczGtGvfCJ94TnxY\/ggduXNk+6pGbDGzjMTgYK VNBQ=="
56
+ },
57
+ {
58
+ "Name": "X-Received",
59
+ "Value": "by 10.52.33.143 with SMTP id r15mr1480858vdi.27.1368642721260; Wed, 15 May 2013 11:32:01 -0700 (PDT)"
60
+ },
61
+ {
62
+ "Name": "Content-Transfer-Encoding",
63
+ "Value": "7bit"
64
+ },
65
+ {
66
+ "Name": "Message-Id",
67
+ "Value": "<F0C4C026-AA7E-4CA6-8995-92364019F748@opennorth.ca>"
68
+ },
69
+ {
70
+ "Name": "Mime-Version",
71
+ "Value": "1.0 (Apple Message framework v1283)"
72
+ },
73
+ {
74
+ "Name": "X-Mailer",
75
+ "Value": "Apple Mail (2.1283)"
76
+ },
77
+ {
78
+ "Name": "X-Gm-Message-State",
79
+ "Value": "ALoCoQmUwR7xEUEvsrsXgQsSDgDyR8ovC+5qExdPxXJOIPY85ZYVQj32e3oP0xre4qa3hHQUIxwR"
80
+ }
81
+ ],
82
+ "Attachments": []
83
+ }
@@ -0,0 +1,92 @@
1
+ HTTP/1.1 200 OK
2
+ User-Agent: Postmark
3
+ Host: requestb.in
4
+ Content-Type: application/json
5
+ Content-Length: 3355
6
+ Connection: close
7
+ Accept: application/json
8
+
9
+ {
10
+ "From": "james@opennorth.ca",
11
+ "FromFull": {
12
+ "Email": "james@opennorth.ca",
13
+ "Name": "James McKinney"
14
+ },
15
+ "To": "4354473e2e6ab001fa836f627a54004e@inbound.postmarkapp.com",
16
+ "ToFull": [
17
+ {
18
+ "Email": "4354473e2e6ab001fa836f627a54004e@inbound.postmarkapp.com",
19
+ "Name": ""
20
+ }
21
+ ],
22
+ "Cc": "",
23
+ "CcFull": [],
24
+ "ReplyTo": "",
25
+ "Subject": "Test",
26
+ "MessageID": "61c7c8b8-ba7e-43c3-b9ad-0ba865e8caa2",
27
+ "Date": "Mon, 15 Apr 2013 20:20:12 -0400",
28
+ "MailboxHash": "",
29
+ "TextBody": "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",
30
+ "HtmlBody": "&lt;html&gt;&lt;head&gt;&lt;\/head&gt;&lt;body style=&quot;word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; &quot;&gt;&lt;b&gt;bold text&lt;\/b&gt;&lt;div&gt;&lt;br&gt;&lt;\/div&gt;&lt;div&gt;&lt;\/div&gt;&lt;\/body&gt;&lt;\/html&gt;",
31
+ "Tag": "",
32
+ "Headers": [
33
+ {
34
+ "Name": "X-Spam-Checker-Version",
35
+ "Value": "SpamAssassin 3.3.1 (2010-03-16) on ip-10-90-190-53"
36
+ },
37
+ {
38
+ "Name": "X-Spam-Status",
39
+ "Value": "No"
40
+ },
41
+ {
42
+ "Name": "X-Spam-Score",
43
+ "Value": "-0.7"
44
+ },
45
+ {
46
+ "Name": "X-Spam-Tests",
47
+ "Value": "HTML_MESSAGE,RCVD_IN_DNSWL_LOW,SPF_PASS"
48
+ },
49
+ {
50
+ "Name": "Received-SPF",
51
+ "Value": "Pass (sender SPF authorized) identity=mailfrom; client-ip=209.85.128.182; helo=mail-ve0-f182.google.com; envelope-from=james@opennorth.ca; receiver=4354473e2e6ab001fa836f627a54004e@inbound.postmarkapp.com"
52
+ },
53
+ {
54
+ "Name": "X-Google-DKIM-Signature",
55
+ "Value": "v=1; a=rsa-sha256; c=relaxed\/relaxed; d=google.com; s=20120113; h=x-received:from:content-type:subject:date:message-id:to :mime-version:x-mailer:x-gm-message-state; bh=6BFmo0mUeQt+IiTRnSXv3DGerJst54bEHOqdmK9J6dc=; b=kZ0dA4IGLc8i8\/esvJLboiTLam2UPsl4vanU5jmd2rHy7UKxG2iW8MPIOkn\/xCLd3r x1k0Sc20pR6ekCIPtTlDaoTO2MtZ4M5ap0t4zLChQUTXLbtu2vJhCzbdtiYyO9iX8016 da4XyWlSibafevpH67vqeemgTOiN51SDRm8d89QMPeGlN7ZOX6Vlvy3vHjuMwsM2W\/Cw OsN8dxI7ak\/Zs8bnKNzFidj468vgDmhcTTG7yOkSMCVy9JfYs4PnVKP6FypWU+392WGR f2KB1WL0nG+jDXf0BwoqiR4m9Xr2iZgQZriBwPjs0mq4PtP8EyZ3cqoGRg8frwXOS+lF F8hA=="
56
+ },
57
+ {
58
+ "Name": "X-Received",
59
+ "Value": "by 10.58.220.129 with SMTP id pw1mr25886445vec.32.1368642705636; Wed, 15 May 2013 11:31:45 -0700 (PDT)"
60
+ },
61
+ {
62
+ "Name": "Message-Id",
63
+ "Value": "<3F47B6AB-FD2E-4BC6-9E1F-666D44341D15@opennorth.ca>"
64
+ },
65
+ {
66
+ "Name": "Mime-Version",
67
+ "Value": "1.0 (Apple Message framework v1283)"
68
+ },
69
+ {
70
+ "Name": "X-Mailer",
71
+ "Value": "Apple Mail (2.1283)"
72
+ },
73
+ {
74
+ "Name": "X-Gm-Message-State",
75
+ "Value": "ALoCoQkJ2Fj4y+iFzvfYnN1rFI4mx8y5hskCquYjWJKOWnqxsYHNrZffh99h2AA6Gos8pSmDZhL3"
76
+ }
77
+ ],
78
+ "Attachments": [
79
+ {
80
+ "Name": "foo.txt",
81
+ "Content": "TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4K",
82
+ "ContentType": "text/plain",
83
+ "ContentLength": 76
84
+ },
85
+ {
86
+ "Name": "bar.txt",
87
+ "Content": "TmFtIGFjY3Vtc2FuIGV1aXNtb2QgZXJvcyBldCByaG9uY3VzLgo=",
88
+ "ContentType": "text/plain",
89
+ "ContentLength": 52
90
+ }
91
+ ]
92
+ }
@@ -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
@@ -10,65 +10,120 @@ describe MultiMail::Receiver::Mailgun do
10
10
  end
11
11
 
12
12
  context 'after initialization' do
13
- def params(fixture)
14
- MultiMail::Receiver::Mailgun.parse(response('mailgun', fixture))
15
- end
13
+ context 'with invalid HTTP POST format' do
14
+ let :service do
15
+ MultiMail::Receiver.new({
16
+ :provider => :mailgun,
17
+ :mailgun_api_key => 'foo',
18
+ :http_post_format => 'invalid',
19
+ })
20
+ end
16
21
 
17
- before :all do
18
- @service = MultiMail::Receiver.new({
19
- :provider => :mailgun,
20
- :mailgun_api_key => credentials[:mailgun_api_key],
21
- })
22
+ describe '#transform' do
23
+ it 'should raise an error if :http_post_format is invalid' do
24
+ expect{ service.transform({}) }.to raise_error(ArgumentError)
25
+ end
26
+ end
22
27
  end
23
28
 
24
- describe '#valid?' do
25
- it 'should return true if the response is valid' do
26
- @service.valid?(params('valid')).should == true
29
+ [false, true].each do |action_dispatch|
30
+ let :action_dispatch do
31
+ action_dispatch
27
32
  end
28
33
 
29
- it 'should return false if the response is invalid' do
30
- @service.valid?(params('invalid')).should == false
31
- end
34
+ # @todo Write my own Postbin to have a URL ending with "mime" in order
35
+ # to get fixtures to test the raw MIME HTTP POST format; all existing
36
+ # OS code for bins suck. Simple Rack app with in-memory storage?
37
+ ['parsed', '', nil].each do |http_post_format|
38
+ context "with #{http_post_format.inspect} format and #{action_dispatch ? 'ActionDispatch' : 'Rack'}" do
39
+ let :http_post_format do
40
+ http_post_format
41
+ end
32
42
 
33
- it 'should raise an error if parameters are missing' do
34
- expect{ @service.valid?(params('missing')) }.to raise_error(KeyError)
35
- end
36
- end
43
+ let :actual_http_post_format do
44
+ http_post_format.to_s.empty? ? 'parsed' : http_post_format
45
+ end
37
46
 
38
- describe '#transform' do
39
- it 'should return a mail message' do
40
- message = @service.transform(params('valid'))[0]
41
-
42
- # Headers
43
- message.date.should == DateTime.parse('Mon, 24 Dec 2012 00:31:08 -0500')
44
- message.from.should == ['james@opennorth.ca']
45
- message.to.should == ['foo+bar@multimail.mailgun.org']
46
- message.subject.should == 'Test'
47
-
48
- # Body
49
- message.multipart?.should == true
50
- message.parts.size.should == 2
51
- message.parts[0].content_type.should == 'text/plain'
52
- message.parts[0].body.should == "bold text\n\n> multiline\n> quoted\n> text\n\n\n--\nSignature block"
53
- message.parts[1].content_type.should == 'text/html; charset=UTF-8'
54
- message.parts[1].body.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><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>)
55
-
56
- # Extra Mailgun parameters
57
- message['stripped-text'].value.should == 'bold text'
58
- message['stripped-signature'].value.should == "--\r\nSignature block"
59
- 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><br></div><div>--</div><div>Signature block</div></body></html>'
60
- end
61
- end
47
+ let :service do
48
+ MultiMail::Receiver.new({
49
+ :provider => :mailgun,
50
+ :mailgun_api_key => 'foo',
51
+ :http_post_format => http_post_format,
52
+ })
53
+ end
62
54
 
63
- describe '#spam?' do
64
- it 'should return true if the response is spam' do
65
- message = @service.transform(params('spam'))[0]
66
- @service.spam?(message).should == true
67
- end
55
+ def params(fixture)
56
+ MultiMail::Receiver::Mailgun.parse(response("mailgun/#{actual_http_post_format}", fixture, action_dispatch))
57
+ end
58
+
59
+ describe '#valid?' do
60
+ it 'should return true if the response is valid' do
61
+ service.valid?(params('valid')).should == true
62
+ end
63
+
64
+ it 'should return false if the response is invalid' do
65
+ service.valid?(params('invalid')).should == false
66
+ end
67
+
68
+ it 'should raise an error if parameters are missing' do
69
+ expect{ service.valid?(params('missing')) }.to raise_error(IndexError)
70
+ end
71
+ end
72
+
73
+ describe '#transform' do
74
+ it 'should return a mail message' do
75
+ messages = service.transform(params('valid'))
76
+ messages.size.should == 1
77
+ message = messages[0]
78
+
79
+ # Headers
80
+ message.date.should == DateTime.parse('Mon, 15 Apr 2013 20:20:12 -04:00')
81
+ message.from.should == ['james@opennorth.ca']
82
+ message.to.should == ['foo+bar@multimail.mailgun.org']
83
+ message.subject.should == 'Test'
84
+
85
+ # Body
86
+ message.multipart?.should == true
87
+ message.parts.size.should == 4
88
+ message.parts[0].content_type.should == 'text/plain'
89
+ message.parts[1].content_type.should == 'text/html; charset=UTF-8'
90
+ message.parts[0].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"
91
+ message.parts[1].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>)
92
+
93
+ # Attachments
94
+ message.attachments[0].filename.should == 'foo.txt'
95
+ message.attachments[0].read.should == "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n"
96
+ message.attachments[1].filename.should == 'bar.txt'
97
+ message.attachments[1].read.should == "Nam accumsan euismod eros et rhoncus.\n"
98
+
99
+ # Extra Mailgun parameters
100
+ # @note Due to a Mailgun bug, `stripped-text` contains "some italic
101
+ # text" but `stripped-html` doesn't. `stripped-signature` and
102
+ # `stripped-text` use CRLF line endings.
103
+ if actual_http_post_format == 'raw'
104
+ message['stripped-text'].should be_nil
105
+ message['stripped-signature'].should be_nil
106
+ message['stripped-html'].should be_nil
107
+ else
108
+ 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"
109
+ message['stripped-signature'].value.should == "--\r\nSignature block"
110
+ 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>'
111
+ end
112
+ end
113
+ end
114
+
115
+ describe '#spam?' do
116
+ it 'should return true if the response is spam' do
117
+ message = service.transform(params('spam'))[0]
118
+ service.spam?(message).should == true
119
+ end
68
120
 
69
- it 'should return false if the response is ham' do
70
- message = @service.transform(params('valid'))[0]
71
- @service.spam?(message).should == false
121
+ it 'should return false if the response is ham' do
122
+ message = service.transform(params('valid'))[0]
123
+ service.spam?(message).should == false
124
+ end
125
+ end
126
+ end
72
127
  end
73
128
  end
74
129
  end
File without changes
@@ -2,62 +2,62 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
  require 'multi_mail/mandrill/receiver'
3
3
 
4
4
  describe MultiMail::Receiver::Mandrill do
5
- describe '#initialize' do
6
- it 'should raise an error if :mandrill_api_key is missing' do
7
- expect{ MultiMail::Receiver.new :provider => :mandrill }.to raise_error(ArgumentError)
8
- expect{ MultiMail::Receiver.new :provider => :mandrill, :mandrill_api_key => nil }.to raise_error(ArgumentError)
5
+ context 'after initialization' do
6
+ let :service do
7
+ MultiMail::Receiver.new(:provider => :mandrill)
9
8
  end
10
- end
11
9
 
12
- context 'after initialization' do
13
10
  def params(fixture)
14
11
  MultiMail::Receiver::Mandrill.parse(response('mandrill', fixture))
15
12
  end
16
13
 
17
- before :all do
18
- @service = MultiMail::Receiver.new({
19
- :provider => :mandrill,
20
- :mandrill_api_key => credentials[:mandrill_api_key],
21
- })
22
- end
23
-
24
- describe '#valid?' do
25
- it 'should return true if the response is valid' do
26
- @service.valid?(params('valid')).should == true
27
- end
28
-
29
- it 'should return false if the response is invalid' do
30
- @service.valid?(params('invalid')).should == false
31
- end
32
-
33
- it 'should raise an error if parameters are missing' do
34
- expect{ @service.valid?(params('missing')) }.to raise_error(KeyError)
35
- end
36
- end
37
-
14
+ # @todo Add a spec for multiple Mandrill events.
38
15
  describe '#transform' do
39
16
  it 'should return a mail message' do
40
- message = @service.transform(params('valid'))[0]
17
+ messages = service.transform(params('valid'))
18
+ messages.size.should == 1
19
+ message = messages[0]
41
20
 
42
21
  # Headers
43
- message.date.should == DateTime.parse('Thu, 27 Dec 2012 15:25:37 -0500')
22
+ message.date.should == DateTime.parse('Mon, 15 Apr 2013 20:20:12 -04:00')
44
23
  message.from.should == ['james@opennorth.ca']
45
24
  message.to.should == ['foo+bar@govkit.org']
46
25
  message.subject.should == 'Test'
47
26
 
48
27
  # Body
49
28
  message.multipart?.should == true
50
- message.parts.size.should == 2
29
+ message.parts.size.should == 4
51
30
  message.parts[0].content_type.should == 'text/plain'
52
- message.parts[0].body.should == "bold text\n\n\n> multiline\n> quoted\n> text\n\n--\nSignature block\n"
53
31
  message.parts[1].content_type.should == 'text/html; charset=UTF-8'
54
- p message.parts[1].body.decoded
55
- message.parts[1].body.should == %(<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><b>bold text</b></div><div><br></div><div><blockquote type="cite"></blockquote></div><div><blockquote type="cite">multiline</blockquote></div><blockquote type="cite"><div>quoted</div><div>text</div></blockquote><br><div>--</div><div>Signature block</div></body></html>\n)
32
+ # @note Mandrill adds a newline at the end of each part.
33
+ message.parts[0].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\n"
34
+ message.parts[1].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>)
35
+
36
+ # Attachments
37
+ attachment0 = message.attachments.find{|attachment| attachment.filename == 'foo.txt'}
38
+ attachment1 = message.attachments.find{|attachment| attachment.filename == 'bar.txt'}
39
+ attachment0.read.should == "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n\n"
40
+ attachment1.read.should == "Nam accumsan euismod eros et rhoncus.\n\n"
56
41
 
57
42
  # Extra Mandrill parameters
43
+ message['ts'].value.should == '1368657709'
58
44
  message['email'].value.should == 'foo+bar@govkit.org'
59
- message['tags'].should be_nil
60
- message['sender'].should be_nil
45
+ message['dkim-signed'].value.should == 'false'
46
+ message['dkim-valid'].value.should == 'false'
47
+ message['spam_report-score'].value.should == '0'
48
+ message['spf-result'].value.should == 'pass'
49
+ end
50
+ end
51
+
52
+ describe '#spam?' do
53
+ it 'should return true if the response is spam' do
54
+ message = service.transform(params('spam'))[0]
55
+ service.spam?(message).should == true
56
+ end
57
+
58
+ it 'should return false if the response is ham' do
59
+ message = service.transform(params('valid'))[0]
60
+ service.spam?(message).should == false
61
61
  end
62
62
  end
63
63
  end
File without changes
@@ -1,4 +1,67 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
3
  describe MultiMail do
4
+ describe '#setup' do
5
+ before :all do
6
+ MultiMail.setup do |config|
7
+ config.autoresponse_pattern = /^Out of Office AutoReply:/i
8
+ end
9
+ end
10
+
11
+ it 'should set the autoresponse pattern' do
12
+ MultiMail.autoresponse_pattern.should == /^Out of Office AutoReply:/i
13
+ end
14
+ end
15
+
16
+ describe '#autoresponse?' do
17
+ before :each do
18
+ @message = Mail.new
19
+ end
20
+
21
+ it 'should return false if the message is not an autoresponse' do
22
+ MultiMail.autoresponse?(@message).should == false
23
+ end
24
+
25
+ it 'should return true if an autoresponder header is found' do
26
+ @message['X-Autogenerated'] = 'value'
27
+ MultiMail.autoresponse?(@message).should == true
28
+ end
29
+
30
+ it 'should return true if an autoresponder value is found' do
31
+ @message['Return-Path'] = '<>'
32
+ MultiMail.autoresponse?(@message).should == true
33
+ end
34
+
35
+ it 'should return true if Auto-Submitted is not "no"' do
36
+ @message['Auto-Submitted'] = 'auto-replied'
37
+ MultiMail.autoresponse?(@message).should == true
38
+ end
39
+
40
+ it 'should return false if Auto-Submitted is "no"' do
41
+ @message['Auto-Submitted'] = 'no'
42
+ MultiMail.autoresponse?(@message).should == false
43
+ end
44
+
45
+ context 'without an autoresponse pattern' do
46
+ before :all do
47
+ MultiMail.autoresponse_pattern = nil
48
+ end
49
+
50
+ it 'should not match the subject against the autoresponse pattern' do
51
+ @message.subject = 'Out of Office AutoReply: Subject'
52
+ MultiMail.autoresponse?(@message).should == false
53
+ end
54
+ end
55
+
56
+ context 'with an autoresponse pattern' do
57
+ before :all do
58
+ MultiMail.autoresponse_pattern = /^Out of Office AutoReply:/i
59
+ end
60
+
61
+ it 'should return true if the subject matches the autoresponse pattern' do
62
+ @message.subject = 'Out of Office AutoReply: Subject'
63
+ MultiMail.autoresponse?(@message).should == true
64
+ end
65
+ end
66
+ end
4
67
  end