valodzka-valodzka-tmail 1.2.3.2

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