tmail 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. data/LICENSE +21 -0
  2. data/README +157 -0
  3. data/bat/changelog +19 -0
  4. data/bat/clobber/package +10 -0
  5. data/bat/compile +42 -0
  6. data/bat/config.yaml +8 -0
  7. data/bat/prepare +8 -0
  8. data/bat/publish +51 -0
  9. data/bat/rdoc +42 -0
  10. data/bat/release +12 -0
  11. data/bat/setup +1616 -0
  12. data/bat/stats +138 -0
  13. data/bat/tag +25 -0
  14. data/bat/test +25 -0
  15. data/ext/tmail/Makefile +25 -0
  16. data/ext/tmail/base64/MANIFEST +4 -0
  17. data/ext/tmail/base64/base64.c +264 -0
  18. data/ext/tmail/base64/depend +1 -0
  19. data/ext/tmail/base64/extconf.rb +38 -0
  20. data/ext/tmail/scanner_c/MANIFEST +4 -0
  21. data/ext/tmail/scanner_c/depend +1 -0
  22. data/ext/tmail/scanner_c/extconf.rb +38 -0
  23. data/ext/tmail/scanner_c/scanner_c.c +582 -0
  24. data/lib/tmail.rb +4 -0
  25. data/lib/tmail/Makefile +19 -0
  26. data/lib/tmail/address.rb +245 -0
  27. data/lib/tmail/attachments.rb +47 -0
  28. data/lib/tmail/base64.rb +75 -0
  29. data/lib/tmail/compat.rb +39 -0
  30. data/lib/tmail/config.rb +71 -0
  31. data/lib/tmail/core_extensions.rb +67 -0
  32. data/lib/tmail/encode.rb +524 -0
  33. data/lib/tmail/header.rb +931 -0
  34. data/lib/tmail/index.rb +8 -0
  35. data/lib/tmail/interface.rb +540 -0
  36. data/lib/tmail/loader.rb +1 -0
  37. data/lib/tmail/mail.rb +507 -0
  38. data/lib/tmail/mailbox.rb +435 -0
  39. data/lib/tmail/mbox.rb +1 -0
  40. data/lib/tmail/net.rb +282 -0
  41. data/lib/tmail/obsolete.rb +137 -0
  42. data/lib/tmail/parser.rb +1475 -0
  43. data/lib/tmail/parser.y +381 -0
  44. data/lib/tmail/port.rb +379 -0
  45. data/lib/tmail/quoting.rb +142 -0
  46. data/lib/tmail/require_arch.rb +56 -0
  47. data/lib/tmail/scanner.rb +44 -0
  48. data/lib/tmail/scanner_r.rb +263 -0
  49. data/lib/tmail/stringio.rb +279 -0
  50. data/lib/tmail/tmail.rb +1 -0
  51. data/lib/tmail/utils.rb +281 -0
  52. data/lib/tmail/version.rb +38 -0
  53. data/meta/icli.yaml +16 -0
  54. data/meta/tmail-1.1.1.roll +24 -0
  55. data/sample/data/multipart +23 -0
  56. data/sample/data/normal +29 -0
  57. data/sample/data/sendtest +5 -0
  58. data/sample/data/simple +14 -0
  59. data/sample/data/test +27 -0
  60. data/sample/extract-attachements.rb +33 -0
  61. data/sample/from-check.rb +26 -0
  62. data/sample/multipart.rb +26 -0
  63. data/sample/parse-bench.rb +68 -0
  64. data/sample/parse-test.rb +19 -0
  65. data/sample/sendmail.rb +94 -0
  66. data/test/extctrl.rb +6 -0
  67. data/test/fixtures/raw_base64_decoded_string +0 -0
  68. data/test/fixtures/raw_base64_email +83 -0
  69. data/test/fixtures/raw_base64_encoded_string +1 -0
  70. data/test/fixtures/raw_email +14 -0
  71. data/test/fixtures/raw_email10 +20 -0
  72. data/test/fixtures/raw_email11 +34 -0
  73. data/test/fixtures/raw_email12 +32 -0
  74. data/test/fixtures/raw_email13 +29 -0
  75. data/test/fixtures/raw_email2 +114 -0
  76. data/test/fixtures/raw_email3 +70 -0
  77. data/test/fixtures/raw_email4 +59 -0
  78. data/test/fixtures/raw_email5 +19 -0
  79. data/test/fixtures/raw_email6 +20 -0
  80. data/test/fixtures/raw_email7 +66 -0
  81. data/test/fixtures/raw_email8 +47 -0
  82. data/test/fixtures/raw_email9 +28 -0
  83. data/test/fixtures/raw_email_quoted_with_0d0a +14 -0
  84. data/test/fixtures/raw_email_simple +11 -0
  85. data/test/fixtures/raw_email_with_illegal_boundary +58 -0
  86. data/test/fixtures/raw_email_with_multipart_mixed_quoted_boundary +50 -0
  87. data/test/fixtures/raw_email_with_nested_attachment +100 -0
  88. data/test/fixtures/raw_email_with_partially_quoted_subject +14 -0
  89. data/test/fixtures/raw_email_with_quoted_illegal_boundary +58 -0
  90. data/test/kcode.rb +14 -0
  91. data/test/test_address.rb +1128 -0
  92. data/test/test_attachments.rb +35 -0
  93. data/test/test_base64.rb +63 -0
  94. data/test/test_encode.rb +77 -0
  95. data/test/test_header.rb +885 -0
  96. data/test/test_helper.rb +2 -0
  97. data/test/test_mail.rb +623 -0
  98. data/test/test_mbox.rb +126 -0
  99. data/test/test_port.rb +430 -0
  100. data/test/test_scanner.rb +209 -0
  101. data/test/test_utils.rb +37 -0
  102. metadata +205 -0
@@ -0,0 +1,2 @@
1
+ require 'rubygems'
2
+ require 'ruby-debug'
@@ -0,0 +1,623 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+ require 'tmail'
3
+ require 'kcode'
4
+ require 'extctrl'
5
+ require 'test/unit'
6
+ require 'time'
7
+ require 'test_helper'
8
+
9
+ class TestMail < Test::Unit::TestCase
10
+ include TMail::TextUtils
11
+
12
+ def setup
13
+ @mail = TMail::Mail.new
14
+ end
15
+
16
+ def lf( str )
17
+ str.gsub(/\n|\r\n|\r/) { "\n" }
18
+ end
19
+
20
+ def crlf( str )
21
+ str.gsub(/\n|\r\n|\r/) { "\r\n" }
22
+ end
23
+
24
+ def test_MIME
25
+ # FIXME: test more.
26
+
27
+ kcode('EUC') {
28
+ mail = TMail::Mail.parse('From: hoge@example.jp (=?iso-2022-jp?B?GyRCJUYlOSVIGyhC?=)')
29
+ assert_not_nil mail['From']
30
+ assert_equal ["\245\306\245\271\245\310"], mail['From'].comments
31
+ assert_equal "From: hoge@example.jp (\245\306\245\271\245\310)\n\n",
32
+ mail.to_s
33
+ assert_equal "From: hoge@example.jp (\245\306\245\271\245\310)\n\n",
34
+ mail.decoded
35
+ assert_equal "From: hoge@example.jp (=?iso-2022-jp?B?GyRCJUYlOSVIGyhC?=)\r\n\r\n",
36
+ mail.encoded
37
+ }
38
+ end
39
+
40
+ def test_to_s
41
+ time = Time.parse('Tue, 4 Dec 2001 10:49:58 +0900').strftime("%a,%e %b %Y %H:%M:%S %z")
42
+ str =<<EOS
43
+ Date: #{time}
44
+ To: Minero Aoki <aamine@loveruby.net>
45
+ Subject: This is test message.
46
+
47
+ This is body.
48
+ EOS
49
+ str = crlf(str)
50
+ m = TMail::Mail.parse(str)
51
+ # strip to avoid error by body's line terminator.
52
+ assert_equal lf(str).strip, m.decoded.strip
53
+ assert_equal crlf(str).strip, m.encoded.strip
54
+ end
55
+
56
+ def test__empty_return_path
57
+ str = "Return-Path: <>\r\n\r\n"
58
+ assert_equal str, TMail::Mail.parse(str).encoded
59
+ end
60
+
61
+ def test_date
62
+ t = Time.now
63
+ @mail.date = t
64
+ assert_equal t.to_i, @mail.date.to_i # avoid usec comparison
65
+ assert_equal time2str(t), @mail['date'].to_s
66
+
67
+ str = "Date: #{time2str(t)}\n\n"
68
+ assert_equal str, TMail::Mail.parse(str).to_s
69
+ end
70
+
71
+ def test_strftime
72
+ t = Time.now
73
+ fmt = '%A%a%B%b%c%d%H%I%j%M%m%p%S%U%W%w%X%x%Y%y%Z%%'
74
+ @mail.date = t
75
+ assert_equal t.strftime(fmt), @mail.strftime(fmt)
76
+ end
77
+
78
+ def test_to
79
+ addr = 'Minero Aoki <aamine@loveruby.net>'
80
+ @mail.to = addr
81
+ assert_equal 1, @mail['to'].addrs.size
82
+ assert_equal 'aamine@loveruby.net', @mail['to'].addrs[0].spec
83
+ assert_equal 'Minero Aoki', @mail['to'].addrs[0].phrase
84
+
85
+ a = @mail.to_addrs
86
+ assert_equal 1, a.size
87
+ assert_equal 'aamine@loveruby.net', a[0].spec
88
+ assert_equal 'Minero Aoki', a[0].phrase
89
+
90
+ a = @mail.to
91
+ assert_equal 1, a.size
92
+ assert_equal 'aamine@loveruby.net', a[0]
93
+
94
+ addr = TMail::Address.parse('Minero Aoki <aamine@loveruby.net>')
95
+ @mail.to_addrs = addr
96
+ assert_equal 1, @mail['to'].addrs.size
97
+ assert_equal 'aamine@loveruby.net', @mail['to'].addrs[0].spec
98
+ assert_equal 'Minero Aoki', @mail['to'].addrs[0].phrase
99
+
100
+ a = @mail.to_addrs
101
+ assert_equal 1, a.size
102
+ assert_equal 'aamine@loveruby.net', a[0].spec
103
+ assert_equal 'Minero Aoki', a[0].phrase
104
+
105
+ a = @mail.to
106
+ assert_equal 1, a.size
107
+ assert_equal 'aamine@loveruby.net', a[0]
108
+
109
+
110
+ @mail.to = ''
111
+ assert_equal nil, @mail.to
112
+ assert_equal 'DEFAULT VALUE', @mail.to('DEFAULT VALUE')
113
+
114
+ @mail.to = 'undisclosed-recipients: ;'
115
+ a = @mail.to
116
+ assert_equal nil, @mail.to
117
+ assert_equal 'DEFAULT VALUE', @mail.to('DEFAULT VALUE')
118
+
119
+
120
+ str = "\"Aoki, Minero\" <aamine@loveruby.net>\n\n"
121
+ @mail.to_addrs = a = TMail::Address.parse(str)
122
+ assert_equal ['aamine@loveruby.net'], @mail.to
123
+ assert_equal [a], @mail.to_addrs
124
+ assert_equal '"Aoki, Minero" <aamine@loveruby.net>', @mail.to_addrs[0].to_s
125
+ assert_equal '"Aoki, Minero" <aamine@loveruby.net>', @mail['to'].to_s
126
+ end
127
+
128
+ def test_cc
129
+ addr = 'Minero Aoki <aamine@loveruby.net>'
130
+ @mail.cc = addr
131
+ assert_equal 1, @mail['cc'].addrs.size
132
+ assert_equal 'aamine@loveruby.net', @mail['cc'].addrs[0].spec
133
+ assert_equal 'Minero Aoki', @mail['cc'].addrs[0].phrase
134
+
135
+ a = @mail.cc_addrs
136
+ assert_equal 1, a.size
137
+ assert_equal 'aamine@loveruby.net', a[0].spec
138
+ assert_equal 'Minero Aoki', a[0].phrase
139
+
140
+ a = @mail.cc
141
+ assert_equal 1, a.size
142
+ assert_equal 'aamine@loveruby.net', a[0]
143
+
144
+ addr = TMail::Address.parse('Minero Aoki <aamine@loveruby.net>')
145
+ @mail.cc_addrs = addr
146
+ assert_equal 1, @mail['cc'].addrs.size
147
+ assert_equal 'aamine@loveruby.net', @mail['cc'].addrs[0].spec
148
+ assert_equal 'Minero Aoki', @mail['cc'].addrs[0].phrase
149
+
150
+ a = @mail.cc_addrs
151
+ assert_equal 1, a.size
152
+ assert_equal 'aamine@loveruby.net', a[0].spec
153
+ assert_equal 'Minero Aoki', a[0].phrase
154
+
155
+ a = @mail.cc
156
+ assert_equal 1, a.size
157
+ assert_equal 'aamine@loveruby.net', a[0]
158
+
159
+
160
+ @mail.cc = ''
161
+ assert_equal nil, @mail.cc
162
+ assert_equal 'DEFAULT VALUE', @mail.cc('DEFAULT VALUE')
163
+
164
+ @mail.cc = 'undisclosed-recipients: ;'
165
+ a = @mail.cc
166
+ assert_equal nil, @mail.cc
167
+ assert_equal 'DEFAULT VALUE', @mail.cc('DEFAULT VALUE')
168
+ end
169
+
170
+ def test_bcc
171
+ addr = 'Minero Aoki <aamine@loveruby.net>'
172
+ @mail.bcc = addr
173
+ assert_equal 1, @mail['bcc'].addrs.size
174
+ assert_equal 'aamine@loveruby.net', @mail['bcc'].addrs[0].spec
175
+ assert_equal 'Minero Aoki', @mail['bcc'].addrs[0].phrase
176
+
177
+ a = @mail.bcc_addrs
178
+ assert_equal 1, a.size
179
+ assert_equal 'aamine@loveruby.net', a[0].spec
180
+ assert_equal 'Minero Aoki', a[0].phrase
181
+
182
+ a = @mail.bcc
183
+ assert_equal 1, a.size
184
+ assert_equal 'aamine@loveruby.net', a[0]
185
+
186
+ addr = TMail::Address.parse('Minero Aoki <aamine@loveruby.net>')
187
+ @mail.bcc_addrs = addr
188
+ assert_equal 1, @mail['bcc'].addrs.size
189
+ assert_equal 'aamine@loveruby.net', @mail['bcc'].addrs[0].spec
190
+ assert_equal 'Minero Aoki', @mail['bcc'].addrs[0].phrase
191
+
192
+ a = @mail.bcc_addrs
193
+ assert_equal 1, a.size
194
+ assert_equal 'aamine@loveruby.net', a[0].spec
195
+ assert_equal 'Minero Aoki', a[0].phrase
196
+
197
+ a = @mail.bcc
198
+ assert_equal 1, a.size
199
+ assert_equal 'aamine@loveruby.net', a[0]
200
+
201
+
202
+ @mail.bcc = ''
203
+ assert_equal nil, @mail.bcc
204
+ assert_equal 'DEFAULT VALUE', @mail.bcc('DEFAULT VALUE')
205
+
206
+ @mail.bcc = 'undisclosed-recipients: ;'
207
+ a = @mail.bcc
208
+ assert_equal nil, @mail.bcc
209
+ assert_equal 'DEFAULT VALUE', @mail.bcc('DEFAULT VALUE')
210
+ end
211
+
212
+ def test_from
213
+ addr = 'Minero Aoki <aamine@loveruby.net>'
214
+ @mail.from = addr
215
+ assert_equal 1, @mail['from'].addrs.size
216
+ assert_equal 'aamine@loveruby.net', @mail['from'].addrs[0].spec
217
+ assert_equal 'Minero Aoki', @mail['from'].addrs[0].phrase
218
+
219
+ a = @mail.from_addrs
220
+ assert_equal 1, a.size
221
+ assert_equal 'aamine@loveruby.net', a[0].spec
222
+ assert_equal 'Minero Aoki', a[0].phrase
223
+
224
+ a = @mail.from
225
+ assert_equal 1, a.size
226
+ assert_equal 'aamine@loveruby.net', a[0]
227
+
228
+ addr = TMail::Address.parse('Minero Aoki <aamine@loveruby.net>')
229
+ @mail.from_addrs = addr
230
+ assert_equal 1, @mail['from'].addrs.size
231
+ assert_equal 'aamine@loveruby.net', @mail['from'].addrs[0].spec
232
+ assert_equal 'Minero Aoki', @mail['from'].addrs[0].phrase
233
+
234
+ a = @mail.from_addrs
235
+ assert_equal 1, a.size
236
+ assert_equal 'aamine@loveruby.net', a[0].spec
237
+ assert_equal 'Minero Aoki', a[0].phrase
238
+
239
+ a = @mail.from
240
+ assert_equal 1, a.size
241
+ assert_equal 'aamine@loveruby.net', a[0]
242
+
243
+
244
+ @mail.from = ''
245
+ assert_equal nil, @mail.from
246
+ assert_equal 'DEFAULT VALUE', @mail.from('DEFAULT VALUE')
247
+
248
+ @mail.from = 'undisclosed-recipients: ;'
249
+ a = @mail.from
250
+ assert_equal nil, @mail.from
251
+ assert_equal 'DEFAULT VALUE', @mail.from('DEFAULT VALUE')
252
+ end
253
+
254
+ def test_reply_to
255
+ addr = 'Minero Aoki <aamine@loveruby.net>'
256
+ @mail.reply_to = addr
257
+ assert_equal 1, @mail['reply-to'].addrs.size
258
+ assert_equal 'aamine@loveruby.net', @mail['reply-to'].addrs[0].spec
259
+ assert_equal 'Minero Aoki', @mail['reply-to'].addrs[0].phrase
260
+
261
+ a = @mail.reply_to_addrs
262
+ assert_equal 1, a.size
263
+ assert_equal 'aamine@loveruby.net', a[0].spec
264
+ assert_equal 'Minero Aoki', a[0].phrase
265
+
266
+ a = @mail.reply_to
267
+ assert_equal 1, a.size
268
+ assert_equal 'aamine@loveruby.net', a[0]
269
+
270
+ addr = TMail::Address.parse('Minero Aoki <aamine@loveruby.net>')
271
+ @mail.reply_to_addrs = addr
272
+ assert_equal 1, @mail['reply-to'].addrs.size
273
+ assert_equal 'aamine@loveruby.net', @mail['reply-to'].addrs[0].spec
274
+ assert_equal 'Minero Aoki', @mail['reply-to'].addrs[0].phrase
275
+
276
+ a = @mail.reply_to_addrs
277
+ assert_equal 1, a.size
278
+ assert_equal 'aamine@loveruby.net', a[0].spec
279
+ assert_equal 'Minero Aoki', a[0].phrase
280
+
281
+ a = @mail.reply_to
282
+ assert_equal 1, a.size
283
+ assert_equal 'aamine@loveruby.net', a[0]
284
+
285
+
286
+ @mail.reply_to = ''
287
+ assert_equal nil, @mail.reply_to
288
+ assert_equal 'DEFAULT VALUE', @mail.reply_to('DEFAULT VALUE')
289
+
290
+ @mail.reply_to = 'undisclosed-recipients: ;'
291
+ a = @mail.reply_to
292
+ assert_equal nil, @mail.reply_to
293
+ assert_equal 'DEFAULT VALUE', @mail.reply_to('DEFAULT VALUE')
294
+ end
295
+
296
+ def do_test_address_attr( name )
297
+ addr = 'Minero Aoki <aamine@loveruby.net>'
298
+ @mail.__send__( name + '=', addr )
299
+ a = @mail.__send__( name + '_addrs' )
300
+ assert_equal 1, a.size
301
+ assert_equal 'aamine@loveruby.net', a[0].spec
302
+ assert_equal 'Minero Aoki', a[0].phrase
303
+
304
+ a = @mail.__send__( name )
305
+ assert_equal 1, a.size
306
+ assert_equal 'aamine@loveruby.net', a[0]
307
+ end
308
+
309
+ def test_subject
310
+ s = 'This is test subject!'
311
+ @mail.subject = s
312
+ assert_equal s, @mail.subject
313
+ assert_equal s, @mail['subject'].to_s
314
+ end
315
+
316
+ def test_unquote_quoted_printable_subject
317
+ msg = <<EOF
318
+ From: me@example.com
319
+ Subject: =?utf-8?Q?testing_testing_=D6=A4?=
320
+ Content-Type: text/plain; charset=iso-8859-1
321
+
322
+ The body
323
+ EOF
324
+ mail = TMail::Mail.parse(msg)
325
+ assert_equal "testing testing \326\244", mail.subject
326
+ assert_equal "=?utf-8?Q?testing_testing_=D6=A4?=", mail.quoted_subject
327
+ end
328
+
329
+ def test_unquote_7bit_subject
330
+ msg = <<EOF
331
+ From: me@example.com
332
+ Subject: this == working?
333
+ Content-Type: text/plain; charset=iso-8859-1
334
+
335
+ The body
336
+ EOF
337
+ mail = TMail::Mail.parse(msg)
338
+ assert_equal "this == working?", mail.subject
339
+ assert_equal "this == working?", mail.quoted_subject
340
+ end
341
+
342
+ def test_unquote_7bit_body
343
+ msg = <<EOF
344
+ From: me@example.com
345
+ Subject: subject
346
+ Content-Type: text/plain; charset=iso-8859-1
347
+ Content-Transfer-Encoding: 7bit
348
+
349
+ The=3Dbody
350
+ EOF
351
+ mail = TMail::Mail.parse(msg)
352
+ assert_equal "The=3Dbody", mail.body.strip
353
+ assert_equal "The=3Dbody", mail.quoted_body.strip
354
+ end
355
+
356
+ def test_unquote_quoted_printable_body
357
+ msg = <<EOF
358
+ From: me@example.com
359
+ Subject: subject
360
+ Content-Type: text/plain; charset=iso-8859-1
361
+ Content-Transfer-Encoding: quoted-printable
362
+
363
+ The=3Dbody
364
+ EOF
365
+ mail = TMail::Mail.parse(msg)
366
+ assert_equal "The=body", mail.body.strip
367
+ assert_equal "The=3Dbody", mail.quoted_body.strip
368
+ end
369
+
370
+ def test_unquote_base64_body
371
+ msg = <<EOF
372
+ From: me@example.com
373
+ Subject: subject
374
+ Content-Type: text/plain; charset=iso-8859-1
375
+ Content-Transfer-Encoding: base64
376
+
377
+ VGhlIGJvZHk=
378
+ EOF
379
+ mail = TMail::Mail.parse(msg)
380
+ assert_equal "The body", mail.body.strip
381
+ assert_equal "VGhlIGJvZHk=", mail.quoted_body.strip
382
+ end
383
+
384
+ def test_message_id
385
+ assert_nil @mail.message_id
386
+ assert_equal 1, @mail.message_id(1)
387
+
388
+ m = '<very.unique.identity@fully.quorified.domain.name>'
389
+ @mail.message_id = m
390
+ assert_equal m, @mail.message_id
391
+ end
392
+
393
+ def test_in_reply_to
394
+ i = '<very.unique.identity@fully.quorified.domain.name>'
395
+ @mail.in_reply_to = i
396
+ a = @mail.in_reply_to
397
+ assert_equal a.size, 1
398
+ assert_equal i, a[0]
399
+
400
+ @mail.in_reply_to = [i]
401
+ a = @mail.in_reply_to
402
+ assert_equal a.size, 1
403
+ assert_equal i, a[0]
404
+ end
405
+
406
+ def test_references
407
+ i = '<very.unique.identity@fully.quorified.domain.name>'
408
+ @mail.references = i
409
+ a = @mail.references
410
+ assert_equal a.size, 1
411
+ assert_equal i, a[0]
412
+
413
+ @mail.references = [i]
414
+ a = @mail.references
415
+ assert_equal a.size, 1
416
+ assert_equal i, a[0]
417
+ end
418
+
419
+ def test_mime_version
420
+ assert_nil @mail.mime_version
421
+ assert_equal 1, @mail.mime_version(1)
422
+
423
+ %w( 1.0 999.999 ).each do |v|
424
+ @mail.mime_version = v
425
+ assert_equal v, @mail.mime_version
426
+ end
427
+ end
428
+
429
+ def test_content_type
430
+ [ 'text/plain', 'application/binary', 'multipart/mixed' ].each do |t|
431
+ @mail.content_type = t
432
+ assert_equal t, @mail.content_type
433
+ assert_equal t.split('/',2)[0], @mail.main_type
434
+ assert_equal t.split('/',2)[1], @mail.sub_type
435
+ end
436
+
437
+ @mail.content_type = 'text/plain; charset=iso-2022-jp'
438
+ @mail.content_type = 'application/postscript'
439
+
440
+ assert_raises(ArgumentError) {
441
+ @mail.content_type = 'text'
442
+ }
443
+ end
444
+
445
+ def test_mail_to_s_with_illegal_content_type_boundary_preserves_quotes
446
+ msg = <<EOF
447
+ From: mikel@example.com
448
+ Subject: Hello
449
+ Content-Type: multipart/signed;
450
+ micalg=sha1;
451
+ boundary=Apple-Mail-42-587703407;
452
+ protocol="application/pkcs7-signature"
453
+
454
+ The body
455
+ EOF
456
+
457
+ output = <<EOF
458
+ From: mikel@example.com
459
+ Subject: Hello
460
+ Content-Type: multipart/signed; protocol="application/pkcs7-signature"; boundary=Apple-Mail-42-587703407; micalg=sha1
461
+
462
+ The body
463
+ EOF
464
+
465
+ mail = TMail::Mail.parse(msg)
466
+ assert_equal(output, mail.to_s)
467
+ end
468
+
469
+ def test_mail_to_s_with_filename_discards_quotes_as_needed
470
+ msg = <<EOF
471
+ From: mikel@example.com
472
+ Subject: =?utf-8?Q?testing_testing_=D6=A4?=
473
+ Content-Disposition: attachment; filename="README.txt.pif"
474
+
475
+ The body
476
+ EOF
477
+ mail = TMail::Mail.parse(msg)
478
+ result =<<EOF
479
+ From: mikel@example.com
480
+ Subject: =?utf-8?Q?testing_testing_=D6=A4?=
481
+ Content-Disposition: attachment; filename=README.txt.pif
482
+
483
+ The body
484
+ EOF
485
+ assert_equal(result, mail.to_s)
486
+
487
+
488
+ msg = <<EOF
489
+ From: mikel@example.com
490
+ Subject: =?utf-8?Q?testing_testing_=D6=A4?=
491
+ Content-Disposition: attachment; filename="READ-=ME.t=xt./pi?f"
492
+
493
+ The body
494
+ EOF
495
+ mail = TMail::Mail.parse(msg)
496
+ result =<<EOF
497
+ From: mikel@example.com
498
+ Subject: =?utf-8?Q?testing_testing_=D6=A4?=
499
+ Content-Disposition: attachment; filename="READ-=ME.t=xt./pi?f"
500
+
501
+ The body
502
+ EOF
503
+ assert_equal(result, mail.to_s)
504
+
505
+ end
506
+
507
+ def test_charset
508
+ c = 'iso-2022-jp'
509
+ @mail.charset = c
510
+ assert_equal c, @mail.charset
511
+ assert_equal 'text', @mail.main_type
512
+ assert_equal 'plain', @mail.sub_type
513
+
514
+ @mail.content_type = 'application/binary'
515
+ @mail.charset = c
516
+ assert_equal c, @mail.charset
517
+ end
518
+
519
+ def test_transfer_encoding
520
+ @mail.transfer_encoding = 'base64'
521
+ assert_equal 'base64', @mail.transfer_encoding
522
+ @mail.transfer_encoding = 'BASE64'
523
+ assert_equal 'base64', @mail.transfer_encoding
524
+ @mail.content_transfer_encoding = '7bit'
525
+ assert_equal '7bit', @mail.content_transfer_encoding
526
+ @mail.encoding = 'binary'
527
+ assert_equal 'binary', @mail.encoding
528
+ end
529
+
530
+ def test_disposition
531
+ @mail['content-disposition'] = 'attachment; filename="test.rb"'
532
+ assert_equal 'attachment', @mail.disposition
533
+ assert_equal 'attachment', @mail.content_disposition
534
+ assert_equal 'test.rb', @mail.disposition_param('filename')
535
+
536
+ @mail.disposition = 'none'
537
+ assert_equal 'none', @mail.disposition
538
+ assert_nil @mail.disposition_param('filename')
539
+ assert_equal 1, @mail.disposition_param('filename', 1)
540
+
541
+ src = '=?iso-2022-jp?B?GyRCRnxLXDhsGyhCLnR4dA==?='
542
+ @mail['content-disposition'] = %Q(attachment; filename="#{src}")
543
+ ok = NKF.nkf('-m -e', src)
544
+ kcode('EUC') {
545
+ assert_equal ok, @mail.disposition_param('filename')
546
+ }
547
+ end
548
+
549
+ def test_set_disposition
550
+ @mail.set_disposition 'attachment', 'filename'=>'sample.rb'
551
+ assert_equal 'attachment', @mail.disposition
552
+ assert_equal 'sample.rb', @mail.disposition_param('filename')
553
+ end
554
+
555
+ def test_receive_attachments
556
+ fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email2")
557
+ mail = TMail::Mail.parse(fixture)
558
+ attachment = mail.attachments.last
559
+ assert_equal "smime.p7s", attachment.original_filename
560
+ assert_equal "application/pkcs7-signature", attachment.content_type
561
+ end
562
+
563
+ def test_body_with_underscores
564
+ m = TMail::Mail.new
565
+ expected = 'something_with_underscores'
566
+ m.encoding = 'quoted-printable'
567
+ quoted_body = [expected].pack('*M')
568
+ m.body = quoted_body
569
+ assert_equal "something_with_underscores=\n", m.quoted_body
570
+ assert_equal expected, m.body
571
+ end
572
+
573
+ def test_nested_attachments_are_recognized_correctly
574
+ fixture = File.read("#{File.dirname(__FILE__)}/fixtures/raw_email_with_nested_attachment")
575
+ mail = TMail::Mail.parse(fixture)
576
+ assert_equal 2, mail.attachments.length
577
+ assert_equal "image/png", mail.attachments.first.content_type
578
+ assert_equal 1902, mail.attachments.first.length
579
+ assert_equal "application/pkcs7-signature", mail.attachments.last.content_type
580
+ end
581
+
582
+ def test_decode_attachment_without_charset
583
+ fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email3")
584
+ mail = TMail::Mail.parse(fixture)
585
+ attachment = mail.attachments.last
586
+ assert_equal 1026, attachment.read.length
587
+ end
588
+
589
+ def test_decode_message_without_content_type
590
+ fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email4")
591
+ mail = TMail::Mail.parse(fixture)
592
+ assert_nothing_raised { mail.body }
593
+ end
594
+
595
+ def test_quoting_of_illegal_boundary_when_doing_mail_to_s
596
+ fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email_with_illegal_boundary")
597
+ mail = TMail::Mail.parse(fixture)
598
+ assert_equal(true, mail.multipart?)
599
+ assert_equal('multipart/alternative; boundary="----=_NextPart_000_0093_01C81419.EB75E850"', mail['content-type'].to_s)
600
+ end
601
+
602
+ def test_quoted_illegal_boundary_when_doing_mail_to_s
603
+ fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email_with_quoted_illegal_boundary")
604
+ mail = TMail::Mail.parse(fixture)
605
+ assert_equal(true, mail.multipart?)
606
+ assert_equal('multipart/alternative; boundary="----=_NextPart_000_0093_01C81419.EB75E850"', mail['content-type'].to_s)
607
+ end
608
+
609
+ def test_quoted_illegal_boundary_with_multipart_mixed_when_doing_mail_to_s
610
+ fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email_with_multipart_mixed_quoted_boundary")
611
+ mail = TMail::Mail.parse(fixture)
612
+ assert_equal(true, mail.multipart?)
613
+ assert_equal('multipart/mixed; boundary="----=_Part_2192_32400445.1115745999735"', mail['content-type'].to_s)
614
+ end
615
+
616
+ def test_when_opening_a_base64_encoded_email_and_re_parsing_it_keeps_the_transfer_encoding_correct
617
+ mail = TMail::Mail.load(File.dirname(__FILE__) + "/fixtures/raw_base64_email")
618
+ assert_equal("Base64", mail['Content-Transfer-Encoding'].to_s)
619
+ decoded_mail = TMail::Mail.parse(mail.to_s)
620
+ assert_equal("Base64", decoded_mail['Content-Transfer-Encoding'].to_s)
621
+ end
622
+
623
+ end