lonbaker-tmail 1.2.3.1

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