japetheape-tmail 1.2.3.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (165) hide show
  1. data/CHANGES +74 -0
  2. data/LICENSE +21 -0
  3. data/NOTES +7 -0
  4. data/README +169 -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 +33 -0
  10. data/ext/tmailscanner/tmail/tmailscanner.c +607 -0
  11. data/lib/tmail.rb +5 -0
  12. data/lib/tmail/Makefile +18 -0
  13. data/lib/tmail/address.rb +392 -0
  14. data/lib/tmail/attachments.rb +46 -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 +591 -0
  20. data/lib/tmail/header.rb +960 -0
  21. data/lib/tmail/index.rb +9 -0
  22. data/lib/tmail/interface.rb +1152 -0
  23. data/lib/tmail/loader.rb +3 -0
  24. data/lib/tmail/mail.rb +591 -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 +125 -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 +337 -0
  39. data/lib/tmail/version.rb +39 -0
  40. data/log/BugTrackingLog.txt +1245 -0
  41. data/log/Changelog.txt +534 -0
  42. data/log/Testlog.txt +2340 -0
  43. data/log/Todo.txt +30 -0
  44. data/meta/MANIFEST +128 -0
  45. data/meta/VERSION +1 -0
  46. data/meta/project.yaml +30 -0
  47. data/meta/unixname +1 -0
  48. data/sample/bench_base64.rb +48 -0
  49. data/sample/data/multipart +23 -0
  50. data/sample/data/normal +29 -0
  51. data/sample/data/sendtest +5 -0
  52. data/sample/data/simple +14 -0
  53. data/sample/data/test +27 -0
  54. data/sample/extract-attachements.rb +33 -0
  55. data/sample/from-check.rb +26 -0
  56. data/sample/multipart.rb +26 -0
  57. data/sample/parse-bench.rb +68 -0
  58. data/sample/parse-test.rb +19 -0
  59. data/sample/sendmail.rb +94 -0
  60. data/setup.rb +1482 -0
  61. data/site/contributing/index.html +183 -0
  62. data/site/css/clean.css +27 -0
  63. data/site/css/layout.css +31 -0
  64. data/site/css/style.css +60 -0
  65. data/site/download/index.html +61 -0
  66. data/site/img/envelope.jpg +0 -0
  67. data/site/img/mailman.gif +0 -0
  68. data/site/img/stamp-sm.jpg +0 -0
  69. data/site/img/stamp.jpg +0 -0
  70. data/site/img/stampborder.jpg +0 -0
  71. data/site/img/tfire.jpg +0 -0
  72. data/site/img/tmail.png +0 -0
  73. data/site/index.html +270 -0
  74. data/site/js/jquery.js +31 -0
  75. data/site/log/Changelog.xsl +33 -0
  76. data/site/log/changelog.xml +1677 -0
  77. data/site/outdated/BUGS +3 -0
  78. data/site/outdated/DEPENDS +1 -0
  79. data/site/outdated/Incompatibilities +89 -0
  80. data/site/outdated/Incompatibilities.ja +102 -0
  81. data/site/outdated/NEWS +9 -0
  82. data/site/outdated/README.ja +73 -0
  83. data/site/outdated/doc.ja/address.html +275 -0
  84. data/site/outdated/doc.ja/basics.html +405 -0
  85. data/site/outdated/doc.ja/config.html +49 -0
  86. data/site/outdated/doc.ja/details.html +146 -0
  87. data/site/outdated/doc.ja/index.html +39 -0
  88. data/site/outdated/doc.ja/mail.html +793 -0
  89. data/site/outdated/doc.ja/mailbox.html +265 -0
  90. data/site/outdated/doc.ja/port.html +95 -0
  91. data/site/outdated/doc.ja/tmail.html +58 -0
  92. data/site/outdated/doc.ja/usage.html +202 -0
  93. data/site/outdated/rdd/address.rrd.m +229 -0
  94. data/site/outdated/rdd/basics.rd.m +275 -0
  95. data/site/outdated/rdd/config.rrd.m +26 -0
  96. data/site/outdated/rdd/details.rd.m +117 -0
  97. data/site/outdated/rdd/index.rhtml.m +54 -0
  98. data/site/outdated/rdd/mail.rrd.m +701 -0
  99. data/site/outdated/rdd/mailbox.rrd.m +228 -0
  100. data/site/outdated/rdd/port.rrd.m +69 -0
  101. data/site/outdated/rdd/tmail.rrd.m +33 -0
  102. data/site/outdated/rdd/usage.rd.m +247 -0
  103. data/site/quickstart/index.html +69 -0
  104. data/site/quickstart/quickstart.html +52 -0
  105. data/site/quickstart/usage.html +193 -0
  106. data/site/reference/address.html +247 -0
  107. data/site/reference/config.html +30 -0
  108. data/site/reference/index.html +101 -0
  109. data/site/reference/mail.html +726 -0
  110. data/site/reference/mailbox.html +245 -0
  111. data/site/reference/port.html +75 -0
  112. data/site/reference/tmail.html +35 -0
  113. data/test/extctrl.rb +6 -0
  114. data/test/fixtures/mailbox +414 -0
  115. data/test/fixtures/mailbox_without_any_from_or_sender +10 -0
  116. data/test/fixtures/mailbox_without_from +11 -0
  117. data/test/fixtures/mailbox_without_return_path +12 -0
  118. data/test/fixtures/raw_attack_email_with_zero_length_whitespace +29 -0
  119. data/test/fixtures/raw_base64_decoded_string +0 -0
  120. data/test/fixtures/raw_base64_email +83 -0
  121. data/test/fixtures/raw_base64_encoded_string +1 -0
  122. data/test/fixtures/raw_email +14 -0
  123. data/test/fixtures/raw_email10 +20 -0
  124. data/test/fixtures/raw_email11 +34 -0
  125. data/test/fixtures/raw_email12 +32 -0
  126. data/test/fixtures/raw_email13 +29 -0
  127. data/test/fixtures/raw_email2 +114 -0
  128. data/test/fixtures/raw_email3 +70 -0
  129. data/test/fixtures/raw_email4 +59 -0
  130. data/test/fixtures/raw_email5 +19 -0
  131. data/test/fixtures/raw_email6 +20 -0
  132. data/test/fixtures/raw_email7 +66 -0
  133. data/test/fixtures/raw_email8 +47 -0
  134. data/test/fixtures/raw_email9 +28 -0
  135. data/test/fixtures/raw_email_multiple_from +30 -0
  136. data/test/fixtures/raw_email_quoted_with_0d0a +14 -0
  137. data/test/fixtures/raw_email_reply +32 -0
  138. data/test/fixtures/raw_email_simple +11 -0
  139. data/test/fixtures/raw_email_with_bad_date +48 -0
  140. data/test/fixtures/raw_email_with_double_carriage_return +179 -0
  141. data/test/fixtures/raw_email_with_illegal_boundary +58 -0
  142. data/test/fixtures/raw_email_with_mimepart_without_content_type +94 -0
  143. data/test/fixtures/raw_email_with_multipart_mixed_quoted_boundary +50 -0
  144. data/test/fixtures/raw_email_with_nested_attachment +100 -0
  145. data/test/fixtures/raw_email_with_partially_quoted_subject +14 -0
  146. data/test/fixtures/raw_email_with_quoted_illegal_boundary +58 -0
  147. data/test/kcode.rb +14 -0
  148. data/test/temp_test_one.rb +46 -0
  149. data/test/test_address.rb +1219 -0
  150. data/test/test_attachments.rb +76 -0
  151. data/test/test_base64.rb +64 -0
  152. data/test/test_encode.rb +85 -0
  153. data/test/test_header.rb +1002 -0
  154. data/test/test_helper.rb +9 -0
  155. data/test/test_mail.rb +768 -0
  156. data/test/test_mbox.rb +184 -0
  157. data/test/test_port.rb +436 -0
  158. data/test/test_quote.rb +107 -0
  159. data/test/test_scanner.rb +209 -0
  160. data/test/test_utils.rb +36 -0
  161. data/work/script/make +26 -0
  162. data/work/script/rdoc +39 -0
  163. data/work/script/setup +1616 -0
  164. data/work/script/test +30 -0
  165. metadata +298 -0
@@ -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,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
+
data/test/kcode.rb ADDED
@@ -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,1219 @@
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
+ def test_parse__mime
169
+ # "\306\374\313\334\270\354"
170
+ # "\223\372\226{\214\352"
171
+ # "\e$BF|K\\8l\e(B"
172
+ # GyRCRnxLXDhsGyhC
173
+ force = if "".respond_to? :force_encoding
174
+ proc{|x,e| x.force_encoding e }
175
+ else
176
+ proc{|x,e| x }
177
+ end
178
+
179
+ TMail.KCODE = 'NONE'
180
+ validate_case__address\
181
+ '=?iso-2022-jp?B?GyRCRnxLXDhsGyhC?= <aamine@loveruby.net>',
182
+ :display_name => force["\e$BF|K\\8l\e(B", "ISO-2022-JP"],
183
+ :address => 'aamine@loveruby.net',
184
+ :local => 'aamine',
185
+ :domain => 'loveruby.net',
186
+ :format => '=?iso-2022-jp?B?GyRCRnxLXDhsGyhC?= <aamine@loveruby.net>'
187
+
188
+ validate_case__address\
189
+ '=?iso-2022-jp?Q?=1b=24=42=46=7c=4b=5c=38=6c=1b=28=42?= <aamine@loveruby.net>',
190
+ :display_name => force["\e$BF|K\\8l\e(B", "iso-2022-jp"],
191
+ :address => 'aamine@loveruby.net',
192
+ :local => 'aamine',
193
+ :domain => 'loveruby.net',
194
+ :format => '=?iso-2022-jp?B?GyRCRnxLXDhsGyhC?= <aamine@loveruby.net>'
195
+
196
+ TMail.KCODE = 'EUC'
197
+ expected = "\306\374\313\334\270\354"
198
+ expected.force_encoding('EUC-JP') if expected.respond_to? :force_encoding
199
+ validate_case__address\
200
+ '=?iso-2022-jp?B?GyRCRnxLXDhsGyhC?= <aamine@loveruby.net>',
201
+ :display_name => expected,
202
+ :address => 'aamine@loveruby.net',
203
+ :local => 'aamine',
204
+ :domain => 'loveruby.net',
205
+ :format => '=?iso-2022-jp?B?GyRCRnxLXDhsGyhC?= <aamine@loveruby.net>'
206
+
207
+ validate_case__address\
208
+ '=?iso-2022-jp?Q?=1b=24=42=46=7c=4b=5c=38=6c=1b=28=42?= <aamine@loveruby.net>',
209
+ :display_name => expected,
210
+ :address => 'aamine@loveruby.net',
211
+ :local => 'aamine',
212
+ :domain => 'loveruby.net',
213
+ :format => '=?iso-2022-jp?B?GyRCRnxLXDhsGyhC?= <aamine@loveruby.net>'
214
+
215
+ TMail.KCODE = 'SJIS'
216
+ expected = "\223\372\226{\214\352"
217
+ expected.force_encoding('SJIS') if expected.respond_to? :force_encoding
218
+ validate_case__address\
219
+ '=?iso-2022-jp?B?GyRCRnxLXDhsGyhC?= <aamine@loveruby.net>',
220
+ :display_name => expected,
221
+ :address => 'aamine@loveruby.net',
222
+ :local => 'aamine',
223
+ :domain => 'loveruby.net',
224
+ :format => '=?iso-2022-jp?B?GyRCRnxLXDhsGyhC?= <aamine@loveruby.net>'
225
+
226
+ validate_case__address\
227
+ '=?iso-2022-jp?Q?=1b=24=42=46=7c=4b=5c=38=6c=1b=28=42?= <aamine@loveruby.net>',
228
+ :display_name => expected,
229
+ :address => 'aamine@loveruby.net',
230
+ :local => 'aamine',
231
+ :domain => 'loveruby.net',
232
+ :format => '=?iso-2022-jp?B?GyRCRnxLXDhsGyhC?= <aamine@loveruby.net>'
233
+ end
234
+
235
+ def test_parse__rawjp
236
+ begin
237
+ TMail.KCODE = 'EUC'
238
+ _test_parse__euc
239
+ _test_parse__jis
240
+ ensure
241
+ TMail.KCODE = 'NONE'
242
+ end
243
+ end
244
+
245
+ def _test_parse__euc
246
+ # raw EUC-JP
247
+ validate_case__address\
248
+ "\244\242\244\252\244\255 \244\337\244\315\244\355\244\246 <aamine@loveruby.net>",
249
+ :display_name => "\244\242\244\252\244\255 \244\337\244\315\244\355\244\246",
250
+ :address => 'aamine@loveruby.net',
251
+ :local => 'aamine',
252
+ :domain => 'loveruby.net',
253
+ :format => "\244\242\244\252\244\255 \244\337\244\315\244\355\244\246 <aamine@loveruby.net>"
254
+ end
255
+
256
+ def _test_parse__jis
257
+ # raw iso-2022-jp string in comment
258
+ validate_case__address\
259
+ "Minero Aoki (\e$B@DLZJvO:\e(B) <aamine@loveruby.net>",
260
+ :display_name => "Minero Aoki (\e$B@DLZJvO:\e(B)",
261
+ :address => 'aamine@loveruby.net',
262
+ :local => 'aamine',
263
+ :domain => 'loveruby.net',
264
+ :format => 'Minero Aoki <aamine@loveruby.net>'
265
+
266
+ validate_case__address\
267
+ "Minero Aoki <aamine@loveruby.net> (\e$B@DLZJvO:\e(B )",
268
+ :display_name => 'Minero Aoki',
269
+ :address => 'aamine@loveruby.net',
270
+ :local => 'aamine',
271
+ :domain => 'loveruby.net',
272
+ :format => 'Minero Aoki <aamine@loveruby.net>'
273
+
274
+ # raw iso-2022-jp string in quoted-word (it includes backslash)
275
+ validate_case__address\
276
+ %Q["\e$BF|K\\8l\e(B" <aamine@loveruby.net>],
277
+ :display_name => "\e$BF|K\\8l\e(B",
278
+ :address => 'aamine@loveruby.net',
279
+ :local => 'aamine',
280
+ :domain => 'loveruby.net',
281
+ :format => 'Minero Aoki <aamine@loveruby.net>'
282
+ end
283
+
284
+ def OFF_test_parse__group
285
+ validate_case__group 'Softica: Minero Aoki <aamine@loveruby.net>;',
286
+ 'Softica',
287
+ { :display_name => 'Minero Aoki',
288
+ :address => 'aamine@loveruby.net',
289
+ :local => 'aamine',
290
+ :domain => 'loveruby.net',
291
+ :format => 'Minero Aoki <aamine@loveruby.net>' }
292
+ end
293
+
294
+
295
+ #
296
+ # The following test cases are quoted from RubyMail 0.2
297
+ # (written by Matt Armstrong), with some modifications.
298
+ # The copyright notice of the original file is:
299
+ #
300
+ # Copyright (c) 2001 Matt Armstrong. All rights reserved.
301
+ #
302
+ # Permission is granted for use, copying, modification,
303
+ # distribution, and distribution of modified versions of this work
304
+ # as long as the above copyright notice is included.
305
+ #
306
+
307
+ def test_parse__rfc2822
308
+
309
+ validate_case__address\
310
+ '"Joe Q. Public" <john.q.public@example.com>',
311
+ :name => 'Joe Q. Public',
312
+ :display_name => 'Joe Q. Public',
313
+ :address => 'john.q.public@example.com',
314
+ :comments => nil,
315
+ :domain => 'example.com',
316
+ :local => 'john.q.public',
317
+ :format => '"Joe Q. Public" <john.q.public@example.com>'
318
+
319
+ validate_case__address\
320
+ 'Who? <one@y.test>',
321
+ :name => 'Who?',
322
+ :display_name => 'Who?',
323
+ :address => 'one@y.test',
324
+ :comments => nil,
325
+ :domain => 'y.test',
326
+ :local => 'one',
327
+ :format => 'Who? <one@y.test>'
328
+
329
+ validate_case__address\
330
+ '"Giant; \"Big\" Box" <sysservices@example.net>',
331
+ :name => 'Giant; "Big" Box',
332
+ :display_name => 'Giant; "Big" Box',
333
+ :address => 'sysservices@example.net',
334
+ :comments => nil,
335
+ :domain => 'example.net',
336
+ :local => 'sysservices',
337
+ :format => '"Giant; \"Big\" Box" <sysservices@example.net>'
338
+
339
+ validate_case__address\
340
+ '"Mary Smith: Personal Account" <smith@home.example> ',
341
+ :name => 'Mary Smith: Personal Account',
342
+ :display_name => 'Mary Smith: Personal Account',
343
+ :address => 'smith@home.example',
344
+ :comments => nil,
345
+ :domain => 'home.example',
346
+ :local => 'smith',
347
+ :format => '"Mary Smith: Personal Account" <smith@home.example>'
348
+
349
+ validate_case__address\
350
+ 'Pete(A wonderful \) chap) <pete(his account)@silly.test(his host)>',
351
+ :name => 'Pete',
352
+ :display_name => 'Pete',
353
+ :address => 'pete@silly.test',
354
+ :comments => ['A wonderful ) chap', 'his account', 'his host'],
355
+ :domain => 'silly.test',
356
+ :local => 'pete',
357
+ #:format => 'Pete <pete@silly.test> (A wonderful \) chap) (his account) (his host)'
358
+ :format => 'Pete <pete@silly.test>'
359
+
360
+ validate_case__address\
361
+ "Chris Jones <c@(Chris's host.)public.example>",
362
+ :name => 'Chris Jones',
363
+ :display_name => 'Chris Jones',
364
+ :address => 'c@public.example',
365
+ :comments => ['Chris\'s host.'],
366
+ :domain => 'public.example',
367
+ :local => 'c',
368
+ #:format => 'Chris Jones <c@public.example> (Chris\'s host.)'
369
+ :format => 'Chris Jones <c@public.example>'
370
+
371
+ validate_case__address\
372
+ 'Joe Q. Public <john.q.public@example.com>',
373
+ :name => 'Joe Q.Public',
374
+ :display_name => 'Joe Q.Public',
375
+ :address => 'john.q.public@example.com',
376
+ :comments => nil,
377
+ :domain => 'example.com',
378
+ :local => 'john.q.public',
379
+ :format => '"Joe Q.Public" <john.q.public@example.com>'
380
+
381
+ validate_case__address\
382
+ 'Mary Smith <@machine.tld:mary@example.net>',
383
+ :name => 'Mary Smith',
384
+ :display_name => 'Mary Smith',
385
+ :address => 'mary@example.net',
386
+ :comments => nil,
387
+ :domain => 'example.net',
388
+ :local => 'mary',
389
+ #:format => 'Mary Smith <mary@example.net>'
390
+ :format => 'Mary Smith <@machine.tld:mary@example.net>'
391
+
392
+ validate_case__address\
393
+ ' jdoe@test . example',
394
+ :name => nil,
395
+ :display_name => nil,
396
+ :address => 'jdoe@test.example',
397
+ :comments => nil,
398
+ :domain => 'test.example',
399
+ :local => 'jdoe',
400
+ :format => 'jdoe@test.example'
401
+
402
+ validate_case__address\
403
+ 'John Doe <jdoe@machine(comment). example>',
404
+ :name => 'John Doe',
405
+ :display_name => 'John Doe',
406
+ :address => 'jdoe@machine.example',
407
+ :comments => ['comment'],
408
+ :domain => 'machine.example',
409
+ :local => 'jdoe',
410
+ #:format => 'John Doe <jdoe@machine.example> (comment)'
411
+ :format => 'John Doe <jdoe@machine.example>'
412
+
413
+ validate_case__address\
414
+ "Mary Smith\n\r \n <mary@example.net>",
415
+ :name => 'Mary Smith',
416
+ :display_name => 'Mary Smith',
417
+ :address => 'mary@example.net',
418
+ :comments => nil,
419
+ :domain => 'example.net',
420
+ :local => 'mary',
421
+ :format => 'Mary Smith <mary@example.net>'
422
+ end
423
+
424
+
425
+ def test_parse__rfc822
426
+
427
+ validate_case__address\
428
+ '":sysmail"@ Some-Group. Some-Org',
429
+ :name => nil,
430
+ :display_name => nil,
431
+ #:address => ':sysmail@Some-Group.Some-Org',
432
+ :address => '":sysmail"@Some-Group.Some-Org',
433
+ :comments => nil,
434
+ :domain => 'Some-Group.Some-Org',
435
+ #:local => ':sysmail',
436
+ :local => '":sysmail"',
437
+ :format => '":sysmail"@Some-Group.Some-Org'
438
+
439
+ validate_case__address\
440
+ 'Muhammed.(I am the greatest) Ali @(the)Vegas.WBA',
441
+ :name => 'the',
442
+ :display_name => nil,
443
+ :address => 'Muhammed.Ali@Vegas.WBA',
444
+ :comments => ['I am the greatest', 'the'],
445
+ :domain => 'Vegas.WBA',
446
+ :local => 'Muhammed.Ali',
447
+ #:format => 'Muhammed.Ali@Vegas.WBA (I am the greatest) (the)'
448
+ :format => 'Muhammed.Ali@Vegas.WBA'
449
+
450
+
451
+ validate_case__group\
452
+ 'A Group:Chris Jones <c@a.test>,joe@where.test,John <jdoe@one.test>;',
453
+ 'A Group',
454
+ [ { :name => 'Chris Jones',
455
+ :display_name => 'Chris Jones',
456
+ :address => 'c@a.test',
457
+ :comments => nil,
458
+ :domain => 'a.test',
459
+ :local => 'c',
460
+ :format => 'Chris Jones <c@a.test>' },
461
+ { :name => nil,
462
+ :display_name => nil,
463
+ :address => 'joe@where.test',
464
+ :comments => nil,
465
+ :domain => 'where.test',
466
+ :local => 'joe',
467
+ :format => 'joe@where.test' },
468
+ { :name => 'John',
469
+ :display_name => 'John',
470
+ :address => 'jdoe@one.test',
471
+ :comments => nil,
472
+ :domain => 'one.test',
473
+ :local => 'jdoe',
474
+ :format => 'John <jdoe@one.test>' }
475
+ ]
476
+
477
+ validate_case__group\
478
+ 'Undisclosed recipients:;',
479
+ 'Undisclosed recipients',
480
+ [ ]
481
+
482
+ validate_case__group\
483
+ 'undisclosed recipients: ;',
484
+ 'undisclosed recipients',
485
+ []
486
+
487
+ validate_case__group\
488
+ "A Group(Some people)\r\n :Chris Jones <c@(Chris's host.)public.example>,\r\n joe@example.org",
489
+ 'A Group',
490
+ [
491
+ { :name => 'Chris Jones',
492
+ :display_name => 'Chris Jones',
493
+ :address => 'c@public.example',
494
+ :comments => ['Chris\'s host.'],
495
+ :domain => 'public.example',
496
+ :local => 'c',
497
+ :format => 'Chris Jones <c@public.example> (Chris\'s host.)' },
498
+ { :name => nil,
499
+ :display_name => nil,
500
+ :address => 'joe@example.org',
501
+ :comments => nil,
502
+ :domain => 'example.org',
503
+ :local => 'joe',
504
+ :format => 'joe@example.org' }
505
+ ]
506
+
507
+ validate_case__group\
508
+ '(Empty list)(start)Undisclosed recipients :(nobody(that I know)) ;',
509
+ 'Undisclosed recipients',
510
+ []
511
+ end
512
+
513
+
514
+ def test_parse__mailtools
515
+ #
516
+ # The following are from the Perl MailTools module version 1.40
517
+ #
518
+ validate_case__address\
519
+ '"Joe & J. Harvey" <ddd @Org>',
520
+ :name => 'Joe & J. Harvey',
521
+ :display_name => 'Joe & J. Harvey',
522
+ :address => 'ddd@Org',
523
+ :comments => nil,
524
+ :domain => 'Org',
525
+ :local => 'ddd',
526
+ :format => '"Joe & J. Harvey" <ddd@Org>'
527
+
528
+ validate_case__address\
529
+ '"spickett@tiac.net" <Sean.Pickett@zork.tiac.net>',
530
+ :name => 'spickett@tiac.net',
531
+ :display_name => 'spickett@tiac.net',
532
+ :address => 'Sean.Pickett@zork.tiac.net',
533
+ :comments => nil,
534
+ :domain => 'zork.tiac.net',
535
+ :local => 'Sean.Pickett',
536
+ :format => '"spickett@tiac.net" <Sean.Pickett@zork.tiac.net>'
537
+
538
+ validate_case__address\
539
+ 'rls@intgp8.ih.att.com (-Schieve,R.L.)',
540
+ :name => '-Schieve,R.L.',
541
+ :display_name => nil,
542
+ :address => 'rls@intgp8.ih.att.com',
543
+ :comments => ['-Schieve,R.L.'],
544
+ :domain => 'intgp8.ih.att.com',
545
+ :local => 'rls',
546
+ #:format => 'rls@intgp8.ih.att.com (-Schieve,R.L.)'
547
+ :format => 'rls@intgp8.ih.att.com'
548
+
549
+ validate_case__address\
550
+ 'jrh%cup.portal.com@portal.unix.portal.com',
551
+ :name => nil,
552
+ :display_name => nil,
553
+ :address => 'jrh%cup.portal.com@portal.unix.portal.com',
554
+ :comments => nil,
555
+ :domain => 'portal.unix.portal.com',
556
+ :local => 'jrh%cup.portal.com',
557
+ :format => 'jrh%cup.portal.com@portal.unix.portal.com'
558
+
559
+ validate_case__address\
560
+ 'astrachan@austlcm.sps.mot.com (\'paul astrachan/xvt3\')',
561
+ :name => '\'paul astrachan/xvt3\'',
562
+ :display_name => nil,
563
+ :address => 'astrachan@austlcm.sps.mot.com',
564
+ :comments => ["'paul astrachan/xvt3'"],
565
+ :domain => 'austlcm.sps.mot.com',
566
+ :local => 'astrachan',
567
+ #:format => "astrachan@austlcm.sps.mot.com ('paul astrachan/xvt3')"
568
+ :format => 'astrachan@austlcm.sps.mot.com'
569
+
570
+ validate_case__address\
571
+ 'TWINE57%SDELVB.decnet@SNYBUF.CS.SNYBUF.EDU (JAMES R. TWINE - THE NERD)',
572
+ :name => 'JAMES R. TWINE - THE NERD',
573
+ :display_name => nil,
574
+ :address => 'TWINE57%SDELVB.decnet@SNYBUF.CS.SNYBUF.EDU',
575
+ :comments => ['JAMES R. TWINE - THE NERD'],
576
+ :domain => 'SNYBUF.CS.SNYBUF.EDU',
577
+ :local => 'TWINE57%SDELVB.decnet',
578
+ :format => 'TWINE57%SDELVB.decnet@SNYBUF.CS.SNYBUF.EDU'
579
+ #'TWINE57%SDELVB.decnet@SNYBUF.CS.SNYBUF.EDU (JAMES R. TWINE - THE NERD)'
580
+
581
+ validate_case__address\
582
+ 'David Apfelbaum <da0g+@andrew.cmu.edu>',
583
+ :name => 'David Apfelbaum',
584
+ :display_name => 'David Apfelbaum',
585
+ :address => 'da0g+@andrew.cmu.edu',
586
+ :comments => nil,
587
+ :domain => 'andrew.cmu.edu',
588
+ :local => 'da0g+',
589
+ :format => 'David Apfelbaum <da0g+@andrew.cmu.edu>'
590
+
591
+ validate_case__address\
592
+ '"JAMES R. TWINE - THE NERD" <TWINE57%SDELVB%SNYDELVA.bitnet@CUNYVM.CUNY.EDU>',
593
+ :name => 'JAMES R. TWINE - THE NERD',
594
+ :display_name => 'JAMES R. TWINE - THE NERD',
595
+ :address => 'TWINE57%SDELVB%SNYDELVA.bitnet@CUNYVM.CUNY.EDU',
596
+ :comments => nil,
597
+ :domain => 'CUNYVM.CUNY.EDU',
598
+ :local => 'TWINE57%SDELVB%SNYDELVA.bitnet',
599
+ :format =>
600
+ '"JAMES R. TWINE - THE NERD" <TWINE57%SDELVB%SNYDELVA.bitnet@CUNYVM.CUNY.EDU>'
601
+
602
+ validate_case__address\
603
+ '/G=Owen/S=Smith/O=SJ-Research/ADMD=INTERSPAN/C=GB/@mhs-relay.ac.uk',
604
+ :name => nil,
605
+ :display_name => nil,
606
+ :address => '/G=Owen/S=Smith/O=SJ-Research/ADMD=INTERSPAN/C=GB/@mhs-relay.ac.uk',
607
+ :comments => nil,
608
+ :domain => 'mhs-relay.ac.uk',
609
+ :local => '/G=Owen/S=Smith/O=SJ-Research/ADMD=INTERSPAN/C=GB/',
610
+ :format => '/G=Owen/S=Smith/O=SJ-Research/ADMD=INTERSPAN/C=GB/@mhs-relay.ac.uk'
611
+
612
+ validate_case__address\
613
+ '"Stephen Burke, Liverpool" <BURKE@vxdsya.desy.de>',
614
+ :name => 'Stephen Burke, Liverpool',
615
+ :display_name => 'Stephen Burke, Liverpool',
616
+ :address => 'BURKE@vxdsya.desy.de',
617
+ :comments => nil,
618
+ :domain => 'vxdsya.desy.de',
619
+ :local => 'BURKE',
620
+ :format => '"Stephen Burke, Liverpool" <BURKE@vxdsya.desy.de>'
621
+
622
+ validate_case__address\
623
+ 'The Newcastle Info-Server <info-admin@newcastle.ac.uk>',
624
+ :name => 'The Newcastle Info-Server',
625
+ :display_name => 'The Newcastle Info-Server',
626
+ :address => 'info-admin@newcastle.ac.uk',
627
+ :comments => nil,
628
+ :domain => 'newcastle.ac.uk',
629
+ :local => 'info-admin',
630
+ :format => 'The Newcastle Info-Server <info-admin@newcastle.ac.uk>'
631
+
632
+ validate_case__address\
633
+ 'Suba.Peddada@eng.sun.com (Suba Peddada [CONTRACTOR])',
634
+ :name => 'Suba Peddada [CONTRACTOR]',
635
+ :display_name => nil,
636
+ :address => 'Suba.Peddada@eng.sun.com',
637
+ :comments => ['Suba Peddada [CONTRACTOR]'],
638
+ :domain => 'eng.sun.com',
639
+ :local => 'Suba.Peddada',
640
+ #:format => 'Suba.Peddada@eng.sun.com (Suba Peddada [CONTRACTOR])'
641
+ :format => 'Suba.Peddada@eng.sun.com'
642
+
643
+ validate_case__address\
644
+ 'Paul Manser (0032 memo) <a906187@tiuk.ti.com>',
645
+ :name => 'Paul Manser',
646
+ :display_name => 'Paul Manser',
647
+ :address => 'a906187@tiuk.ti.com',
648
+ :comments => ['0032 memo'],
649
+ :domain => 'tiuk.ti.com',
650
+ :local => 'a906187',
651
+ #:format => 'Paul Manser <a906187@tiuk.ti.com> (0032 memo)'
652
+ :format => 'Paul Manser <a906187@tiuk.ti.com>'
653
+
654
+ validate_case__address\
655
+ '"gregg (g.) woodcock" <woodcock@bnr.ca>',
656
+ :name => 'gregg (g.) woodcock',
657
+ :display_name => 'gregg (g.) woodcock',
658
+ :address => 'woodcock@bnr.ca',
659
+ :comments => nil,
660
+ :domain => 'bnr.ca',
661
+ :local => 'woodcock',
662
+ :format => '"gregg (g.) woodcock" <woodcock@bnr.ca>'
663
+
664
+ validate_case__address\
665
+ 'Graham.Barr@tiuk.ti.com',
666
+ :name => nil,
667
+ :display_name => nil,
668
+ :address => 'Graham.Barr@tiuk.ti.com',
669
+ :comments => nil,
670
+ :domain => 'tiuk.ti.com',
671
+ :local => 'Graham.Barr',
672
+ :format => 'Graham.Barr@tiuk.ti.com'
673
+
674
+ validate_case__address\
675
+ 'a909937 (Graham Barr (0004 bodg))',
676
+ :name => 'Graham Barr (0004 bodg)',
677
+ :display_name => nil,
678
+ :address => 'a909937',
679
+ :comments => ['Graham Barr (0004 bodg)'],
680
+ :domain => nil,
681
+ :local => 'a909937',
682
+ #:format => 'a909937 (Graham Barr \(0004 bodg\))'
683
+ :format => 'a909937'
684
+
685
+ validate_case__address\
686
+ "david d `zoo' zuhn <zoo@aggregate.com>",
687
+ :name => "david d `zoo' zuhn",
688
+ :display_name => "david d `zoo' zuhn",
689
+ :address => 'zoo@aggregate.com',
690
+ :comments => nil,
691
+ :domain => 'aggregate.com',
692
+ :local => 'zoo',
693
+ :format => "david d `zoo' zuhn <zoo@aggregate.com>"
694
+
695
+ validate_case__address\
696
+ '(foo@bar.com (foobar), ned@foo.com (nedfoo) ) <kevin@goess.org>',
697
+ :name => 'foo@bar.com (foobar), ned@foo.com (nedfoo) ',
698
+ :display_name => "(foo@bar.com (foobar), ned@foo.com (nedfoo) )",
699
+ :address => 'kevin@goess.org',
700
+ :comments => ['foo@bar.com (foobar), ned@foo.com (nedfoo) '],
701
+ :domain => 'goess.org',
702
+ :local => 'kevin',
703
+ :format => 'kevin@goess.org'
704
+ #'kevin@goess.org (foo@bar.com \(foobar\), ned@foo.com \(nedfoo\) )'
705
+ end
706
+
707
+
708
+ def test_parse__pythonbuglist
709
+ #
710
+ # From Python address parsing bug list.
711
+ # This is valid according to RFC2822.
712
+ #
713
+
714
+ validate_case__address\
715
+ 'Amazon.com <delivers-news2@amazon.com>',
716
+ :name => 'Amazon.com',
717
+ :display_name => 'Amazon.com',
718
+ :address => 'delivers-news2@amazon.com',
719
+ :comments => nil,
720
+ :domain => 'amazon.com',
721
+ :local => 'delivers-news2',
722
+ :format => '"Amazon.com" <delivers-news2@amazon.com>'
723
+
724
+ validate_case__address\
725
+ "\r\n Amazon \r . \n com \t < delivers-news2@amazon.com > \n ",
726
+ :name => 'Amazon.com',
727
+ :display_name => 'Amazon.com',
728
+ :address => 'delivers-news2@amazon.com',
729
+ :comments => nil,
730
+ :domain => 'amazon.com',
731
+ :local => 'delivers-news2',
732
+ :format => '"Amazon.com" <delivers-news2@amazon.com>'
733
+
734
+ # From postfix-users@postfix.org
735
+ # Date: Tue, 13 Nov 2001 10:58:23 -0800
736
+ # Subject: Apparent bug in strict_rfc821_envelopes (Snapshot-20010714)
737
+ validate_case__address\
738
+ '"mailto:rfc"@monkeys.test',
739
+ :name => nil,
740
+ :display_name => nil,
741
+ #:address => 'mailto:rfc@monkeys.test',
742
+ :address => '"mailto:rfc"@monkeys.test',
743
+ :comments => nil,
744
+ :domain => 'monkeys.test',
745
+ #:local => 'mailto:rfc',
746
+ :local => '"mailto:rfc"',
747
+ :format => '"mailto:rfc"@monkeys.test'
748
+
749
+ # An unquoted mailto:rfc will end up having the mailto: portion
750
+ # discarded as a group name.
751
+ validate_case__group\
752
+ 'mailto:rfc@monkeys.test',
753
+ 'mailto',
754
+ [
755
+ { :name => nil,
756
+ :display_name => nil,
757
+ :address => 'rfc@monkeys.test',
758
+ :comments => nil,
759
+ :domain => 'monkeys.test',
760
+ :local => 'rfc',
761
+ :format => 'rfc@monkeys.test' }
762
+ ]
763
+
764
+ # From gnu.emacs.help
765
+ # Date: 24 Nov 2001 15:37:23 -0500
766
+ validate_case__address\
767
+ '"Stefan Monnier <foo@acm.com>" <monnier+gnu.emacs.help/news/@flint.cs.yale.edu>',
768
+ :name => 'Stefan Monnier <foo@acm.com>',
769
+ :display_name => 'Stefan Monnier <foo@acm.com>',
770
+ :address => 'monnier+gnu.emacs.help/news/@flint.cs.yale.edu',
771
+ :comments => nil,
772
+ :domain => 'flint.cs.yale.edu',
773
+ :local => 'monnier+gnu.emacs.help/news/',
774
+ :format => '"Stefan Monnier <foo@acm.com>" <monnier+gnu.emacs.help/news/@flint.cs.yale.edu>'
775
+
776
+ validate_case__address\
777
+ '"foo:" . bar@somewhere.test',
778
+ :name => nil,
779
+ :display_name => nil,
780
+ #:address => 'foo:.bar@somewhere.test',
781
+ :address => '"foo:".bar@somewhere.test',
782
+ :comments => nil,
783
+ :domain => 'somewhere.test',
784
+ #:local => 'foo:.bar',
785
+ :local => '"foo:".bar',
786
+ #:format => '"foo:.bar"@somewhere.test'
787
+ :format => '"foo:".bar@somewhere.test'
788
+
789
+ validate_case__address\
790
+ 'Some Dude <"foo:" . bar@somewhere.test>',
791
+ :name => 'Some Dude',
792
+ :display_name => 'Some Dude',
793
+ #:address => 'foo:.bar@somewhere.test',
794
+ :address => '"foo:".bar@somewhere.test',
795
+ :comments => nil,
796
+ :domain => 'somewhere.test',
797
+ #:local => 'foo:.bar',
798
+ :local => '"foo:".bar',
799
+ #:format => 'Some Dude <"foo:.bar"@somewhere.test>'
800
+ :format => 'Some Dude <"foo:".bar@somewhere.test>'
801
+
802
+ validate_case__address\
803
+ '"q\uo\ted"@example.com',
804
+ :name => nil,
805
+ :display_name => nil,
806
+ :address => 'quoted@example.com',
807
+ :comments => nil,
808
+ :domain => 'example.com',
809
+ :local => 'quoted',
810
+ :format => 'quoted@example.com'
811
+
812
+ validate_case__address\
813
+ 'Luke Skywalker <"use"."the.force"@space.test>',
814
+ :name => 'Luke Skywalker',
815
+ :display_name => 'Luke Skywalker',
816
+ #:address => 'use.the.force@space.test',
817
+ :address => 'use."the.force"@space.test',
818
+ :comments => nil,
819
+ :domain => 'space.test',
820
+ #:local => 'use.the.force',
821
+ :local => 'use."the.force"',
822
+ #:format => 'Luke Skywalker <use.the.force@space.test>'
823
+ :format => 'Luke Skywalker <use."the.force"@space.test>'
824
+
825
+ validate_case__address\
826
+ 'Erik =?ISO-8859-1?Q?B=E5gfors?= <erik@example.net>',
827
+ :name => 'Erik =?ISO-8859-1?Q?B=E5gfors?=',
828
+ :display_name => 'Erik =?ISO-8859-1?Q?B=E5gfors?=',
829
+ :address => 'erik@example.net',
830
+ :comments => nil,
831
+ :domain => 'example.net',
832
+ :local => 'erik',
833
+ :format => 'Erik =?ISO-8859-1?Q?B=E5gfors?= <erik@example.net>'
834
+ end
835
+
836
+ def test_parse__outofspec
837
+
838
+ =begin
839
+ validate_case__address\
840
+ 'bodg fred@tiuk.ti.com',
841
+ :name => nil,
842
+ :display_name => nil,
843
+ :address => 'bodg fred@tiuk.ti.com',
844
+ :comments => nil,
845
+ :domain => 'tiuk.ti.com',
846
+ :local => 'bodg fred',
847
+ :format => '"bodg fred"@tiuk.ti.com'
848
+
849
+ validate_case__address\
850
+ '<Investor Alert@example.com>',
851
+ :name => nil,
852
+ :display_name => nil,
853
+ :address => 'Investor Alert@example.com',
854
+ :comments => nil,
855
+ :domain => 'example.com',
856
+ :local => 'Investor Alert',
857
+ :format => '"Investor Alert"@example.com'
858
+ =end
859
+
860
+ validate_case__address\
861
+ '"" <bob@example.com>',
862
+ :name => nil,
863
+ :display_name => nil,
864
+ :address => 'bob@example.com',
865
+ :comments => nil,
866
+ :domain => 'example.com',
867
+ :local => 'bob',
868
+ :format => 'bob@example.com'
869
+
870
+ validate_case__address '"" <""@example.com>',
871
+ :name => nil,
872
+ :display_name => nil,
873
+ :address => '""@example.com',
874
+ :comments => nil,
875
+ :domain => 'example.com',
876
+ :local => '""',
877
+ :format => '""@example.com'
878
+
879
+ assert_raise(TMail::SyntaxError) {
880
+ TMail::Address.parse '@example.com'
881
+ }
882
+
883
+ validate_case__address\
884
+ 'bob',
885
+ :name => nil,
886
+ :display_name => nil,
887
+ :address => 'bob',
888
+ :comments => nil,
889
+ :domain => nil,
890
+ :local => 'bob',
891
+ :format => 'bob'
892
+
893
+ assert_raises(TMail::SyntaxError) {
894
+ TMail::Address.parse 'Undisclosed <>'
895
+ }
896
+ assert_raises(TMail::SyntaxError) {
897
+ TMail::Address.parse '"Mensagem Automatica do Terra" <>'
898
+ }
899
+
900
+ # These test cases are meanful in Japanese charset context.
901
+ # validate_case(["\177", []])
902
+ # validate_case(["\177\177\177", []])
903
+
904
+ end
905
+
906
+ def test_parse__domainliteral
907
+
908
+ validate_case__address\
909
+ 'test@[domain]',
910
+ :name => nil,
911
+ :display_name => nil,
912
+ :address => 'test@[domain]',
913
+ :comments => nil,
914
+ :domain => '[domain]',
915
+ :local => 'test',
916
+ :format => '<test@[domain]>'
917
+
918
+ validate_case__address\
919
+ '<@[obsdomain]:test@[domain]>',
920
+ :name => nil,
921
+ :display_name => nil,
922
+ :address => 'test@[domain]',
923
+ :comments => nil,
924
+ :domain => '[domain]',
925
+ :local => 'test',
926
+ :format => '<test@[domain]>'
927
+
928
+ validate_case__address\
929
+ '<@[ob\]sd\\\\omain]:test@[dom\]ai\\\\n]>',
930
+ :name => nil,
931
+ :display_name => nil,
932
+ :address => 'test@[dom]ai\\n]',
933
+ :comments => nil,
934
+ :domain => '[dom]ai\\n]',
935
+ :local => 'test',
936
+ :format => '<test@[dom\]ai\\\\n]>'
937
+
938
+ # ALL 'route's have '@' prefix so this example is wrong.
939
+ #"Bob \r<@machine.tld \r,\n [obsdomain]\t:\ntest @ [domain]>",
940
+ validate_case__address\
941
+ "Bob \r<@machine.tld \r,\n @[obsdomain]\t:\ntest @ [domain]>",
942
+ :name => 'Bob',
943
+ :display_name => 'Bob',
944
+ :address => 'test@[domain]',
945
+ :comments => nil,
946
+ :domain => '[domain]',
947
+ :local => 'test',
948
+ :format => 'Bob <test@[domain]>'
949
+ end
950
+
951
+
952
+ def test_exhaustive()
953
+
954
+ # We don't test every alphanumeric in atext -- assume that if a, m
955
+ # and z work, they all will.
956
+ atext = ('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a +
957
+ '!#$%&\'*+-/=?^_`{|}~'.split(//) #/
958
+ boring = ('b'..'l').to_a + ('n'..'o').to_a +
959
+ ('p'..'y').to_a + ('B'..'L').to_a + ('N'..'O').to_a +
960
+ ('P'..'Y').to_a + ('1'..'4').to_a + ('6'..'8').to_a
961
+
962
+ (atext - boring).each do |ch|
963
+ validate_case__address\
964
+ "#{ch} <#{ch}@test>",
965
+ :name => ch,
966
+ :display_name => ch,
967
+ :address => "#{ch}@test",
968
+ :comments => nil,
969
+ :domain => 'test',
970
+ :local => ch,
971
+ :format => ch + ' <' + ch + '@test>'
972
+ end
973
+
974
+ validate_case__address\
975
+ atext.join('') + ' <' + atext.join('') + '@test>',
976
+ :name => atext.join(''),
977
+ :display_name => atext.join(''),
978
+ :address => atext.join('') + '@test',
979
+ :comments => nil,
980
+ :domain => 'test',
981
+ :local => atext.join(''),
982
+ :format => atext.join('') + ' <' + atext.join('') + '@test>'
983
+
984
+ ascii = (0..127).collect {|i| i.chr }
985
+ whitespace = ["\r", "\n", ' ', "\t"]
986
+ # I remove ESC from this list because TMail is ESC sensitive.
987
+ # @ is explicitly tested below
988
+ qtext = ascii - (whitespace + ['"', '\\'] + ["\e"] + ["@"])
989
+ ctext = ascii - (whitespace + ['(', ')', '\\'] + ["\e"] + ["@"])
990
+ dtext = ascii - (whitespace + ['[', ']', '\\'] + ["\e"] + ["@"])
991
+
992
+ (qtext - atext).each do |ch|
993
+ validate_case__address\
994
+ %Q("#{ch}" <"#{ch}"@test>),
995
+ :name => ch,
996
+ :display_name => ch,
997
+ :address => %Q("#{ch}"@test),
998
+ :comments => nil,
999
+ :domain => 'test',
1000
+ :local => %Q("#{ch}"),
1001
+ :format => %Q("#{ch}" <"#{ch}"@test>)
1002
+ end
1003
+
1004
+ ['"', "\\"].each do |ch|
1005
+ validate_case__address\
1006
+ %Q("\\#{ch}" <"\\#{ch}"@test>),
1007
+ :name => ch,
1008
+ :display_name => ch,
1009
+ :address => %Q("\\#{ch}"@test),
1010
+ :comments => nil,
1011
+ :domain => 'test',
1012
+ :local => %Q("\\#{ch}"),
1013
+ :format => %Q("\\#{ch}" <"\\#{ch}"@test>)
1014
+
1015
+ end
1016
+
1017
+ (ctext - boring).each do |ch|
1018
+ validate_case__address\
1019
+ "bob@test (#{ch})",
1020
+ :name => ch,
1021
+ :display_name => nil,
1022
+ :address => 'bob@test',
1023
+ :comments => ["#{ch}"],
1024
+ :domain => 'test',
1025
+ :local => 'bob',
1026
+ :format => "bob@test (#{ch})"
1027
+
1028
+ validate_case__address\
1029
+ "bob@test (\\#{ch})",
1030
+ :name => ch,
1031
+ :display_name => nil,
1032
+ :address => 'bob@test',
1033
+ :comments => ["#{ch}"],
1034
+ :domain => 'test',
1035
+ :local => 'bob',
1036
+ :format => "bob@test (#{ch})"
1037
+ end
1038
+ [')', '(', '\\'].each do |ch|
1039
+ validate_case__address\
1040
+ "bob@test (\\#{ch})",
1041
+ :name => ch,
1042
+ :display_name => nil,
1043
+ :address => 'bob@test',
1044
+ :comments => ["#{ch}"],
1045
+ :domain => 'test',
1046
+ :local => 'bob',
1047
+ :format => "bob@test (\\#{ch})"
1048
+ end
1049
+
1050
+
1051
+ (dtext - boring).each do |ch|
1052
+ validate_case__address\
1053
+ "test@[\\#{ch}] (Sam)",
1054
+ :name => "Sam",
1055
+ :display_name => nil,
1056
+ :address => 'test@[' + ch + ']',
1057
+ :comments => ["Sam"],
1058
+ :domain => '[' + ch + ']',
1059
+ :local => 'test',
1060
+ :format => "<test@[#{ch}]> (Sam)"
1061
+
1062
+ validate_case__address\
1063
+ "Sally <test@[\\#{ch}]>",
1064
+ :name => 'Sally',
1065
+ :display_name => 'Sally',
1066
+ :address => "test@[#{ch}]",
1067
+ :comments => nil,
1068
+ :domain => "[#{ch}]",
1069
+ :local => 'test',
1070
+ :format => "Sally <test@[#{ch}]>"
1071
+ end
1072
+
1073
+ validate_case__address\
1074
+ "test@[" + (dtext - boring).join('') + "]",
1075
+ :name => nil,
1076
+ :display_name => nil,
1077
+ :address => 'test@[' + (dtext - boring).join('') + "]",
1078
+ :comments => nil,
1079
+ :domain => '[' + (dtext - boring).join('') + ']',
1080
+ :local => 'test',
1081
+ :format => '<test@[' + (dtext - boring).join('') + ']>'
1082
+
1083
+ validate_case__address\
1084
+ 'Bob <test@[' + (dtext - boring).join('') + ']>',
1085
+ :name => "Bob",
1086
+ :display_name => "Bob",
1087
+ :address => 'test@[' + (dtext - boring).join('') + "]",
1088
+ :comments => nil,
1089
+ :domain => '[' + (dtext - boring).join('') + ']',
1090
+ :local => 'test',
1091
+ :format => 'Bob <test@[' + (dtext - boring).join('') + ']>'
1092
+
1093
+ end
1094
+
1095
+ def test_dot_in_address()
1096
+
1097
+ validate_case__address\
1098
+ %Q(Minero A. <aamine@loveruby.net>),
1099
+ :name => "Minero A.",
1100
+ :display_name => "Minero A.",
1101
+ :address => %Q(aamine@loveruby.net),
1102
+ :comments => nil,
1103
+ :domain => 'loveruby.net',
1104
+ :local => %Q(aamine),
1105
+ :format => %Q("me@my_place" <aamine@loveruby.net>)
1106
+
1107
+ validate_case__address\
1108
+ %Q(mikel . <mikel@lindsaar.net>),
1109
+ :name => "mikel .",
1110
+ :display_name => "mikel .",
1111
+ :address => %Q(mikel@lindsaar.net),
1112
+ :comments => nil,
1113
+ :domain => 'lindsaar.net',
1114
+ :local => %Q(mikel),
1115
+ :format => %Q("mikel ." <mikel@lindsaar.net>)
1116
+
1117
+ validate_case__address\
1118
+ %Q("mikel ." <mikel@lindsaar.net>),
1119
+ :name => "mikel .",
1120
+ :display_name => "mikel .",
1121
+ :address => %Q(mikel@lindsaar.net),
1122
+ :comments => nil,
1123
+ :domain => 'lindsaar.net',
1124
+ :local => %Q(mikel),
1125
+ :format => %Q("mikel ." <mikel@lindsaar.net>)
1126
+
1127
+ validate_case__address\
1128
+ %Q(mikel "." <mikel@lindsaar.net>),
1129
+ :name => %Q(mikel .),
1130
+ :display_name => %Q(mikel .),
1131
+ :address => %Q(mikel@lindsaar.net),
1132
+ :comments => nil,
1133
+ :domain => 'lindsaar.net',
1134
+ :local => %Q(mikel),
1135
+ :format => %Q(mikel "." <mikel@lindsaar.net>)
1136
+
1137
+ end
1138
+
1139
+ def test_at_char_in_address()
1140
+
1141
+ validate_case__address\
1142
+ %Q(mikel@lindsaar.net <lindsaar@you.net>),
1143
+ :name => "mikel@lindsaar.net",
1144
+ :display_name => "mikel@lindsaar.net",
1145
+ :address => %Q(lindsaar@you.net),
1146
+ :comments => nil,
1147
+ :domain => 'you.net',
1148
+ :local => %Q(lindsaar),
1149
+ :format => %Q("mikel@lindsaar.net" <lindsaar@you.net>)
1150
+
1151
+ validate_case__address\
1152
+ %Q(mikel@lindsaar.net <mikel@lindsaar.net>),
1153
+ :name => %Q(mikel@lindsaar.net),
1154
+ :display_name => %Q(mikel@lindsaar.net),
1155
+ :address => %Q(mikel@lindsaar.net),
1156
+ :comments => nil,
1157
+ :domain => 'lindsaar.net',
1158
+ :local => %Q(mikel),
1159
+ :format => %Q(mikel@lindsaar.net)
1160
+
1161
+ validate_case__address\
1162
+ %Q("mikel@lindsaar.net" <mikel@lindsaar.net>),
1163
+ :name => %Q(mikel@lindsaar.net),
1164
+ :display_name => %Q(mikel@lindsaar.net),
1165
+ :address => %Q(mikel@lindsaar.net),
1166
+ :comments => nil,
1167
+ :domain => 'lindsaar.net',
1168
+ :local => %Q(mikel),
1169
+ :format => %Q(mikel@lindsaar.net)
1170
+
1171
+ validate_case__address\
1172
+ %Q("@" <"@"@lindsaar.net>),
1173
+ :name => "@",
1174
+ :display_name => "@",
1175
+ :address => %Q("@"@lindsaar.net),
1176
+ :comments => nil,
1177
+ :domain => 'lindsaar.net',
1178
+ :local => %Q("@"),
1179
+ :format => %Q("@" <"@"@lindsaar.net>)
1180
+
1181
+ validate_case__address\
1182
+ %Q("@" <"me@me"@lindsaar.net>),
1183
+ :name => "@",
1184
+ :display_name => "@",
1185
+ :address => %Q("me@me"@lindsaar.net),
1186
+ :comments => nil,
1187
+ :domain => 'lindsaar.net',
1188
+ :local => %Q("me@me"),
1189
+ :format => %Q("@" <"me@me"@lindsaar.net>)
1190
+
1191
+ validate_case__address\
1192
+ %Q("mikel" <mikel@lindsaar.net>),
1193
+ :name => "mikel",
1194
+ :display_name => "mikel",
1195
+ :address => %Q(mikel@lindsaar.net),
1196
+ :comments => nil,
1197
+ :domain => 'lindsaar.net',
1198
+ :local => %Q(mikel),
1199
+ :format => %Q("mikel" <mikel@lindsaar.net>)
1200
+
1201
+ validate_case__address\
1202
+ %Q(mikel <mikel@lindsaar.net>),
1203
+ :name => "mikel",
1204
+ :display_name => "mikel",
1205
+ :address => %Q(mikel@lindsaar.net),
1206
+ :comments => nil,
1207
+ :domain => 'lindsaar.net',
1208
+ :local => %Q(mikel),
1209
+ :format => %Q(mikel <mikel@lindsaar.net>)
1210
+ end
1211
+
1212
+ def test_trailing_dot_in_name
1213
+ fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email_trailing_dot")
1214
+ str = 'Sandy M. <noreply@rubyforge.org>'
1215
+ mail = TMail::Mail.parse(fixture)
1216
+ assert_equal '"Sandy M." <noreply@rubyforge.org>', mail['from'].to_s
1217
+ end
1218
+
1219
+ end