lonbaker-tmail 1.2.3.1

Sign up to get free protection for your applications and to get access to all the features.
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