tmail 1.1.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 (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