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.
- data/LICENSE +21 -0
- data/README +157 -0
- data/bat/changelog +19 -0
- data/bat/clobber/package +10 -0
- data/bat/compile +42 -0
- data/bat/config.yaml +8 -0
- data/bat/prepare +8 -0
- data/bat/publish +51 -0
- data/bat/rdoc +42 -0
- data/bat/release +12 -0
- data/bat/setup +1616 -0
- data/bat/stats +138 -0
- data/bat/tag +25 -0
- data/bat/test +25 -0
- data/ext/tmail/Makefile +25 -0
- data/ext/tmail/base64/MANIFEST +4 -0
- data/ext/tmail/base64/base64.c +264 -0
- data/ext/tmail/base64/depend +1 -0
- data/ext/tmail/base64/extconf.rb +38 -0
- data/ext/tmail/scanner_c/MANIFEST +4 -0
- data/ext/tmail/scanner_c/depend +1 -0
- data/ext/tmail/scanner_c/extconf.rb +38 -0
- data/ext/tmail/scanner_c/scanner_c.c +582 -0
- data/lib/tmail.rb +4 -0
- data/lib/tmail/Makefile +19 -0
- data/lib/tmail/address.rb +245 -0
- data/lib/tmail/attachments.rb +47 -0
- data/lib/tmail/base64.rb +75 -0
- data/lib/tmail/compat.rb +39 -0
- data/lib/tmail/config.rb +71 -0
- data/lib/tmail/core_extensions.rb +67 -0
- data/lib/tmail/encode.rb +524 -0
- data/lib/tmail/header.rb +931 -0
- data/lib/tmail/index.rb +8 -0
- data/lib/tmail/interface.rb +540 -0
- data/lib/tmail/loader.rb +1 -0
- data/lib/tmail/mail.rb +507 -0
- data/lib/tmail/mailbox.rb +435 -0
- data/lib/tmail/mbox.rb +1 -0
- data/lib/tmail/net.rb +282 -0
- data/lib/tmail/obsolete.rb +137 -0
- data/lib/tmail/parser.rb +1475 -0
- data/lib/tmail/parser.y +381 -0
- data/lib/tmail/port.rb +379 -0
- data/lib/tmail/quoting.rb +142 -0
- data/lib/tmail/require_arch.rb +56 -0
- data/lib/tmail/scanner.rb +44 -0
- data/lib/tmail/scanner_r.rb +263 -0
- data/lib/tmail/stringio.rb +279 -0
- data/lib/tmail/tmail.rb +1 -0
- data/lib/tmail/utils.rb +281 -0
- data/lib/tmail/version.rb +38 -0
- data/meta/icli.yaml +16 -0
- data/meta/tmail-1.1.1.roll +24 -0
- data/sample/data/multipart +23 -0
- data/sample/data/normal +29 -0
- data/sample/data/sendtest +5 -0
- data/sample/data/simple +14 -0
- data/sample/data/test +27 -0
- data/sample/extract-attachements.rb +33 -0
- data/sample/from-check.rb +26 -0
- data/sample/multipart.rb +26 -0
- data/sample/parse-bench.rb +68 -0
- data/sample/parse-test.rb +19 -0
- data/sample/sendmail.rb +94 -0
- data/test/extctrl.rb +6 -0
- data/test/fixtures/raw_base64_decoded_string +0 -0
- data/test/fixtures/raw_base64_email +83 -0
- data/test/fixtures/raw_base64_encoded_string +1 -0
- data/test/fixtures/raw_email +14 -0
- data/test/fixtures/raw_email10 +20 -0
- data/test/fixtures/raw_email11 +34 -0
- data/test/fixtures/raw_email12 +32 -0
- data/test/fixtures/raw_email13 +29 -0
- data/test/fixtures/raw_email2 +114 -0
- data/test/fixtures/raw_email3 +70 -0
- data/test/fixtures/raw_email4 +59 -0
- data/test/fixtures/raw_email5 +19 -0
- data/test/fixtures/raw_email6 +20 -0
- data/test/fixtures/raw_email7 +66 -0
- data/test/fixtures/raw_email8 +47 -0
- data/test/fixtures/raw_email9 +28 -0
- data/test/fixtures/raw_email_quoted_with_0d0a +14 -0
- data/test/fixtures/raw_email_simple +11 -0
- data/test/fixtures/raw_email_with_illegal_boundary +58 -0
- data/test/fixtures/raw_email_with_multipart_mixed_quoted_boundary +50 -0
- data/test/fixtures/raw_email_with_nested_attachment +100 -0
- data/test/fixtures/raw_email_with_partially_quoted_subject +14 -0
- data/test/fixtures/raw_email_with_quoted_illegal_boundary +58 -0
- data/test/kcode.rb +14 -0
- data/test/test_address.rb +1128 -0
- data/test/test_attachments.rb +35 -0
- data/test/test_base64.rb +63 -0
- data/test/test_encode.rb +77 -0
- data/test/test_header.rb +885 -0
- data/test/test_helper.rb +2 -0
- data/test/test_mail.rb +623 -0
- data/test/test_mbox.rb +126 -0
- data/test/test_port.rb +430 -0
- data/test/test_scanner.rb +209 -0
- data/test/test_utils.rb +37 -0
- metadata +205 -0
data/test/test_helper.rb
ADDED
data/test/test_mail.rb
ADDED
@@ -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
|