ledermann-tmail 1.2.5

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