sa-tmail 1.2.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (201) hide show
  1. data/CHANGES +74 -0
  2. data/LICENSE +21 -0
  3. data/NOTES +7 -0
  4. data/README +179 -0
  5. data/Rakefile +2 -0
  6. data/ext/Makefile +20 -0
  7. data/ext/tmailscanner/tmail/MANIFEST +4 -0
  8. data/ext/tmailscanner/tmail/depend +1 -0
  9. data/ext/tmailscanner/tmail/extconf.rb +34 -0
  10. data/ext/tmailscanner/tmail/tmailscanner.c +614 -0
  11. data/lib/tmail.rb +6 -0
  12. data/lib/tmail/Makefile +18 -0
  13. data/lib/tmail/address.rb +392 -0
  14. data/lib/tmail/attachments.rb +65 -0
  15. data/lib/tmail/base64.rb +46 -0
  16. data/lib/tmail/compat.rb +41 -0
  17. data/lib/tmail/config.rb +67 -0
  18. data/lib/tmail/core_extensions.rb +63 -0
  19. data/lib/tmail/encode.rb +590 -0
  20. data/lib/tmail/header.rb +962 -0
  21. data/lib/tmail/index.rb +9 -0
  22. data/lib/tmail/interface.rb +1162 -0
  23. data/lib/tmail/loader.rb +3 -0
  24. data/lib/tmail/mail.rb +578 -0
  25. data/lib/tmail/mailbox.rb +496 -0
  26. data/lib/tmail/main.rb +6 -0
  27. data/lib/tmail/mbox.rb +3 -0
  28. data/lib/tmail/net.rb +250 -0
  29. data/lib/tmail/obsolete.rb +132 -0
  30. data/lib/tmail/parser.rb +1060 -0
  31. data/lib/tmail/parser.y +416 -0
  32. data/lib/tmail/port.rb +379 -0
  33. data/lib/tmail/quoting.rb +155 -0
  34. data/lib/tmail/require_arch.rb +58 -0
  35. data/lib/tmail/scanner.rb +49 -0
  36. data/lib/tmail/scanner_r.rb +261 -0
  37. data/lib/tmail/stringio.rb +280 -0
  38. data/lib/tmail/utils.rb +361 -0
  39. data/lib/tmail/version.rb +39 -0
  40. data/lib/vendor/rchardet-1.3/COPYING +504 -0
  41. data/lib/vendor/rchardet-1.3/README +12 -0
  42. data/lib/vendor/rchardet-1.3/lib/rchardet.rb +67 -0
  43. data/lib/vendor/rchardet-1.3/lib/rchardet/big5freq.rb +927 -0
  44. data/lib/vendor/rchardet-1.3/lib/rchardet/big5prober.rb +42 -0
  45. data/lib/vendor/rchardet-1.3/lib/rchardet/chardistribution.rb +237 -0
  46. data/lib/vendor/rchardet-1.3/lib/rchardet/charsetgroupprober.rb +112 -0
  47. data/lib/vendor/rchardet-1.3/lib/rchardet/charsetprober.rb +75 -0
  48. data/lib/vendor/rchardet-1.3/lib/rchardet/codingstatemachine.rb +64 -0
  49. data/lib/vendor/rchardet-1.3/lib/rchardet/constants.rb +42 -0
  50. data/lib/vendor/rchardet-1.3/lib/rchardet/escprober.rb +90 -0
  51. data/lib/vendor/rchardet-1.3/lib/rchardet/escsm.rb +244 -0
  52. data/lib/vendor/rchardet-1.3/lib/rchardet/eucjpprober.rb +88 -0
  53. data/lib/vendor/rchardet-1.3/lib/rchardet/euckrfreq.rb +596 -0
  54. data/lib/vendor/rchardet-1.3/lib/rchardet/euckrprober.rb +42 -0
  55. data/lib/vendor/rchardet-1.3/lib/rchardet/euctwfreq.rb +430 -0
  56. data/lib/vendor/rchardet-1.3/lib/rchardet/euctwprober.rb +42 -0
  57. data/lib/vendor/rchardet-1.3/lib/rchardet/gb2312freq.rb +474 -0
  58. data/lib/vendor/rchardet-1.3/lib/rchardet/gb2312prober.rb +42 -0
  59. data/lib/vendor/rchardet-1.3/lib/rchardet/hebrewprober.rb +289 -0
  60. data/lib/vendor/rchardet-1.3/lib/rchardet/jisfreq.rb +570 -0
  61. data/lib/vendor/rchardet-1.3/lib/rchardet/jpcntx.rb +229 -0
  62. data/lib/vendor/rchardet-1.3/lib/rchardet/langbulgarianmodel.rb +229 -0
  63. data/lib/vendor/rchardet-1.3/lib/rchardet/langcyrillicmodel.rb +330 -0
  64. data/lib/vendor/rchardet-1.3/lib/rchardet/langgreekmodel.rb +227 -0
  65. data/lib/vendor/rchardet-1.3/lib/rchardet/langhebrewmodel.rb +202 -0
  66. data/lib/vendor/rchardet-1.3/lib/rchardet/langhungarianmodel.rb +226 -0
  67. data/lib/vendor/rchardet-1.3/lib/rchardet/langthaimodel.rb +201 -0
  68. data/lib/vendor/rchardet-1.3/lib/rchardet/latin1prober.rb +147 -0
  69. data/lib/vendor/rchardet-1.3/lib/rchardet/mbcharsetprober.rb +89 -0
  70. data/lib/vendor/rchardet-1.3/lib/rchardet/mbcsgroupprober.rb +47 -0
  71. data/lib/vendor/rchardet-1.3/lib/rchardet/mbcssm.rb +542 -0
  72. data/lib/vendor/rchardet-1.3/lib/rchardet/sbcharsetprober.rb +124 -0
  73. data/lib/vendor/rchardet-1.3/lib/rchardet/sbcsgroupprober.rb +58 -0
  74. data/lib/vendor/rchardet-1.3/lib/rchardet/sjisprober.rb +88 -0
  75. data/lib/vendor/rchardet-1.3/lib/rchardet/universaldetector.rb +166 -0
  76. data/lib/vendor/rchardet-1.3/lib/rchardet/utf8prober.rb +87 -0
  77. data/log/BugTrackingLog.txt +1245 -0
  78. data/log/Changelog.txt +534 -0
  79. data/log/Testlog.txt +2340 -0
  80. data/log/Todo.txt +30 -0
  81. data/meta/MANIFEST +128 -0
  82. data/meta/VERSION +1 -0
  83. data/meta/project.yaml +30 -0
  84. data/meta/unixname +1 -0
  85. data/sample/bench_base64.rb +48 -0
  86. data/sample/data/multipart +23 -0
  87. data/sample/data/normal +29 -0
  88. data/sample/data/sendtest +5 -0
  89. data/sample/data/simple +14 -0
  90. data/sample/data/test +27 -0
  91. data/sample/extract-attachements.rb +33 -0
  92. data/sample/from-check.rb +26 -0
  93. data/sample/multipart.rb +26 -0
  94. data/sample/parse-bench.rb +68 -0
  95. data/sample/parse-test.rb +19 -0
  96. data/sample/sendmail.rb +94 -0
  97. data/setup.rb +1482 -0
  98. data/site/contributing/index.html +183 -0
  99. data/site/css/clean.css +27 -0
  100. data/site/css/layout.css +31 -0
  101. data/site/css/style.css +60 -0
  102. data/site/download/index.html +61 -0
  103. data/site/img/envelope.jpg +0 -0
  104. data/site/img/mailman.gif +0 -0
  105. data/site/img/stamp-sm.jpg +0 -0
  106. data/site/img/stamp.jpg +0 -0
  107. data/site/img/stampborder.jpg +0 -0
  108. data/site/img/tfire.jpg +0 -0
  109. data/site/img/tmail.png +0 -0
  110. data/site/index.html +272 -0
  111. data/site/js/jquery.js +31 -0
  112. data/site/log/Changelog.xsl +33 -0
  113. data/site/log/changelog.xml +1677 -0
  114. data/site/outdated/BUGS +3 -0
  115. data/site/outdated/DEPENDS +1 -0
  116. data/site/outdated/Incompatibilities +89 -0
  117. data/site/outdated/Incompatibilities.ja +102 -0
  118. data/site/outdated/NEWS +9 -0
  119. data/site/outdated/README.ja +73 -0
  120. data/site/outdated/doc.ja/address.html +275 -0
  121. data/site/outdated/doc.ja/basics.html +405 -0
  122. data/site/outdated/doc.ja/config.html +49 -0
  123. data/site/outdated/doc.ja/details.html +146 -0
  124. data/site/outdated/doc.ja/index.html +39 -0
  125. data/site/outdated/doc.ja/mail.html +793 -0
  126. data/site/outdated/doc.ja/mailbox.html +265 -0
  127. data/site/outdated/doc.ja/port.html +95 -0
  128. data/site/outdated/doc.ja/tmail.html +58 -0
  129. data/site/outdated/doc.ja/usage.html +202 -0
  130. data/site/outdated/rdd/address.rrd.m +229 -0
  131. data/site/outdated/rdd/basics.rd.m +275 -0
  132. data/site/outdated/rdd/config.rrd.m +26 -0
  133. data/site/outdated/rdd/details.rd.m +117 -0
  134. data/site/outdated/rdd/index.rhtml.m +54 -0
  135. data/site/outdated/rdd/mail.rrd.m +701 -0
  136. data/site/outdated/rdd/mailbox.rrd.m +228 -0
  137. data/site/outdated/rdd/port.rrd.m +69 -0
  138. data/site/outdated/rdd/tmail.rrd.m +33 -0
  139. data/site/outdated/rdd/usage.rd.m +247 -0
  140. data/site/quickstart/index.html +69 -0
  141. data/site/quickstart/quickstart.html +52 -0
  142. data/site/quickstart/usage.html +193 -0
  143. data/site/reference/address.html +247 -0
  144. data/site/reference/config.html +30 -0
  145. data/site/reference/index.html +101 -0
  146. data/site/reference/mail.html +726 -0
  147. data/site/reference/mailbox.html +245 -0
  148. data/site/reference/port.html +75 -0
  149. data/site/reference/tmail.html +35 -0
  150. data/test/extctrl.rb +6 -0
  151. data/test/fixtures/mailbox +414 -0
  152. data/test/fixtures/mailbox_without_any_from_or_sender +10 -0
  153. data/test/fixtures/mailbox_without_from +11 -0
  154. data/test/fixtures/mailbox_without_return_path +12 -0
  155. data/test/fixtures/raw_attack_email_with_zero_length_whitespace +29 -0
  156. data/test/fixtures/raw_base64_decoded_string +0 -0
  157. data/test/fixtures/raw_base64_email +83 -0
  158. data/test/fixtures/raw_base64_encoded_string +1 -0
  159. data/test/fixtures/raw_email +14 -0
  160. data/test/fixtures/raw_email10 +20 -0
  161. data/test/fixtures/raw_email11 +34 -0
  162. data/test/fixtures/raw_email12 +32 -0
  163. data/test/fixtures/raw_email13 +29 -0
  164. data/test/fixtures/raw_email2 +114 -0
  165. data/test/fixtures/raw_email3 +70 -0
  166. data/test/fixtures/raw_email4 +59 -0
  167. data/test/fixtures/raw_email5 +19 -0
  168. data/test/fixtures/raw_email6 +20 -0
  169. data/test/fixtures/raw_email7 +66 -0
  170. data/test/fixtures/raw_email8 +47 -0
  171. data/test/fixtures/raw_email9 +28 -0
  172. data/test/fixtures/raw_email_multiple_from +30 -0
  173. data/test/fixtures/raw_email_quoted_with_0d0a +14 -0
  174. data/test/fixtures/raw_email_reply +32 -0
  175. data/test/fixtures/raw_email_simple +11 -0
  176. data/test/fixtures/raw_email_with_bad_date +48 -0
  177. data/test/fixtures/raw_email_with_illegal_boundary +58 -0
  178. data/test/fixtures/raw_email_with_mimepart_without_content_type +94 -0
  179. data/test/fixtures/raw_email_with_multipart_mixed_quoted_boundary +50 -0
  180. data/test/fixtures/raw_email_with_nested_attachment +100 -0
  181. data/test/fixtures/raw_email_with_partially_quoted_subject +14 -0
  182. data/test/fixtures/raw_email_with_quoted_illegal_boundary +58 -0
  183. data/test/kcode.rb +14 -0
  184. data/test/temp_test_one.rb +46 -0
  185. data/test/test_address.rb +1216 -0
  186. data/test/test_attachments.rb +131 -0
  187. data/test/test_base64.rb +64 -0
  188. data/test/test_encode.rb +139 -0
  189. data/test/test_header.rb +1021 -0
  190. data/test/test_helper.rb +9 -0
  191. data/test/test_mail.rb +756 -0
  192. data/test/test_mbox.rb +184 -0
  193. data/test/test_port.rb +440 -0
  194. data/test/test_quote.rb +107 -0
  195. data/test/test_scanner.rb +209 -0
  196. data/test/test_utils.rb +36 -0
  197. data/work/script/make +26 -0
  198. data/work/script/rdoc +39 -0
  199. data/work/script/setup +1616 -0
  200. data/work/script/test +30 -0
  201. metadata +309 -0
@@ -0,0 +1,94 @@
1
+ X-Gmail-Received: b2c98353cc39d93e4204831226f778c200d28109
2
+ Delivered-To: roor32@gmail.com
3
+ Received: by 10.64.10.4 with SMTP id 4cs594808qbj;
4
+ Fri, 20 Oct 2006 01:53:34 -0700 (PDT)
5
+ Received: by 10.65.224.11 with SMTP id b11mr149813qbr;
6
+ Fri, 20 Oct 2006 01:53:34 -0700 (PDT)
7
+ Return-Path: <>
8
+ Received: from anis.telecom.uqam.ca (anis.telecom.uqam.ca [132.208.250.6])
9
+ by mx.google.com with ESMTP id e13si1575402qbe.2006.10.20.01.53.34;
10
+ Fri, 20 Oct 2006 01:53:34 -0700 (PDT)
11
+ Received-SPF: pass (google.com: best guess record for domain of anis.telecom.uqam.ca designates 132.208.250.6 as permitted sender)
12
+ Received: from anis4.telecom.uqam.ca (anis4.telecom.uqam.ca [132.208.250.236])
13
+ by sortant.uqam.ca (8.13.6/8.12.1) with SMTP id k9K8SIwA023763
14
+ for <roor32@gmail.com>; Fri, 20 Oct 2006 04:28:33 -0400 (EDT)
15
+ Received: from antivirus.uqam.ca ([127.0.0.1])
16
+ by anis4.telecom.uqam.ca (SAVSMTP 3.1.1.32) with SMTP id M2006102004283404041
17
+ for <roor32@gmail.com>; Fri, 20 Oct 2006 04:28:34 -0400
18
+ Received: from localhost (localhost)
19
+ by antivirus.uqam.ca (8.13.6/8.12.1) id k9JMDbg4005560;
20
+ Fri, 20 Oct 2006 04:28:33 -0400 (EDT)
21
+ Date: Fri, 20 Oct 2006 04:28:33 -0400 (EDT)
22
+ From: Mail Delivery Subsystem <MAILER-DAEMON@antivirus.uqam.ca>
23
+ Message-Id: <200610200828.k9JMDbg4005560@antivirus.uqam.ca>
24
+ To: <roor32@gmail.com>
25
+ MIME-Version: 1.0
26
+ Content-Type: multipart/report; report-type=delivery-status;
27
+ boundary="k9JMDbg4005560.1161332913/antivirus.uqam.ca"
28
+ Subject: Warning: could not send message for past 1 day
29
+ Auto-Submitted: auto-generated (warning-timeout)
30
+
31
+ This is a MIME-encapsulated message
32
+
33
+ --k9JMDbg4005560.1161332913/antivirus.uqam.ca
34
+
35
+ **********************************************
36
+ ** THIS IS A WARNING MESSAGE ONLY **
37
+ ** YOU DO NOT NEED TO RESEND YOUR MESSAGE **
38
+ **********************************************
39
+
40
+ The original message was received at Thu, 19 Oct 2006 01:23:47 -0400 (EDT)
41
+ from py-out-1112.google.com [64.233.166.178]
42
+
43
+ ----- Transcript of session follows -----
44
+ <larose.julie@courrier.uqam.ca>... Deferred
45
+ Warning: message still undelivered after 1 day
46
+ Will keep trying until message is 5 days old
47
+
48
+ --k9JMDbg4005560.1161332913/antivirus.uqam.ca
49
+ Content-Type: message/delivery-status
50
+
51
+ Reporting-MTA: dns; antivirus.uqam.ca
52
+ Arrival-Date: Thu, 19 Oct 2006 01:23:47 -0400 (EDT)
53
+
54
+ Final-Recipient: RFC822; larose.julie@courrier.uqam.ca
55
+ Action: delayed
56
+ Status: 4.5.0
57
+ Diagnostic-Code: SMTP;
58
+ Last-Attempt-Date: Fri, 20 Oct 2006 04:28:33 -0400 (EDT)
59
+ Will-Retry-Until: Tue, 24 Oct 2006 01:23:47 -0400 (EDT)
60
+
61
+ --k9JMDbg4005560.1161332913/antivirus.uqam.ca
62
+ Content-Type: message/rfc822
63
+
64
+ Return-Path: <roor32@gmail.com>
65
+ Received: from py-out-1112.google.com (py-out-1112.google.com [64.233.166.178])
66
+ by intrant.uqam.ca (8.13.6/8.12.2/uqam-filtres) with SMTP id k9J5Ni8o007263
67
+ for <larose.julie@courrier.uqam.ca>; Thu, 19 Oct 2006 01:23:47 -0400 (EDT)
68
+ X-UQAM-Spam-Filter: Filtre-Uqam re: abuse@uqam.ca
69
+ Received: by py-out-1112.google.com with SMTP id t32so610221pyc
70
+ for <larose.julie@courrier.uqam.ca>; Wed, 18 Oct 2006 22:23:33 -0700 (PDT)
71
+ DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
72
+ s=beta; d=gmail.com;
73
+ h=received:message-id:date:from:to:subject:mime-version:content-type:content-transfer-encoding:content-disposition;
74
+ b=Fwt0k1kaMU+1kM1iTG0q4Xf94p9alSohgM7QQN0CSjfBYUUhT+J4Y6+ZWotaaSffV3gX86RE/n97n0yQ/33EgYKIifuEpa0hi2mg3KTmcDqlCjiDfih58Z998GEFfbhu0he2jsoB+k6AgVRFPwP6LMRi6T66vr2f7IOAmX2IHiU=
75
+ Received: by 10.65.241.20 with SMTP id t20mr15391984qbr;
76
+ Wed, 18 Oct 2006 15:10:03 -0700 (PDT)
77
+ Received: by 10.64.10.4 with HTTP; Wed, 18 Oct 2006 15:10:03 -0700 (PDT)
78
+ Message-ID: <89d7557c0610181510r6fa5ebd8n66a7deec71ade118@mail.gmail.com>
79
+ Date: Wed, 18 Oct 2006 18:10:03 -0400
80
+ From: "=?ISO-8859-1?Q?RogE9?=" <roor32@gmail.com>
81
+ To: larose.julie@courrier.uqam.ca
82
+ Subject: Est-ce toi ?
83
+ MIME-Version: 1.0
84
+ Content-Type: text/plain; charset=ISO-8859-1; format=flowed
85
+ Content-Transfer-Encoding: 7bit
86
+ Content-Disposition: inline
87
+
88
+ Salut,
89
+ je ne suis pas sur de m'adresser a la bonne personne.
90
+ Mais si jamais tu me reconnais :p, peux-tu repondre a ce mail ?
91
+ Merci.
92
+ Roger
93
+
94
+ --k9JMDbg4005560.1161332913/antivirus.uqam.ca--
@@ -0,0 +1,50 @@
1
+ From email_test@me.nowhere
2
+ Return-Path: <email_test@me.nowhere>
3
+ Received: from omta05sl.mx.bigpond.com by me.nowhere.else with ESMTP id 632BD5758 for <mikel@me.nowhere.else>; Sun, 21 Oct 2007 19:38:21 +1000
4
+ Received: from oaamta05sl.mx.bigpond.com by omta05sl.mx.bigpond.com with ESMTP id <20071021093820.HSPC16667.omta05sl.mx.bigpond.com@oaamta05sl.mx.bigpond.com> for <mikel@me.nowhere.else>; Sun, 21 Oct 2007 19:38:20 +1000
5
+ Received: from mikel091a by oaamta05sl.mx.bigpond.com with SMTP id <20071021093820.JFMT24025.oaamta05sl.mx.bigpond.com@mikel091a> for <mikel@me.nowhere.else>; Sun, 21 Oct 2007 19:38:20 +1000
6
+ Date: Sun, 21 Oct 2007 19:38:13 +1000
7
+ From: Mikel Lindsaar <email_test@me.nowhere>
8
+ Reply-To: Mikel Lindsaar <email_test@me.nowhere>
9
+ To: mikel@me.nowhere
10
+ Message-Id: <009601c813c6$19df3510$0437d30a@mikel091a>
11
+ Subject: Testing outlook
12
+ Subject: Another PDF
13
+ Mime-Version: 1.0
14
+ Content-Type: multipart/mixed;
15
+ boundary="----=_Part_2192_32400445.1115745999735"
16
+ X-Virus-Scanned: amavisd-new at textdrive.com
17
+
18
+ ------=_Part_2192_32400445.1115745999735
19
+ Content-Type: text/plain; charset=ISO-8859-1
20
+ Content-Transfer-Encoding: quoted-printable
21
+ Content-Disposition: inline
22
+
23
+ Just attaching another PDF, here, to see what the message looks like,
24
+ and to see if I can figure out what is going wrong here.
25
+
26
+ ------=_Part_2192_32400445.1115745999735
27
+ Content-Type: application/pdf; name="broken.pdf"
28
+ Content-Transfer-Encoding: base64
29
+ Content-Disposition: attachment; filename="broken.pdf"
30
+
31
+ JVBERi0xLjQNCiXk9tzfDQoxIDAgb2JqDQo8PCAvTGVuZ3RoIDIgMCBSDQogICAvRmlsdGVyIC9G
32
+ bGF0ZURlY29kZQ0KPj4NCnN0cmVhbQ0KeJy9Wt2KJbkNvm/od6jrhZxYln9hWEh2p+8HBvICySaE
33
+ ycLuTV4/1ifJ9qnq09NpSBimu76yLUuy/qzqcPz7+em3Ixx/CDc6CsXxs3b5+fvfjr/8cPz6/BRu
34
+ rbfAx/n3739/fuJylJ5u5fjX81OuDr4deK4Bz3z/aDP+8fz0yw8g0Ofq7ktr1Mn+u28rvhy/jVeD
35
+ QSa+9YNKHP/pxjvDNfVAx/m3MFz54FhvTbaseaxiDoN2LeMVMw+yA7RbHSCDzxZuaYB2E1Yay7QU
36
+ x89vz0+tyFDKMlAHK5yqLmnjF+c4RjEiQIUeKwblXMe+AsZjN1J5yGQL5DHpDHksurM81rF6PKab
37
+ gK6zAarIDzIiUY23rJsN9iorAE816aIu6lsgAdQFsuhhkHOUFgVjp2GjMqSewITXNQ27jrMeamkg
38
+ 1rPI3iLWG2CIaSBB+V1245YVRICGbbpYKHc2USFDl6M09acQVQYhlwIrkBNLISvXhGlF1wi5FHCw
39
+ wxZkoGNJlVeJCEsqKA+3YAV5AMb6KkeaqEJQmFKKQU8T1pRi2ihE1Y4CDrqoYFFXYjJJOatsyzuI
40
+ 8SIlykuxKTMibWK8H1PgEvqYgs4GmQSrEjJAalgGirIhik+p4ZQN9E3ETFPAHE1b8pp1l/0Rc1gl
41
+ fQs0ABWvyoZZzU8VnPXwVVcO9BEsyjEJaO6eBoZRyKGlrKoYoOygA8BGIzgwN3RQ15ouigG5idZQ
42
+ fx2U4Db2CqiLO0WHAZoylGiCAqhniNQjFjQPSkmjwfNTgQ6M1Ih+eWo36wFmjIxDJZiGUBiWsAyR
43
+ xX3EekGOizkGI96Ol9zVZTAivikURhRsHh2E3JhWMpSTZCnnonrLhMCodgrNcgo4uyJUJc6qnVss
44
+ nrGd1Ptr0YwisCOYyIbUwVjV4xBUNLbguSO2YHujonAMJkMdSI7bIw91Akq2AUlMUWGFTMAOamjU
45
+ OvZQCxIkY2pCpMFo/IwLdVLHs6nddwTRrgoVbvLU9eB0G4EMndV0TNoxHbt3JBWwK6hhv3iHfDtF
46
+ yokB302IpEBTnWICde4uYc/1khDbSIkQopO6lcqamGBu1OSE3N5IPSsZX00CkSHRiiyx6HQIShsS
47
+ HSVNswdVsaOUSAWq9aYhDtGDaoG5a3lBGkYt/lFlBFt1UqrYnzVtUpUQnLiZeouKgf1KhRBViRRk
48
+ ExepJCzTwEmFDalIRbLEGtw0gfpESOpIAF/NnpPzcVCG86s0g2DuSyd41uhNGbEgaSrWEXORErbw
49
+ ------=_Part_2192_32400445.1115745999735--
50
+
@@ -0,0 +1,100 @@
1
+ From jamis@37signals.com Thu Feb 22 11:20:31 2007
2
+ Mime-Version: 1.0 (Apple Message framework v752.3)
3
+ Message-Id: <2CCE0408-10C7-4045-9B16-A1C11C31469B@37signals.com>
4
+ Content-Type: multipart/signed;
5
+ micalg=sha1;
6
+ boundary=Apple-Mail-42-587703407;
7
+ protocol="application/pkcs7-signature"
8
+ To: Jamis Buck <jamis@jamisbuck.org>
9
+ Subject: Testing attachments
10
+ From: Jamis Buck <jamis@37signals.com>
11
+ Date: Thu, 22 Feb 2007 11:20:31 -0700
12
+
13
+
14
+ --Apple-Mail-42-587703407
15
+ Content-Type: multipart/mixed;
16
+ boundary=Apple-Mail-41-587703287
17
+
18
+
19
+ --Apple-Mail-41-587703287
20
+ Content-Transfer-Encoding: 7bit
21
+ Content-Type: text/plain;
22
+ charset=US-ASCII;
23
+ format=flowed
24
+
25
+ Here is a test of an attachment via email.
26
+
27
+ - Jamis
28
+
29
+
30
+ --Apple-Mail-41-587703287
31
+ Content-Transfer-Encoding: base64
32
+ Content-Type: image/png;
33
+ x-unix-mode=0644;
34
+ name=byo-ror-cover.png
35
+ Content-Disposition: inline;
36
+ filename=truncated.png
37
+
38
+ iVBORw0KGgoAAAANSUhEUgAAAKUAAADXCAYAAAB7wZEQAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz
39
+ AAALEgAACxIB0t1+/AAAABd0RVh0Q3JlYXRpb24gVGltZQAxLzI1LzIwMDeD9CJVAAAAGHRFWHRT
40
+ b2Z0d2FyZQBBZG9iZSBGaXJld29ya3NPsx9OAAAyBWlUWHRYTUw6Y29tLmFkb2JlLnhtcDw/eHBh
41
+ Y2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+Cjx4OnhtcG1l
42
+ dGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDQuMS1j
43
+ MDIwIDEuMjU1NzE2LCBUdWUgT2N0IDEwIDIwMDYgMjM6MTY6MzQiPgogICA8cmRmOlJERiB4bWxu
44
+ czpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAg
45
+ ICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXA9Imh0
46
+ dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eGFwOkNyZWF0b3JUb29sPkFk
47
+ b2JlIEZpcmV3b3JrcyBDUzM8L3hhcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhhcDpDcmVhdGVE
48
+ YXRlPjIwMDctMDEtMjVUMDU6Mjg6MjFaPC94YXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhhcDpN
49
+ b2RpZnlEYXRlPjIwMDctMDEtMjVUMDU6Mjg6MjFaPC94YXA6TW9kaWZ5RGF0ZT4KICAgICAgPC9y
50
+ ZGY6RGVzY3JpcHRpb24+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAg
51
+ ICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+CiAgICAg
52
+ ICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgIDwvcmRmOkRlc2NyaXB0
53
+ hhojpmnJMfaYFmSkXWg5PGCmHXVj/c9At0hSK2xGdd8F3muk0VFjb4f5Ue0ksQ8qAcq0delaXhdb
54
+ DjKNnF+3B3t9kObZYmk7AZgWYqO9anpR3wpM9sQ5XslB9a+kWyTtNb0fOmudzGHfPFBQDKesyycm
55
+ DBL7Cw5bXjIEuci+SSOm/LYnXDZu6iuPEj8lYBb+OU8xx1f9m+e5rhJiYKqjo5vHfiZp+VUkW9xc
56
+ Ufd6JHNWc47PkQqb9ie3SLEZB/ZqyAssiqURY+G35iOMZUrHbasHnb80QAPv9FHtAbJIyro7bi5b
57
+ ai2TEAKen5+LJNWrglZjm3UbZvt7KryA2J5b5J1jZF8kL6GzvG1Zqx54Y1y7J7n20wMOt9frG2sW
58
+ uwGP07kNz3732vf6bfvAvLldfS+9fts2euXY37D+R29FGZdlnhzV4TTFmPJduBP2RbNNua4rTqcT
59
+ Qt7Xy1KUB0AHSdP5AZQYvHZg7WD1XvYeMO1A9HhZPqMX5KXbMBrn2efxns/ee21674efxz4Tp/fq
60
+ 2HZ648dgYaC1i3Vq1IbNPq3PvDTPezY9FaRISjvnzWqdgcWN8EJgjnNq+Z7ktOm9l2Nfth28EZi4
61
+ bG/we5JwxM+Tql47/D/X6b38I8/RyxvxPJrX6zvQbo3h9jyJx+C0ALX327QETHl5eYlaYCT5rPTb
62
+ +5/rAq26t3lKIxV/p88hq6ptngdgCzoPjJqndiLfc/6y5A14WeDFGNPct4iUsJBV2bYzLEV7m83s
63
+ 6Rp63VPhHKC/g/LzaU9qexJRr56043JWinqAtfZqsSm1sjoznthl54dtCqv+uL4nIY+oYWuc3+nH
64
+ kGfn8b0HQpvOYLQAZUDanbJs3jQhITZEgdarZK+cO6ySlL13rut5nFaN23s7u3Snz6eRPTkCoc2/
65
+ Vp1zHfZVFpZ87FiMVLV1iqyK5rlzfji2GzjfDsodlD+Weo5UD4h6PwKqzQMqID0tq2VjjFVSMpis
66
+ ZLRAs7sePZBZAHI+gIanB8I7MD+femAceeUe2Kxa5jS950kZ1p5eNEdeX1+jFmSpZ+1EdWCsDcne
67
+ NPNgUHNw3aYpnzv9PGTX0uo94EtN9qq1rOdxe3kc79T8ukeHJJ8Fnxej6qlylbLLsjQLOy6Xy2a1
68
+ kefs/N+nM7+S7IG5/E5Yc7F003pWErLjbH0O5cGadiMptSB/DZ5U5DI9yeg5MFYyMj8lC/Y7/Xjq
69
+ OZlWcnpg9aQfXz2HRq+Wn5xOp6gN8tWq8R44e2pfyzLYemEgprst+XXk2Zj2nXlbsG05BprndTMv
70
+ C3QRaXczshhVsHnMgfYn80Y2g5JureA6wBasPeP7LkE/jvZMJAaf/g/U2RelHsisvan5FqweIAHg
71
+ Pwc7L68GxvVDAAAAAElFTkSuQmCC
72
+
73
+ --Apple-Mail-41-587703287--
74
+
75
+ --Apple-Mail-42-587703407
76
+ Content-Transfer-Encoding: base64
77
+ Content-Type: application/pkcs7-signature;
78
+ name=smime.p7s
79
+ Content-Disposition: attachment;
80
+ filename=smime.p7s
81
+
82
+ MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIGJzCCAuAw
83
+ ggJJoAMCAQICEFjnFNYXwDEZRWY5EkfzopUwDQYJKoZIhvcNAQEFBQAwYjELMAkGA1UEBhMCWkEx
84
+ JTAjBgNVBAoTHFRoYXd0ZSBDb25zdWx0aW5nIChQdHkpIEx0ZC4xLDAqBgNVBAMTI1RoYXd0ZSBQ
85
+ ZXJzb25hbCBGcmVlbWFpbCBJc3N1aW5nIENBMB4XDTA2MDkxMjE3MDExMloXDTA3MDkxMjE3MDEx
86
+ MlowRTEfMB0GA1UEAxMWVGhhd3RlIEZyZWVtYWlsIE1lbWJlcjEiMCAGCSqGSIb3DQEJARYTamFt
87
+ aXNAMzdzaWduYWxzLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAO2A9JeOFIFJ
88
+ G6z8pTcAldrZ2nMe+Xb1tNrbHgoVzN/QhHXM4qst2Ml93cmFLjMmwG7P9RJeU4oNx+jTqVoBB7NV
89
+ Ne1/o56Do0KhfMZ9iUDQdPLbkZMq4EEpFMdm6PyM3muRKwPhj66iAWe/osCb8DowUK2f66vaRx0Z
90
+ Y0MQHIIrXE02Ta4IfAhIfPqBLkZ4WgTYBHN9vMdYea1jF0GO4gqGk1wqwb3yxv2QMYMbwJ6SI+k/
91
+ ZjkSR/OilTCBhwYLKoZIhvcNAQkQAgsxeKB2MGIxCzAJBgNVBAYTAlpBMSUwIwYDVQQKExxUaGF3
92
+ dGUgQ29uc3VsdGluZyAoUHR5KSBMdGQuMSwwKgYDVQQDEyNUaGF3dGUgUGVyc29uYWwgRnJlZW1h
93
+ aWwgSXNzdWluZyBDQQIQWOcU1hfAMRlFZjkSR/OilTANBgkqhkiG9w0BAQEFAASCAQCfwQiC3v6/
94
+ yleRDGv3bJ4nQYQ+c3mz3+mn3Xi6uU35n3piwxZZaWRdmLyiXPvU+QReHpSf3l2qsEZM3sdE0XF9
95
+ eRul/+QTFJcDNXOEAxG1zC2Gpz+6c6RrX4Ou12Pwkp+pNrZWTSY/mZgdqcArupOBcZi7qBjoWcy5
96
+ wb54dfvSSjrjmqLbkH/E8ww/6gGQuU/xXpAUZgUrTmQHrNKeIdSh5oDkOxFaFWvnmb8Z/2ixKqW/
97
+ Ux6WqamyvBtTs/5YBEtnpZOk+uVoscYEUBhU+DVJ2OSvTdXSivMtBdXmGTsG22k+P1NGUHi/A7ev
98
+ xPaO0uk4V8xyjNlN4HPuGpkrlXwPAAAAAAAA
99
+
100
+ --Apple-Mail-42-587703407--
@@ -0,0 +1,14 @@
1
+ From jamis@37signals.com Mon May 2 16:07:05 2005
2
+ Mime-Version: 1.0 (Apple Message framework v622)
3
+ Content-Transfer-Encoding: base64
4
+ Message-Id: <d3b8cf8e49f04480850c28713a1f473e@37signals.com>
5
+ Content-Type: text/plain;
6
+ charset=EUC-KR;
7
+ format=flowed
8
+ To: jamis@37signals.com
9
+ From: Jamis Buck <jamis@37signals.com>
10
+ Subject: Re: Test: =?UTF-8?B?Iua8ouWtlyI=?= mid =?UTF-8?B?Iua8ouWtlyI=?= tail
11
+ Date: Mon, 2 May 2005 16:07:05 -0600
12
+
13
+ tOu6zrrQwMcguLbC+bChwfa3ziwgv+y4rrTCIMfPs6q01MC7ILnPvcC0z7TZLg0KDQrBpiDAzLin
14
+ wLogSmFtaXPA1LTPtNku
@@ -0,0 +1,58 @@
1
+ From email_test@me.nowhere
2
+ Return-Path: <email_test@me.nowhere>
3
+ Received: from omta05sl.mx.bigpond.com by me.nowhere.else with ESMTP id 632BD5758 for <mikel@me.nowhere.else>; Sun, 21 Oct 2007 19:38:21 +1000
4
+ Received: from oaamta05sl.mx.bigpond.com by omta05sl.mx.bigpond.com with ESMTP id <20071021093820.HSPC16667.omta05sl.mx.bigpond.com@oaamta05sl.mx.bigpond.com> for <mikel@me.nowhere.else>; Sun, 21 Oct 2007 19:38:20 +1000
5
+ Received: from mikel091a by oaamta05sl.mx.bigpond.com with SMTP id <20071021093820.JFMT24025.oaamta05sl.mx.bigpond.com@mikel091a> for <mikel@me.nowhere.else>; Sun, 21 Oct 2007 19:38:20 +1000
6
+ Date: Sun, 21 Oct 2007 19:38:13 +1000
7
+ From: Mikel Lindsaar <email_test@me.nowhere>
8
+ Reply-To: Mikel Lindsaar <email_test@me.nowhere>
9
+ To: mikel@me.nowhere
10
+ Message-Id: <009601c813c6$19df3510$0437d30a@mikel091a>
11
+ Subject: Testing outlook
12
+ Mime-Version: 1.0
13
+ Content-Type: multipart/alternative; boundary="----=_NextPart_000_0093_01C81419.EB75E850"
14
+ X-Get_mail_default: mikel@me.nowhere.else
15
+ X-Priority: 3
16
+ X-Original-To: mikel@me.nowhere
17
+ X-Mailer: Microsoft Outlook Express 6.00.2900.3138
18
+ Delivered-To: mikel@me.nowhere
19
+ X-Mimeole: Produced By Microsoft MimeOLE V6.00.2900.3138
20
+ X-Msmail-Priority: Normal
21
+
22
+ This is a multi-part message in MIME format.
23
+
24
+
25
+ ------=_NextPart_000_0093_01C81419.EB75E850
26
+ Content-Type: text/plain; charset=iso-8859-1
27
+ Content-Transfer-Encoding: Quoted-printable
28
+
29
+ Hello
30
+ This is an outlook test
31
+
32
+ So there.
33
+
34
+ Me.
35
+
36
+ ------=_NextPart_000_0093_01C81419.EB75E850
37
+ Content-Type: text/html; charset=iso-8859-1
38
+ Content-Transfer-Encoding: Quoted-printable
39
+
40
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
41
+ <HTML><HEAD>
42
+ <META http-equiv=3DContent-Type content=3D"text/html; =
43
+ charset=3Diso-8859-1">
44
+ <META content=3D"MSHTML 6.00.6000.16525" name=3DGENERATOR>
45
+ <STYLE></STYLE>
46
+ </HEAD>
47
+ <BODY bgColor=3D#ffffff>
48
+ <DIV><FONT face=3DArial size=3D2>Hello</FONT></DIV>
49
+ <DIV><FONT face=3DArial size=3D2><STRONG>This is an outlook=20
50
+ test</STRONG></FONT></DIV>
51
+ <DIV><FONT face=3DArial size=3D2><STRONG></STRONG></FONT>&nbsp;</DIV>
52
+ <DIV><FONT face=3DArial size=3D2><STRONG>So there.</STRONG></FONT></DIV>
53
+ <DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
54
+ <DIV><FONT face=3DArial size=3D2>Me.</FONT></DIV></BODY></HTML>
55
+
56
+
57
+ ------=_NextPart_000_0093_01C81419.EB75E850--
58
+
@@ -0,0 +1,14 @@
1
+ module Test
2
+ module Unit
3
+ class TestCase
4
+ def kcode(code)
5
+ begin
6
+ TMail.KCODE = code
7
+ yield
8
+ ensure
9
+ TMail.KCODE = 'NONE'
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,46 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+ require 'test_helper'
3
+ require 'tmail'
4
+ require 'kcode'
5
+ require 'time'
6
+
7
+ class TestMail < Test::Unit::TestCase
8
+ include TMail::TextUtils
9
+
10
+ def setup
11
+ @mail = TMail::Mail.new
12
+ end
13
+
14
+ def lf( str )
15
+ str.gsub(/\n|\r\n|\r/) { "\n" }
16
+ end
17
+
18
+ def crlf( str )
19
+ str.gsub(/\n|\r\n|\r/) { "\r\n" }
20
+ end
21
+
22
+ def test_MIME
23
+ # FIXME: test more.
24
+
25
+ kcode('EUC') {
26
+ mail = TMail::Mail.parse('From: hoge@example.jp (=?iso-2022-jp?B?GyRCJUYlOSVIGyhC?=)')
27
+ assert_not_nil mail['From']
28
+
29
+ expected = "\245\306\245\271\245\310"
30
+ if expected.respond_to? :force_encoding
31
+ expected.force_encoding(mail['From'].comments.first.encoding)
32
+ end
33
+ assert_equal [expected], mail['From'].comments
34
+
35
+ expected = "From: hoge@example.jp (\245\306\245\271\245\310)\n\n"
36
+ expected.force_encoding 'EUC-JP' if expected.respond_to? :force_encoding
37
+ assert_equal expected, mail.to_s
38
+ assert_equal expected, mail.decoded
39
+
40
+ expected = "From: hoge@example.jp (=?iso-2022-jp?B?GyRCJUYlOSVIGyhC?=)\r\n\r\n"
41
+ expected.force_encoding 'EUC-JP' if expected.respond_to? :force_encoding
42
+ assert_equal expected, mail.encoded
43
+ }
44
+ end
45
+
46
+ end
@@ -0,0 +1,1216 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+ require 'test_helper'
3
+ require 'tmail/address'
4
+
5
+ class TestAddress < Test::Unit::TestCase
6
+
7
+ def test_s_new
8
+ a = TMail::Address.new(%w(aamine), %w(loveruby net))
9
+ assert_instance_of TMail::Address, a
10
+ assert_nil a.phrase
11
+ assert_equal [], a.routes
12
+ assert_equal 'aamine@loveruby.net', a.spec
13
+ end
14
+
15
+ def test_local
16
+ [ [ ['aamine'], 'aamine' ],
17
+ [ ['Minero Aoki'], '"Minero Aoki"' ],
18
+ [ ['!@#$%^&*()'], '"!@#$%^&*()"' ],
19
+ [ ['a','b','c'], 'a.b.c' ]
20
+
21
+ ].each_with_index do |(words, ok), idx|
22
+ a = TMail::Address.new(words, nil)
23
+ assert_equal ok, a.local, "case #{idx+1}: #{ok.inspect}"
24
+ end
25
+ end
26
+
27
+ def test_domain
28
+ [ [ ['loveruby','net'], 'loveruby.net' ],
29
+ [ ['love ruby','net'], '"love ruby".net' ],
30
+ [ ['!@#$%^&*()'], '"!@#$%^&*()"' ],
31
+ [ ['[192.168.1.1]'], '[192.168.1.1]' ]
32
+
33
+ ].each_with_index do |(words, ok), idx|
34
+ a = TMail::Address.new(%w(test), words)
35
+ assert_equal ok, a.domain, "case #{idx+1}: #{ok.inspect}"
36
+ end
37
+ end
38
+
39
+ def test_EQUAL # ==
40
+ a = TMail::Address.new(%w(aamine), %w(loveruby net))
41
+ assert_equal a, a
42
+
43
+ b = TMail::Address.new(%w(aamine), %w(loveruby net))
44
+ b.phrase = 'Minero Aoki'
45
+ assert_equal a, b
46
+
47
+ b.routes.push 'a'
48
+ assert_equal a, b
49
+ end
50
+
51
+ def test_hash
52
+ a = TMail::Address.new(%w(aamine), %w(loveruby net))
53
+ assert_equal a.hash, a.hash
54
+
55
+ b = TMail::Address.new(%w(aamine), %w(loveruby net))
56
+ b.phrase = 'Minero Aoki'
57
+ assert_equal a.hash, b.hash
58
+
59
+ b.routes.push 'a'
60
+ assert_equal a.hash, b.hash
61
+ end
62
+
63
+ def test_dup
64
+ a = TMail::Address.new(%w(aamine), %w(loveruby net))
65
+ a.phrase = 'Minero Aoki'
66
+ a.routes.push 'someroute'
67
+
68
+ b = a.dup
69
+ assert_equal a, b
70
+
71
+ b.routes.push 'anyroute'
72
+ assert_equal a, b
73
+
74
+ b.phrase = 'AOKI, Minero'
75
+ assert_equal a, b
76
+ end
77
+
78
+ def test_inspect
79
+ a = TMail::Address.new(%w(aamine), %w(loveruby net))
80
+ a.inspect
81
+ a.phrase = 'Minero Aoki'
82
+ a.inspect
83
+ a.routes.push 'a'
84
+ a.routes.push 'b'
85
+ a.inspect
86
+ end
87
+
88
+
89
+ def validate_case__address( str, ok )
90
+ a = TMail::Address.parse(str)
91
+ assert_equal ok[:display_name], a.phrase, str.inspect + " (phrase)\n"
92
+ assert_equal ok[:address], a.spec, str.inspect + " (spec)\n"
93
+ assert_equal ok[:local], a.local, str.inspect + " (local)\n"
94
+ assert_equal ok[:domain], a.domain, str.inspect + " (domain)\n"
95
+ #assert_equal ok[:format], a.to_s, str.inspect + " (to_s)\n"
96
+ end
97
+
98
+ def validate_case__group( str, groupname, addrlist )
99
+ g = TMail::Address.parse(str)
100
+ assert_instance_of TMail::AddressGroup, g
101
+ assert_equal groupname, g.name
102
+ assert_equal addrlist.size, g.size
103
+ addrlist.each_with_index do |ok, idx|
104
+ a = g[idx]
105
+ assert_equal ok[:display_name], a.phrase, str.inspect + " (phrase)\n"
106
+ assert_equal ok[:address], a.spec, str.inspect + " (spec)\n"
107
+ assert_equal ok[:local], a.local, str.inspect + " (local)\n"
108
+ assert_equal ok[:domain], a.domain, str.inspect + " (domain)\n"
109
+ # assert_equal ok[:format], a.to_s, str.inspect + " (to_s)\n"
110
+ end
111
+ end
112
+
113
+ def test_parse__address
114
+ #
115
+ # basic tests
116
+ #
117
+
118
+ validate_case__address 'aamine@loveruby.net',
119
+ :display_name => nil,
120
+ :address => 'aamine@loveruby.net',
121
+ :local => 'aamine',
122
+ :domain => 'loveruby.net',
123
+ :format => 'aamine@loveruby.net'
124
+
125
+ validate_case__address 'Minero Aoki <aamine@loveruby.net>',
126
+ :display_name => 'Minero Aoki',
127
+ :address => 'aamine@loveruby.net',
128
+ :local => 'aamine',
129
+ :domain => 'loveruby.net',
130
+ :format => 'Minero Aoki <aamine@loveruby.net>'
131
+
132
+ validate_case__address 'Minero Aoki<aamine@loveruby.net>',
133
+ :display_name => 'Minero Aoki',
134
+ :address => 'aamine@loveruby.net',
135
+ :local => 'aamine',
136
+ :domain => 'loveruby.net',
137
+ :format => 'Minero Aoki <aamine@loveruby.net>'
138
+
139
+ validate_case__address '"Minero Aoki" <aamine@loveruby.net>',
140
+ :display_name => 'Minero Aoki',
141
+ :address => 'aamine@loveruby.net',
142
+ :local => 'aamine',
143
+ :domain => 'loveruby.net',
144
+ :format => 'Minero Aoki <aamine@loveruby.net>'
145
+
146
+ # integer in domain
147
+ validate_case__address 'Minero Aoki<aamine@0246.loveruby.net>',
148
+ :display_name => 'Minero Aoki',
149
+ :address => 'aamine@0246.loveruby.net',
150
+ :local => 'aamine',
151
+ :domain => '0246.loveruby.net',
152
+ :format => 'Minero Aoki <aamine@0246.loveruby.net>'
153
+
154
+ end
155
+
156
+ def test_parse__dots
157
+ 1.upto(10) do |times|
158
+ dots = "." * times
159
+ validate_case__address "hoge#{dots}test@docomo.ne.jp",
160
+ :display_name => nil,
161
+ :address => "hoge#{dots}test@docomo.ne.jp",
162
+ :local => "hoge#{dots}test",
163
+ :domain => 'docomo.ne.jp',
164
+ :format => "hoge#{dots}test@docomo.ne.jp"
165
+ end
166
+ end
167
+
168
+ unless RUBY_VERSION.match(/1.9/)
169
+ def test_parse__mime
170
+ # "\306\374\313\334\270\354"
171
+ # "\223\372\226{\214\352"
172
+ # "\e$BF|K\\8l\e(B"
173
+ # GyRCRnxLXDhsGyhC
174
+
175
+ TMail.KCODE = 'NONE'
176
+ validate_case__address\
177
+ '=?iso-2022-jp?B?GyRCRnxLXDhsGyhC?= <aamine@loveruby.net>',
178
+ :display_name => "\e$BF|K\\8l\e(B",
179
+ :address => 'aamine@loveruby.net',
180
+ :local => 'aamine',
181
+ :domain => 'loveruby.net',
182
+ :format => '=?iso-2022-jp?B?GyRCRnxLXDhsGyhC?= <aamine@loveruby.net>'
183
+
184
+ validate_case__address\
185
+ '=?iso-2022-jp?Q?=1b=24=42=46=7c=4b=5c=38=6c=1b=28=42?= <aamine@loveruby.net>',
186
+ :display_name => "\e$BF|K\\8l\e(B",
187
+ :address => 'aamine@loveruby.net',
188
+ :local => 'aamine',
189
+ :domain => 'loveruby.net',
190
+ :format => '=?iso-2022-jp?B?GyRCRnxLXDhsGyhC?= <aamine@loveruby.net>'
191
+
192
+ TMail.KCODE = 'EUC'
193
+ expected = "\306\374\313\334\270\354"
194
+ expected.force_encoding('EUC-JP') if expected.respond_to? :force_encoding
195
+ validate_case__address\
196
+ '=?iso-2022-jp?B?GyRCRnxLXDhsGyhC?= <aamine@loveruby.net>',
197
+ :display_name => expected,
198
+ :address => 'aamine@loveruby.net',
199
+ :local => 'aamine',
200
+ :domain => 'loveruby.net',
201
+ :format => '=?iso-2022-jp?B?GyRCRnxLXDhsGyhC?= <aamine@loveruby.net>'
202
+
203
+ validate_case__address\
204
+ '=?iso-2022-jp?Q?=1b=24=42=46=7c=4b=5c=38=6c=1b=28=42?= <aamine@loveruby.net>',
205
+ :display_name => expected,
206
+ :address => 'aamine@loveruby.net',
207
+ :local => 'aamine',
208
+ :domain => 'loveruby.net',
209
+ :format => '=?iso-2022-jp?B?GyRCRnxLXDhsGyhC?= <aamine@loveruby.net>'
210
+
211
+ TMail.KCODE = 'SJIS'
212
+ expected = "\223\372\226{\214\352"
213
+ expected.force_encoding('Windows-31J') if expected.respond_to? :force_encoding
214
+ validate_case__address\
215
+ '=?iso-2022-jp?B?GyRCRnxLXDhsGyhC?= <aamine@loveruby.net>',
216
+ :display_name => expected,
217
+ :address => 'aamine@loveruby.net',
218
+ :local => 'aamine',
219
+ :domain => 'loveruby.net',
220
+ :format => '=?iso-2022-jp?B?GyRCRnxLXDhsGyhC?= <aamine@loveruby.net>'
221
+
222
+ validate_case__address\
223
+ '=?iso-2022-jp?Q?=1b=24=42=46=7c=4b=5c=38=6c=1b=28=42?= <aamine@loveruby.net>',
224
+ :display_name => expected,
225
+ :address => 'aamine@loveruby.net',
226
+ :local => 'aamine',
227
+ :domain => 'loveruby.net',
228
+ :format => '=?iso-2022-jp?B?GyRCRnxLXDhsGyhC?= <aamine@loveruby.net>'
229
+ end
230
+ end
231
+
232
+ def test_parse__rawjp
233
+ begin
234
+ TMail.KCODE = 'EUC'
235
+ _test_parse__euc
236
+ _test_parse__jis
237
+ ensure
238
+ TMail.KCODE = 'NONE'
239
+ end
240
+ end
241
+
242
+ def _test_parse__euc
243
+ # raw EUC-JP
244
+ validate_case__address\
245
+ "\244\242\244\252\244\255 \244\337\244\315\244\355\244\246 <aamine@loveruby.net>",
246
+ :display_name => "\244\242\244\252\244\255 \244\337\244\315\244\355\244\246",
247
+ :address => 'aamine@loveruby.net',
248
+ :local => 'aamine',
249
+ :domain => 'loveruby.net',
250
+ :format => "\244\242\244\252\244\255 \244\337\244\315\244\355\244\246 <aamine@loveruby.net>"
251
+ end
252
+
253
+ def _test_parse__jis
254
+ # raw iso-2022-jp string in comment
255
+ validate_case__address\
256
+ "Minero Aoki (\e$B@DLZJvO:\e(B) <aamine@loveruby.net>",
257
+ :display_name => "Minero Aoki (\e$B@DLZJvO:\e(B)",
258
+ :address => 'aamine@loveruby.net',
259
+ :local => 'aamine',
260
+ :domain => 'loveruby.net',
261
+ :format => 'Minero Aoki <aamine@loveruby.net>'
262
+
263
+ validate_case__address\
264
+ "Minero Aoki <aamine@loveruby.net> (\e$B@DLZJvO:\e(B )",
265
+ :display_name => 'Minero Aoki',
266
+ :address => 'aamine@loveruby.net',
267
+ :local => 'aamine',
268
+ :domain => 'loveruby.net',
269
+ :format => 'Minero Aoki <aamine@loveruby.net>'
270
+
271
+ # raw iso-2022-jp string in quoted-word (it includes backslash)
272
+ validate_case__address\
273
+ %Q["\e$BF|K\\8l\e(B" <aamine@loveruby.net>],
274
+ :display_name => "\e$BF|K\\8l\e(B",
275
+ :address => 'aamine@loveruby.net',
276
+ :local => 'aamine',
277
+ :domain => 'loveruby.net',
278
+ :format => 'Minero Aoki <aamine@loveruby.net>'
279
+ end
280
+
281
+ def OFF_test_parse__group
282
+ validate_case__group 'Softica: Minero Aoki <aamine@loveruby.net>;',
283
+ 'Softica',
284
+ { :display_name => 'Minero Aoki',
285
+ :address => 'aamine@loveruby.net',
286
+ :local => 'aamine',
287
+ :domain => 'loveruby.net',
288
+ :format => 'Minero Aoki <aamine@loveruby.net>' }
289
+ end
290
+
291
+
292
+ #
293
+ # The following test cases are quoted from RubyMail 0.2
294
+ # (written by Matt Armstrong), with some modifications.
295
+ # The copyright notice of the original file is:
296
+ #
297
+ # Copyright (c) 2001 Matt Armstrong. All rights reserved.
298
+ #
299
+ # Permission is granted for use, copying, modification,
300
+ # distribution, and distribution of modified versions of this work
301
+ # as long as the above copyright notice is included.
302
+ #
303
+
304
+ def test_parse__rfc2822
305
+
306
+ validate_case__address\
307
+ '"Joe Q. Public" <john.q.public@example.com>',
308
+ :name => 'Joe Q. Public',
309
+ :display_name => 'Joe Q. Public',
310
+ :address => 'john.q.public@example.com',
311
+ :comments => nil,
312
+ :domain => 'example.com',
313
+ :local => 'john.q.public',
314
+ :format => '"Joe Q. Public" <john.q.public@example.com>'
315
+
316
+ validate_case__address\
317
+ 'Who? <one@y.test>',
318
+ :name => 'Who?',
319
+ :display_name => 'Who?',
320
+ :address => 'one@y.test',
321
+ :comments => nil,
322
+ :domain => 'y.test',
323
+ :local => 'one',
324
+ :format => 'Who? <one@y.test>'
325
+
326
+ validate_case__address\
327
+ '"Giant; \"Big\" Box" <sysservices@example.net>',
328
+ :name => 'Giant; "Big" Box',
329
+ :display_name => 'Giant; "Big" Box',
330
+ :address => 'sysservices@example.net',
331
+ :comments => nil,
332
+ :domain => 'example.net',
333
+ :local => 'sysservices',
334
+ :format => '"Giant; \"Big\" Box" <sysservices@example.net>'
335
+
336
+ validate_case__address\
337
+ '"Mary Smith: Personal Account" <smith@home.example> ',
338
+ :name => 'Mary Smith: Personal Account',
339
+ :display_name => 'Mary Smith: Personal Account',
340
+ :address => 'smith@home.example',
341
+ :comments => nil,
342
+ :domain => 'home.example',
343
+ :local => 'smith',
344
+ :format => '"Mary Smith: Personal Account" <smith@home.example>'
345
+
346
+ validate_case__address\
347
+ 'Pete(A wonderful \) chap) <pete(his account)@silly.test(his host)>',
348
+ :name => 'Pete',
349
+ :display_name => 'Pete',
350
+ :address => 'pete@silly.test',
351
+ :comments => ['A wonderful ) chap', 'his account', 'his host'],
352
+ :domain => 'silly.test',
353
+ :local => 'pete',
354
+ #:format => 'Pete <pete@silly.test> (A wonderful \) chap) (his account) (his host)'
355
+ :format => 'Pete <pete@silly.test>'
356
+
357
+ validate_case__address\
358
+ "Chris Jones <c@(Chris's host.)public.example>",
359
+ :name => 'Chris Jones',
360
+ :display_name => 'Chris Jones',
361
+ :address => 'c@public.example',
362
+ :comments => ['Chris\'s host.'],
363
+ :domain => 'public.example',
364
+ :local => 'c',
365
+ #:format => 'Chris Jones <c@public.example> (Chris\'s host.)'
366
+ :format => 'Chris Jones <c@public.example>'
367
+
368
+ validate_case__address\
369
+ 'Joe Q. Public <john.q.public@example.com>',
370
+ :name => 'Joe Q.Public',
371
+ :display_name => 'Joe Q.Public',
372
+ :address => 'john.q.public@example.com',
373
+ :comments => nil,
374
+ :domain => 'example.com',
375
+ :local => 'john.q.public',
376
+ :format => '"Joe Q.Public" <john.q.public@example.com>'
377
+
378
+ validate_case__address\
379
+ 'Mary Smith <@machine.tld:mary@example.net>',
380
+ :name => 'Mary Smith',
381
+ :display_name => 'Mary Smith',
382
+ :address => 'mary@example.net',
383
+ :comments => nil,
384
+ :domain => 'example.net',
385
+ :local => 'mary',
386
+ #:format => 'Mary Smith <mary@example.net>'
387
+ :format => 'Mary Smith <@machine.tld:mary@example.net>'
388
+
389
+ validate_case__address\
390
+ ' jdoe@test . example',
391
+ :name => nil,
392
+ :display_name => nil,
393
+ :address => 'jdoe@test.example',
394
+ :comments => nil,
395
+ :domain => 'test.example',
396
+ :local => 'jdoe',
397
+ :format => 'jdoe@test.example'
398
+
399
+ validate_case__address\
400
+ 'John Doe <jdoe@machine(comment). example>',
401
+ :name => 'John Doe',
402
+ :display_name => 'John Doe',
403
+ :address => 'jdoe@machine.example',
404
+ :comments => ['comment'],
405
+ :domain => 'machine.example',
406
+ :local => 'jdoe',
407
+ #:format => 'John Doe <jdoe@machine.example> (comment)'
408
+ :format => 'John Doe <jdoe@machine.example>'
409
+
410
+ validate_case__address\
411
+ "Mary Smith\n\r \n <mary@example.net>",
412
+ :name => 'Mary Smith',
413
+ :display_name => 'Mary Smith',
414
+ :address => 'mary@example.net',
415
+ :comments => nil,
416
+ :domain => 'example.net',
417
+ :local => 'mary',
418
+ :format => 'Mary Smith <mary@example.net>'
419
+ end
420
+
421
+
422
+ def test_parse__rfc822
423
+
424
+ validate_case__address\
425
+ '":sysmail"@ Some-Group. Some-Org',
426
+ :name => nil,
427
+ :display_name => nil,
428
+ #:address => ':sysmail@Some-Group.Some-Org',
429
+ :address => '":sysmail"@Some-Group.Some-Org',
430
+ :comments => nil,
431
+ :domain => 'Some-Group.Some-Org',
432
+ #:local => ':sysmail',
433
+ :local => '":sysmail"',
434
+ :format => '":sysmail"@Some-Group.Some-Org'
435
+
436
+ validate_case__address\
437
+ 'Muhammed.(I am the greatest) Ali @(the)Vegas.WBA',
438
+ :name => 'the',
439
+ :display_name => nil,
440
+ :address => 'Muhammed.Ali@Vegas.WBA',
441
+ :comments => ['I am the greatest', 'the'],
442
+ :domain => 'Vegas.WBA',
443
+ :local => 'Muhammed.Ali',
444
+ #:format => 'Muhammed.Ali@Vegas.WBA (I am the greatest) (the)'
445
+ :format => 'Muhammed.Ali@Vegas.WBA'
446
+
447
+
448
+ validate_case__group\
449
+ 'A Group:Chris Jones <c@a.test>,joe@where.test,John <jdoe@one.test>;',
450
+ 'A Group',
451
+ [ { :name => 'Chris Jones',
452
+ :display_name => 'Chris Jones',
453
+ :address => 'c@a.test',
454
+ :comments => nil,
455
+ :domain => 'a.test',
456
+ :local => 'c',
457
+ :format => 'Chris Jones <c@a.test>' },
458
+ { :name => nil,
459
+ :display_name => nil,
460
+ :address => 'joe@where.test',
461
+ :comments => nil,
462
+ :domain => 'where.test',
463
+ :local => 'joe',
464
+ :format => 'joe@where.test' },
465
+ { :name => 'John',
466
+ :display_name => 'John',
467
+ :address => 'jdoe@one.test',
468
+ :comments => nil,
469
+ :domain => 'one.test',
470
+ :local => 'jdoe',
471
+ :format => 'John <jdoe@one.test>' }
472
+ ]
473
+
474
+ validate_case__group\
475
+ 'Undisclosed recipients:;',
476
+ 'Undisclosed recipients',
477
+ [ ]
478
+
479
+ validate_case__group\
480
+ 'undisclosed recipients: ;',
481
+ 'undisclosed recipients',
482
+ []
483
+
484
+ validate_case__group\
485
+ "A Group(Some people)\r\n :Chris Jones <c@(Chris's host.)public.example>,\r\n joe@example.org",
486
+ 'A Group',
487
+ [
488
+ { :name => 'Chris Jones',
489
+ :display_name => 'Chris Jones',
490
+ :address => 'c@public.example',
491
+ :comments => ['Chris\'s host.'],
492
+ :domain => 'public.example',
493
+ :local => 'c',
494
+ :format => 'Chris Jones <c@public.example> (Chris\'s host.)' },
495
+ { :name => nil,
496
+ :display_name => nil,
497
+ :address => 'joe@example.org',
498
+ :comments => nil,
499
+ :domain => 'example.org',
500
+ :local => 'joe',
501
+ :format => 'joe@example.org' }
502
+ ]
503
+
504
+ validate_case__group\
505
+ '(Empty list)(start)Undisclosed recipients :(nobody(that I know)) ;',
506
+ 'Undisclosed recipients',
507
+ []
508
+ end
509
+
510
+
511
+ def test_parse__mailtools
512
+ #
513
+ # The following are from the Perl MailTools module version 1.40
514
+ #
515
+ validate_case__address\
516
+ '"Joe & J. Harvey" <ddd @Org>',
517
+ :name => 'Joe & J. Harvey',
518
+ :display_name => 'Joe & J. Harvey',
519
+ :address => 'ddd@Org',
520
+ :comments => nil,
521
+ :domain => 'Org',
522
+ :local => 'ddd',
523
+ :format => '"Joe & J. Harvey" <ddd@Org>'
524
+
525
+ validate_case__address\
526
+ '"spickett@tiac.net" <Sean.Pickett@zork.tiac.net>',
527
+ :name => 'spickett@tiac.net',
528
+ :display_name => 'spickett@tiac.net',
529
+ :address => 'Sean.Pickett@zork.tiac.net',
530
+ :comments => nil,
531
+ :domain => 'zork.tiac.net',
532
+ :local => 'Sean.Pickett',
533
+ :format => '"spickett@tiac.net" <Sean.Pickett@zork.tiac.net>'
534
+
535
+ validate_case__address\
536
+ 'rls@intgp8.ih.att.com (-Schieve,R.L.)',
537
+ :name => '-Schieve,R.L.',
538
+ :display_name => nil,
539
+ :address => 'rls@intgp8.ih.att.com',
540
+ :comments => ['-Schieve,R.L.'],
541
+ :domain => 'intgp8.ih.att.com',
542
+ :local => 'rls',
543
+ #:format => 'rls@intgp8.ih.att.com (-Schieve,R.L.)'
544
+ :format => 'rls@intgp8.ih.att.com'
545
+
546
+ validate_case__address\
547
+ 'jrh%cup.portal.com@portal.unix.portal.com',
548
+ :name => nil,
549
+ :display_name => nil,
550
+ :address => 'jrh%cup.portal.com@portal.unix.portal.com',
551
+ :comments => nil,
552
+ :domain => 'portal.unix.portal.com',
553
+ :local => 'jrh%cup.portal.com',
554
+ :format => 'jrh%cup.portal.com@portal.unix.portal.com'
555
+
556
+ validate_case__address\
557
+ 'astrachan@austlcm.sps.mot.com (\'paul astrachan/xvt3\')',
558
+ :name => '\'paul astrachan/xvt3\'',
559
+ :display_name => nil,
560
+ :address => 'astrachan@austlcm.sps.mot.com',
561
+ :comments => ["'paul astrachan/xvt3'"],
562
+ :domain => 'austlcm.sps.mot.com',
563
+ :local => 'astrachan',
564
+ #:format => "astrachan@austlcm.sps.mot.com ('paul astrachan/xvt3')"
565
+ :format => 'astrachan@austlcm.sps.mot.com'
566
+
567
+ validate_case__address\
568
+ 'TWINE57%SDELVB.decnet@SNYBUF.CS.SNYBUF.EDU (JAMES R. TWINE - THE NERD)',
569
+ :name => 'JAMES R. TWINE - THE NERD',
570
+ :display_name => nil,
571
+ :address => 'TWINE57%SDELVB.decnet@SNYBUF.CS.SNYBUF.EDU',
572
+ :comments => ['JAMES R. TWINE - THE NERD'],
573
+ :domain => 'SNYBUF.CS.SNYBUF.EDU',
574
+ :local => 'TWINE57%SDELVB.decnet',
575
+ :format => 'TWINE57%SDELVB.decnet@SNYBUF.CS.SNYBUF.EDU'
576
+ #'TWINE57%SDELVB.decnet@SNYBUF.CS.SNYBUF.EDU (JAMES R. TWINE - THE NERD)'
577
+
578
+ validate_case__address\
579
+ 'David Apfelbaum <da0g+@andrew.cmu.edu>',
580
+ :name => 'David Apfelbaum',
581
+ :display_name => 'David Apfelbaum',
582
+ :address => 'da0g+@andrew.cmu.edu',
583
+ :comments => nil,
584
+ :domain => 'andrew.cmu.edu',
585
+ :local => 'da0g+',
586
+ :format => 'David Apfelbaum <da0g+@andrew.cmu.edu>'
587
+
588
+ validate_case__address\
589
+ '"JAMES R. TWINE - THE NERD" <TWINE57%SDELVB%SNYDELVA.bitnet@CUNYVM.CUNY.EDU>',
590
+ :name => 'JAMES R. TWINE - THE NERD',
591
+ :display_name => 'JAMES R. TWINE - THE NERD',
592
+ :address => 'TWINE57%SDELVB%SNYDELVA.bitnet@CUNYVM.CUNY.EDU',
593
+ :comments => nil,
594
+ :domain => 'CUNYVM.CUNY.EDU',
595
+ :local => 'TWINE57%SDELVB%SNYDELVA.bitnet',
596
+ :format =>
597
+ '"JAMES R. TWINE - THE NERD" <TWINE57%SDELVB%SNYDELVA.bitnet@CUNYVM.CUNY.EDU>'
598
+
599
+ validate_case__address\
600
+ '/G=Owen/S=Smith/O=SJ-Research/ADMD=INTERSPAN/C=GB/@mhs-relay.ac.uk',
601
+ :name => nil,
602
+ :display_name => nil,
603
+ :address => '/G=Owen/S=Smith/O=SJ-Research/ADMD=INTERSPAN/C=GB/@mhs-relay.ac.uk',
604
+ :comments => nil,
605
+ :domain => 'mhs-relay.ac.uk',
606
+ :local => '/G=Owen/S=Smith/O=SJ-Research/ADMD=INTERSPAN/C=GB/',
607
+ :format => '/G=Owen/S=Smith/O=SJ-Research/ADMD=INTERSPAN/C=GB/@mhs-relay.ac.uk'
608
+
609
+ validate_case__address\
610
+ '"Stephen Burke, Liverpool" <BURKE@vxdsya.desy.de>',
611
+ :name => 'Stephen Burke, Liverpool',
612
+ :display_name => 'Stephen Burke, Liverpool',
613
+ :address => 'BURKE@vxdsya.desy.de',
614
+ :comments => nil,
615
+ :domain => 'vxdsya.desy.de',
616
+ :local => 'BURKE',
617
+ :format => '"Stephen Burke, Liverpool" <BURKE@vxdsya.desy.de>'
618
+
619
+ validate_case__address\
620
+ 'The Newcastle Info-Server <info-admin@newcastle.ac.uk>',
621
+ :name => 'The Newcastle Info-Server',
622
+ :display_name => 'The Newcastle Info-Server',
623
+ :address => 'info-admin@newcastle.ac.uk',
624
+ :comments => nil,
625
+ :domain => 'newcastle.ac.uk',
626
+ :local => 'info-admin',
627
+ :format => 'The Newcastle Info-Server <info-admin@newcastle.ac.uk>'
628
+
629
+ validate_case__address\
630
+ 'Suba.Peddada@eng.sun.com (Suba Peddada [CONTRACTOR])',
631
+ :name => 'Suba Peddada [CONTRACTOR]',
632
+ :display_name => nil,
633
+ :address => 'Suba.Peddada@eng.sun.com',
634
+ :comments => ['Suba Peddada [CONTRACTOR]'],
635
+ :domain => 'eng.sun.com',
636
+ :local => 'Suba.Peddada',
637
+ #:format => 'Suba.Peddada@eng.sun.com (Suba Peddada [CONTRACTOR])'
638
+ :format => 'Suba.Peddada@eng.sun.com'
639
+
640
+ validate_case__address\
641
+ 'Paul Manser (0032 memo) <a906187@tiuk.ti.com>',
642
+ :name => 'Paul Manser',
643
+ :display_name => 'Paul Manser',
644
+ :address => 'a906187@tiuk.ti.com',
645
+ :comments => ['0032 memo'],
646
+ :domain => 'tiuk.ti.com',
647
+ :local => 'a906187',
648
+ #:format => 'Paul Manser <a906187@tiuk.ti.com> (0032 memo)'
649
+ :format => 'Paul Manser <a906187@tiuk.ti.com>'
650
+
651
+ validate_case__address\
652
+ '"gregg (g.) woodcock" <woodcock@bnr.ca>',
653
+ :name => 'gregg (g.) woodcock',
654
+ :display_name => 'gregg (g.) woodcock',
655
+ :address => 'woodcock@bnr.ca',
656
+ :comments => nil,
657
+ :domain => 'bnr.ca',
658
+ :local => 'woodcock',
659
+ :format => '"gregg (g.) woodcock" <woodcock@bnr.ca>'
660
+
661
+ validate_case__address\
662
+ 'Graham.Barr@tiuk.ti.com',
663
+ :name => nil,
664
+ :display_name => nil,
665
+ :address => 'Graham.Barr@tiuk.ti.com',
666
+ :comments => nil,
667
+ :domain => 'tiuk.ti.com',
668
+ :local => 'Graham.Barr',
669
+ :format => 'Graham.Barr@tiuk.ti.com'
670
+
671
+ validate_case__address\
672
+ 'a909937 (Graham Barr (0004 bodg))',
673
+ :name => 'Graham Barr (0004 bodg)',
674
+ :display_name => nil,
675
+ :address => 'a909937',
676
+ :comments => ['Graham Barr (0004 bodg)'],
677
+ :domain => nil,
678
+ :local => 'a909937',
679
+ #:format => 'a909937 (Graham Barr \(0004 bodg\))'
680
+ :format => 'a909937'
681
+
682
+ validate_case__address\
683
+ "david d `zoo' zuhn <zoo@aggregate.com>",
684
+ :name => "david d `zoo' zuhn",
685
+ :display_name => "david d `zoo' zuhn",
686
+ :address => 'zoo@aggregate.com',
687
+ :comments => nil,
688
+ :domain => 'aggregate.com',
689
+ :local => 'zoo',
690
+ :format => "david d `zoo' zuhn <zoo@aggregate.com>"
691
+
692
+ validate_case__address\
693
+ '(foo@bar.com (foobar), ned@foo.com (nedfoo) ) <kevin@goess.org>',
694
+ :name => 'foo@bar.com (foobar), ned@foo.com (nedfoo) ',
695
+ :display_name => "(foo@bar.com (foobar), ned@foo.com (nedfoo) )",
696
+ :address => 'kevin@goess.org',
697
+ :comments => ['foo@bar.com (foobar), ned@foo.com (nedfoo) '],
698
+ :domain => 'goess.org',
699
+ :local => 'kevin',
700
+ :format => 'kevin@goess.org'
701
+ #'kevin@goess.org (foo@bar.com \(foobar\), ned@foo.com \(nedfoo\) )'
702
+ end
703
+
704
+
705
+ def test_parse__pythonbuglist
706
+ #
707
+ # From Python address parsing bug list.
708
+ # This is valid according to RFC2822.
709
+ #
710
+
711
+ validate_case__address\
712
+ 'Amazon.com <delivers-news2@amazon.com>',
713
+ :name => 'Amazon.com',
714
+ :display_name => 'Amazon.com',
715
+ :address => 'delivers-news2@amazon.com',
716
+ :comments => nil,
717
+ :domain => 'amazon.com',
718
+ :local => 'delivers-news2',
719
+ :format => '"Amazon.com" <delivers-news2@amazon.com>'
720
+
721
+ validate_case__address\
722
+ "\r\n Amazon \r . \n com \t < delivers-news2@amazon.com > \n ",
723
+ :name => 'Amazon.com',
724
+ :display_name => 'Amazon.com',
725
+ :address => 'delivers-news2@amazon.com',
726
+ :comments => nil,
727
+ :domain => 'amazon.com',
728
+ :local => 'delivers-news2',
729
+ :format => '"Amazon.com" <delivers-news2@amazon.com>'
730
+
731
+ # From postfix-users@postfix.org
732
+ # Date: Tue, 13 Nov 2001 10:58:23 -0800
733
+ # Subject: Apparent bug in strict_rfc821_envelopes (Snapshot-20010714)
734
+ validate_case__address\
735
+ '"mailto:rfc"@monkeys.test',
736
+ :name => nil,
737
+ :display_name => nil,
738
+ #:address => 'mailto:rfc@monkeys.test',
739
+ :address => '"mailto:rfc"@monkeys.test',
740
+ :comments => nil,
741
+ :domain => 'monkeys.test',
742
+ #:local => 'mailto:rfc',
743
+ :local => '"mailto:rfc"',
744
+ :format => '"mailto:rfc"@monkeys.test'
745
+
746
+ # An unquoted mailto:rfc will end up having the mailto: portion
747
+ # discarded as a group name.
748
+ validate_case__group\
749
+ 'mailto:rfc@monkeys.test',
750
+ 'mailto',
751
+ [
752
+ { :name => nil,
753
+ :display_name => nil,
754
+ :address => 'rfc@monkeys.test',
755
+ :comments => nil,
756
+ :domain => 'monkeys.test',
757
+ :local => 'rfc',
758
+ :format => 'rfc@monkeys.test' }
759
+ ]
760
+
761
+ # From gnu.emacs.help
762
+ # Date: 24 Nov 2001 15:37:23 -0500
763
+ validate_case__address\
764
+ '"Stefan Monnier <foo@acm.com>" <monnier+gnu.emacs.help/news/@flint.cs.yale.edu>',
765
+ :name => 'Stefan Monnier <foo@acm.com>',
766
+ :display_name => 'Stefan Monnier <foo@acm.com>',
767
+ :address => 'monnier+gnu.emacs.help/news/@flint.cs.yale.edu',
768
+ :comments => nil,
769
+ :domain => 'flint.cs.yale.edu',
770
+ :local => 'monnier+gnu.emacs.help/news/',
771
+ :format => '"Stefan Monnier <foo@acm.com>" <monnier+gnu.emacs.help/news/@flint.cs.yale.edu>'
772
+
773
+ validate_case__address\
774
+ '"foo:" . bar@somewhere.test',
775
+ :name => nil,
776
+ :display_name => nil,
777
+ #:address => 'foo:.bar@somewhere.test',
778
+ :address => '"foo:".bar@somewhere.test',
779
+ :comments => nil,
780
+ :domain => 'somewhere.test',
781
+ #:local => 'foo:.bar',
782
+ :local => '"foo:".bar',
783
+ #:format => '"foo:.bar"@somewhere.test'
784
+ :format => '"foo:".bar@somewhere.test'
785
+
786
+ validate_case__address\
787
+ 'Some Dude <"foo:" . bar@somewhere.test>',
788
+ :name => 'Some Dude',
789
+ :display_name => 'Some Dude',
790
+ #:address => 'foo:.bar@somewhere.test',
791
+ :address => '"foo:".bar@somewhere.test',
792
+ :comments => nil,
793
+ :domain => 'somewhere.test',
794
+ #:local => 'foo:.bar',
795
+ :local => '"foo:".bar',
796
+ #:format => 'Some Dude <"foo:.bar"@somewhere.test>'
797
+ :format => 'Some Dude <"foo:".bar@somewhere.test>'
798
+
799
+ validate_case__address\
800
+ '"q\uo\ted"@example.com',
801
+ :name => nil,
802
+ :display_name => nil,
803
+ :address => 'quoted@example.com',
804
+ :comments => nil,
805
+ :domain => 'example.com',
806
+ :local => 'quoted',
807
+ :format => 'quoted@example.com'
808
+
809
+ validate_case__address\
810
+ 'Luke Skywalker <"use"."the.force"@space.test>',
811
+ :name => 'Luke Skywalker',
812
+ :display_name => 'Luke Skywalker',
813
+ #:address => 'use.the.force@space.test',
814
+ :address => 'use."the.force"@space.test',
815
+ :comments => nil,
816
+ :domain => 'space.test',
817
+ #:local => 'use.the.force',
818
+ :local => 'use."the.force"',
819
+ #:format => 'Luke Skywalker <use.the.force@space.test>'
820
+ :format => 'Luke Skywalker <use."the.force"@space.test>'
821
+
822
+ validate_case__address\
823
+ 'Erik =?ISO-8859-1?Q?B=E5gfors?= <erik@example.net>',
824
+ :name => 'Erik =?ISO-8859-1?Q?B=E5gfors?=',
825
+ :display_name => 'Erik =?ISO-8859-1?Q?B=E5gfors?=',
826
+ :address => 'erik@example.net',
827
+ :comments => nil,
828
+ :domain => 'example.net',
829
+ :local => 'erik',
830
+ :format => 'Erik =?ISO-8859-1?Q?B=E5gfors?= <erik@example.net>'
831
+ end
832
+
833
+ def test_parse__outofspec
834
+
835
+ =begin
836
+ validate_case__address\
837
+ 'bodg fred@tiuk.ti.com',
838
+ :name => nil,
839
+ :display_name => nil,
840
+ :address => 'bodg fred@tiuk.ti.com',
841
+ :comments => nil,
842
+ :domain => 'tiuk.ti.com',
843
+ :local => 'bodg fred',
844
+ :format => '"bodg fred"@tiuk.ti.com'
845
+
846
+ validate_case__address\
847
+ '<Investor Alert@example.com>',
848
+ :name => nil,
849
+ :display_name => nil,
850
+ :address => 'Investor Alert@example.com',
851
+ :comments => nil,
852
+ :domain => 'example.com',
853
+ :local => 'Investor Alert',
854
+ :format => '"Investor Alert"@example.com'
855
+ =end
856
+
857
+ validate_case__address\
858
+ '"" <bob@example.com>',
859
+ :name => nil,
860
+ :display_name => nil,
861
+ :address => 'bob@example.com',
862
+ :comments => nil,
863
+ :domain => 'example.com',
864
+ :local => 'bob',
865
+ :format => 'bob@example.com'
866
+
867
+ validate_case__address '"" <""@example.com>',
868
+ :name => nil,
869
+ :display_name => nil,
870
+ :address => '""@example.com',
871
+ :comments => nil,
872
+ :domain => 'example.com',
873
+ :local => '""',
874
+ :format => '""@example.com'
875
+
876
+ assert_raise(TMail::SyntaxError) {
877
+ TMail::Address.parse '@example.com'
878
+ }
879
+
880
+ validate_case__address\
881
+ 'bob',
882
+ :name => nil,
883
+ :display_name => nil,
884
+ :address => 'bob',
885
+ :comments => nil,
886
+ :domain => nil,
887
+ :local => 'bob',
888
+ :format => 'bob'
889
+
890
+ assert_raises(TMail::SyntaxError) {
891
+ TMail::Address.parse 'Undisclosed <>'
892
+ }
893
+ assert_raises(TMail::SyntaxError) {
894
+ TMail::Address.parse '"Mensagem Automatica do Terra" <>'
895
+ }
896
+
897
+ # These test cases are meanful in Japanese charset context.
898
+ # validate_case(["\177", []])
899
+ # validate_case(["\177\177\177", []])
900
+
901
+ end
902
+
903
+ def test_parse__domainliteral
904
+
905
+ validate_case__address\
906
+ 'test@[domain]',
907
+ :name => nil,
908
+ :display_name => nil,
909
+ :address => 'test@[domain]',
910
+ :comments => nil,
911
+ :domain => '[domain]',
912
+ :local => 'test',
913
+ :format => '<test@[domain]>'
914
+
915
+ validate_case__address\
916
+ '<@[obsdomain]:test@[domain]>',
917
+ :name => nil,
918
+ :display_name => nil,
919
+ :address => 'test@[domain]',
920
+ :comments => nil,
921
+ :domain => '[domain]',
922
+ :local => 'test',
923
+ :format => '<test@[domain]>'
924
+
925
+ validate_case__address\
926
+ '<@[ob\]sd\\\\omain]:test@[dom\]ai\\\\n]>',
927
+ :name => nil,
928
+ :display_name => nil,
929
+ :address => 'test@[dom]ai\\n]',
930
+ :comments => nil,
931
+ :domain => '[dom]ai\\n]',
932
+ :local => 'test',
933
+ :format => '<test@[dom\]ai\\\\n]>'
934
+
935
+ # ALL 'route's have '@' prefix so this example is wrong.
936
+ #"Bob \r<@machine.tld \r,\n [obsdomain]\t:\ntest @ [domain]>",
937
+ validate_case__address\
938
+ "Bob \r<@machine.tld \r,\n @[obsdomain]\t:\ntest @ [domain]>",
939
+ :name => 'Bob',
940
+ :display_name => 'Bob',
941
+ :address => 'test@[domain]',
942
+ :comments => nil,
943
+ :domain => '[domain]',
944
+ :local => 'test',
945
+ :format => 'Bob <test@[domain]>'
946
+ end
947
+
948
+
949
+ def test_exhaustive()
950
+
951
+ # We don't test every alphanumeric in atext -- assume that if a, m
952
+ # and z work, they all will.
953
+ atext = ('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a +
954
+ '!#$%&\'*+-/=?^_`{|}~'.split(//) #/
955
+ boring = ('b'..'l').to_a + ('n'..'o').to_a +
956
+ ('p'..'y').to_a + ('B'..'L').to_a + ('N'..'O').to_a +
957
+ ('P'..'Y').to_a + ('1'..'4').to_a + ('6'..'8').to_a
958
+
959
+ (atext - boring).each do |ch|
960
+ validate_case__address\
961
+ "#{ch} <#{ch}@test>",
962
+ :name => ch,
963
+ :display_name => ch,
964
+ :address => "#{ch}@test",
965
+ :comments => nil,
966
+ :domain => 'test',
967
+ :local => ch,
968
+ :format => ch + ' <' + ch + '@test>'
969
+ end
970
+
971
+ validate_case__address\
972
+ atext.join('') + ' <' + atext.join('') + '@test>',
973
+ :name => atext.join(''),
974
+ :display_name => atext.join(''),
975
+ :address => atext.join('') + '@test',
976
+ :comments => nil,
977
+ :domain => 'test',
978
+ :local => atext.join(''),
979
+ :format => atext.join('') + ' <' + atext.join('') + '@test>'
980
+
981
+ ascii = (0..127).collect {|i| i.chr }
982
+ whitespace = ["\r", "\n", ' ', "\t"]
983
+ # I remove ESC from this list because TMail is ESC sensitive.
984
+ # @ is explicitly tested below
985
+ qtext = ascii - (whitespace + ['"', '\\'] + ["\e"] + ["@"])
986
+ ctext = ascii - (whitespace + ['(', ')', '\\'] + ["\e"] + ["@"])
987
+ dtext = ascii - (whitespace + ['[', ']', '\\'] + ["\e"] + ["@"])
988
+
989
+ (qtext - atext).each do |ch|
990
+ validate_case__address\
991
+ %Q("#{ch}" <"#{ch}"@test>),
992
+ :name => ch,
993
+ :display_name => ch,
994
+ :address => %Q("#{ch}"@test),
995
+ :comments => nil,
996
+ :domain => 'test',
997
+ :local => %Q("#{ch}"),
998
+ :format => %Q("#{ch}" <"#{ch}"@test>)
999
+ end
1000
+
1001
+ ['"', "\\"].each do |ch|
1002
+ validate_case__address\
1003
+ %Q("\\#{ch}" <"\\#{ch}"@test>),
1004
+ :name => ch,
1005
+ :display_name => ch,
1006
+ :address => %Q("\\#{ch}"@test),
1007
+ :comments => nil,
1008
+ :domain => 'test',
1009
+ :local => %Q("\\#{ch}"),
1010
+ :format => %Q("\\#{ch}" <"\\#{ch}"@test>)
1011
+
1012
+ end
1013
+
1014
+ (ctext - boring).each do |ch|
1015
+ validate_case__address\
1016
+ "bob@test (#{ch})",
1017
+ :name => ch,
1018
+ :display_name => nil,
1019
+ :address => 'bob@test',
1020
+ :comments => ["#{ch}"],
1021
+ :domain => 'test',
1022
+ :local => 'bob',
1023
+ :format => "bob@test (#{ch})"
1024
+
1025
+ validate_case__address\
1026
+ "bob@test (\\#{ch})",
1027
+ :name => ch,
1028
+ :display_name => nil,
1029
+ :address => 'bob@test',
1030
+ :comments => ["#{ch}"],
1031
+ :domain => 'test',
1032
+ :local => 'bob',
1033
+ :format => "bob@test (#{ch})"
1034
+ end
1035
+ [')', '(', '\\'].each do |ch|
1036
+ validate_case__address\
1037
+ "bob@test (\\#{ch})",
1038
+ :name => ch,
1039
+ :display_name => nil,
1040
+ :address => 'bob@test',
1041
+ :comments => ["#{ch}"],
1042
+ :domain => 'test',
1043
+ :local => 'bob',
1044
+ :format => "bob@test (\\#{ch})"
1045
+ end
1046
+
1047
+
1048
+ (dtext - boring).each do |ch|
1049
+ validate_case__address\
1050
+ "test@[\\#{ch}] (Sam)",
1051
+ :name => "Sam",
1052
+ :display_name => nil,
1053
+ :address => 'test@[' + ch + ']',
1054
+ :comments => ["Sam"],
1055
+ :domain => '[' + ch + ']',
1056
+ :local => 'test',
1057
+ :format => "<test@[#{ch}]> (Sam)"
1058
+
1059
+ validate_case__address\
1060
+ "Sally <test@[\\#{ch}]>",
1061
+ :name => 'Sally',
1062
+ :display_name => 'Sally',
1063
+ :address => "test@[#{ch}]",
1064
+ :comments => nil,
1065
+ :domain => "[#{ch}]",
1066
+ :local => 'test',
1067
+ :format => "Sally <test@[#{ch}]>"
1068
+ end
1069
+
1070
+ validate_case__address\
1071
+ "test@[" + (dtext - boring).join('') + "]",
1072
+ :name => nil,
1073
+ :display_name => nil,
1074
+ :address => 'test@[' + (dtext - boring).join('') + "]",
1075
+ :comments => nil,
1076
+ :domain => '[' + (dtext - boring).join('') + ']',
1077
+ :local => 'test',
1078
+ :format => '<test@[' + (dtext - boring).join('') + ']>'
1079
+
1080
+ validate_case__address\
1081
+ 'Bob <test@[' + (dtext - boring).join('') + ']>',
1082
+ :name => "Bob",
1083
+ :display_name => "Bob",
1084
+ :address => 'test@[' + (dtext - boring).join('') + "]",
1085
+ :comments => nil,
1086
+ :domain => '[' + (dtext - boring).join('') + ']',
1087
+ :local => 'test',
1088
+ :format => 'Bob <test@[' + (dtext - boring).join('') + ']>'
1089
+
1090
+ end
1091
+
1092
+ def test_dot_in_address()
1093
+
1094
+ validate_case__address\
1095
+ %Q(Minero A. <aamine@loveruby.net>),
1096
+ :name => "Minero A.",
1097
+ :display_name => "Minero A.",
1098
+ :address => %Q(aamine@loveruby.net),
1099
+ :comments => nil,
1100
+ :domain => 'loveruby.net',
1101
+ :local => %Q(aamine),
1102
+ :format => %Q("me@my_place" <aamine@loveruby.net>)
1103
+
1104
+ validate_case__address\
1105
+ %Q(mikel . <mikel@lindsaar.net>),
1106
+ :name => "mikel .",
1107
+ :display_name => "mikel .",
1108
+ :address => %Q(mikel@lindsaar.net),
1109
+ :comments => nil,
1110
+ :domain => 'lindsaar.net',
1111
+ :local => %Q(mikel),
1112
+ :format => %Q("mikel ." <mikel@lindsaar.net>)
1113
+
1114
+ validate_case__address\
1115
+ %Q("mikel ." <mikel@lindsaar.net>),
1116
+ :name => "mikel .",
1117
+ :display_name => "mikel .",
1118
+ :address => %Q(mikel@lindsaar.net),
1119
+ :comments => nil,
1120
+ :domain => 'lindsaar.net',
1121
+ :local => %Q(mikel),
1122
+ :format => %Q("mikel ." <mikel@lindsaar.net>)
1123
+
1124
+ validate_case__address\
1125
+ %Q(mikel "." <mikel@lindsaar.net>),
1126
+ :name => %Q(mikel .),
1127
+ :display_name => %Q(mikel .),
1128
+ :address => %Q(mikel@lindsaar.net),
1129
+ :comments => nil,
1130
+ :domain => 'lindsaar.net',
1131
+ :local => %Q(mikel),
1132
+ :format => %Q(mikel "." <mikel@lindsaar.net>)
1133
+
1134
+ end
1135
+
1136
+ def test_at_char_in_address()
1137
+
1138
+ validate_case__address\
1139
+ %Q(mikel@lindsaar.net <lindsaar@you.net>),
1140
+ :name => "mikel@lindsaar.net",
1141
+ :display_name => "mikel@lindsaar.net",
1142
+ :address => %Q(lindsaar@you.net),
1143
+ :comments => nil,
1144
+ :domain => 'you.net',
1145
+ :local => %Q(lindsaar),
1146
+ :format => %Q("mikel@lindsaar.net" <lindsaar@you.net>)
1147
+
1148
+ validate_case__address\
1149
+ %Q(mikel@lindsaar.net <mikel@lindsaar.net>),
1150
+ :name => %Q(mikel@lindsaar.net),
1151
+ :display_name => %Q(mikel@lindsaar.net),
1152
+ :address => %Q(mikel@lindsaar.net),
1153
+ :comments => nil,
1154
+ :domain => 'lindsaar.net',
1155
+ :local => %Q(mikel),
1156
+ :format => %Q(mikel@lindsaar.net)
1157
+
1158
+ validate_case__address\
1159
+ %Q("mikel@lindsaar.net" <mikel@lindsaar.net>),
1160
+ :name => %Q(mikel@lindsaar.net),
1161
+ :display_name => %Q(mikel@lindsaar.net),
1162
+ :address => %Q(mikel@lindsaar.net),
1163
+ :comments => nil,
1164
+ :domain => 'lindsaar.net',
1165
+ :local => %Q(mikel),
1166
+ :format => %Q(mikel@lindsaar.net)
1167
+
1168
+ validate_case__address\
1169
+ %Q("@" <"@"@lindsaar.net>),
1170
+ :name => "@",
1171
+ :display_name => "@",
1172
+ :address => %Q("@"@lindsaar.net),
1173
+ :comments => nil,
1174
+ :domain => 'lindsaar.net',
1175
+ :local => %Q("@"),
1176
+ :format => %Q("@" <"@"@lindsaar.net>)
1177
+
1178
+ validate_case__address\
1179
+ %Q("@" <"me@me"@lindsaar.net>),
1180
+ :name => "@",
1181
+ :display_name => "@",
1182
+ :address => %Q("me@me"@lindsaar.net),
1183
+ :comments => nil,
1184
+ :domain => 'lindsaar.net',
1185
+ :local => %Q("me@me"),
1186
+ :format => %Q("@" <"me@me"@lindsaar.net>)
1187
+
1188
+ validate_case__address\
1189
+ %Q("mikel" <mikel@lindsaar.net>),
1190
+ :name => "mikel",
1191
+ :display_name => "mikel",
1192
+ :address => %Q(mikel@lindsaar.net),
1193
+ :comments => nil,
1194
+ :domain => 'lindsaar.net',
1195
+ :local => %Q(mikel),
1196
+ :format => %Q("mikel" <mikel@lindsaar.net>)
1197
+
1198
+ validate_case__address\
1199
+ %Q(mikel <mikel@lindsaar.net>),
1200
+ :name => "mikel",
1201
+ :display_name => "mikel",
1202
+ :address => %Q(mikel@lindsaar.net),
1203
+ :comments => nil,
1204
+ :domain => 'lindsaar.net',
1205
+ :local => %Q(mikel),
1206
+ :format => %Q(mikel <mikel@lindsaar.net>)
1207
+ end
1208
+
1209
+ def test_trailing_dot_in_name
1210
+ fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email_trailing_dot")
1211
+ str = 'Sandy M. <noreply@rubyforge.org>'
1212
+ mail = TMail::Mail.parse(fixture)
1213
+ assert_equal '"Sandy M." <noreply@rubyforge.org>', mail['from'].to_s
1214
+ end
1215
+
1216
+ end