rmail 0.17
Sign up to get free protection for your applications and to get access to all the features.
- data/NEWS +309 -0
- data/NOTES +14 -0
- data/README +83 -0
- data/THANKS +25 -0
- data/TODO +112 -0
- data/guide/Intro.txt +122 -0
- data/guide/MIME.txt +6 -0
- data/guide/TableOfContents.txt +13 -0
- data/install.rb +1023 -0
- data/lib/rmail.rb +50 -0
- data/lib/rmail/address.rb +829 -0
- data/lib/rmail/header.rb +987 -0
- data/lib/rmail/mailbox.rb +62 -0
- data/lib/rmail/mailbox/mboxreader.rb +182 -0
- data/lib/rmail/message.rb +201 -0
- data/lib/rmail/parser.rb +412 -0
- data/lib/rmail/parser/multipart.rb +217 -0
- data/lib/rmail/parser/pushbackreader.rb +173 -0
- data/lib/rmail/serialize.rb +190 -0
- data/lib/rmail/utils.rb +59 -0
- data/rmail.gemspec +17 -0
- data/tests/addrgrammar.txt +113 -0
- data/tests/data/mbox.odd +4 -0
- data/tests/data/mbox.simple +8 -0
- data/tests/data/multipart/data.1 +5 -0
- data/tests/data/multipart/data.10 +1 -0
- data/tests/data/multipart/data.11 +9 -0
- data/tests/data/multipart/data.12 +9 -0
- data/tests/data/multipart/data.13 +3 -0
- data/tests/data/multipart/data.14 +3 -0
- data/tests/data/multipart/data.15 +3 -0
- data/tests/data/multipart/data.16 +3 -0
- data/tests/data/multipart/data.17 +0 -0
- data/tests/data/multipart/data.2 +5 -0
- data/tests/data/multipart/data.3 +2 -0
- data/tests/data/multipart/data.4 +3 -0
- data/tests/data/multipart/data.5 +1 -0
- data/tests/data/multipart/data.6 +2 -0
- data/tests/data/multipart/data.7 +3 -0
- data/tests/data/multipart/data.8 +5 -0
- data/tests/data/multipart/data.9 +4 -0
- data/tests/data/parser.badmime1 +4 -0
- data/tests/data/parser.badmime2 +6 -0
- data/tests/data/parser.nested-multipart +75 -0
- data/tests/data/parser.nested-simple +12 -0
- data/tests/data/parser.nested-simple2 +16 -0
- data/tests/data/parser.nested-simple3 +21 -0
- data/tests/data/parser.rfc822 +65 -0
- data/tests/data/parser.simple-mime +24 -0
- data/tests/data/parser/multipart.1 +8 -0
- data/tests/data/parser/multipart.10 +4 -0
- data/tests/data/parser/multipart.11 +12 -0
- data/tests/data/parser/multipart.12 +12 -0
- data/tests/data/parser/multipart.13 +6 -0
- data/tests/data/parser/multipart.14 +6 -0
- data/tests/data/parser/multipart.15 +6 -0
- data/tests/data/parser/multipart.16 +6 -0
- data/tests/data/parser/multipart.2 +8 -0
- data/tests/data/parser/multipart.3 +5 -0
- data/tests/data/parser/multipart.4 +6 -0
- data/tests/data/parser/multipart.5 +4 -0
- data/tests/data/parser/multipart.6 +5 -0
- data/tests/data/parser/multipart.7 +6 -0
- data/tests/data/parser/multipart.8 +8 -0
- data/tests/data/parser/multipart.9 +7 -0
- data/tests/data/transparency/absolute.1 +5 -0
- data/tests/data/transparency/absolute.2 +1 -0
- data/tests/data/transparency/absolute.3 +2 -0
- data/tests/data/transparency/absolute.4 +3 -0
- data/tests/data/transparency/absolute.5 +4 -0
- data/tests/data/transparency/absolute.6 +49 -0
- data/tests/data/transparency/message.1 +73 -0
- data/tests/data/transparency/message.2 +34 -0
- data/tests/data/transparency/message.3 +63 -0
- data/tests/data/transparency/message.4 +5 -0
- data/tests/data/transparency/message.5 +15 -0
- data/tests/data/transparency/message.6 +1185 -0
- data/tests/runtests.rb +35 -0
- data/tests/testaddress.rb +1192 -0
- data/tests/testbase.rb +207 -0
- data/tests/testheader.rb +1207 -0
- data/tests/testmailbox.rb +47 -0
- data/tests/testmboxreader.rb +161 -0
- data/tests/testmessage.rb +257 -0
- data/tests/testparser.rb +634 -0
- data/tests/testparsermultipart.rb +205 -0
- data/tests/testpushbackreader.rb +40 -0
- data/tests/testserialize.rb +264 -0
- data/tests/testtestbase.rb +112 -0
- data/tests/testtranspparency.rb +105 -0
- metadata +143 -0
@@ -0,0 +1,47 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#--
|
3
|
+
# Copyright (c) 2002 Matt Armstrong. All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
#
|
8
|
+
# 1. Redistributions of source code must retain the above copyright notice,
|
9
|
+
# this list of conditions and the following disclaimer.
|
10
|
+
# 2. Redistributions in binary form must reproduce the above copyright
|
11
|
+
# notice, this list of conditions and the following disclaimer in the
|
12
|
+
# documentation and/or other materials provided with the distribution.
|
13
|
+
# 3. The name of the author may not be used to endorse or promote products
|
14
|
+
# derived from this software without specific prior written permission.
|
15
|
+
#
|
16
|
+
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
17
|
+
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
18
|
+
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
|
19
|
+
# NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
20
|
+
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
21
|
+
# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
22
|
+
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
23
|
+
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
24
|
+
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
25
|
+
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
#
|
27
|
+
|
28
|
+
require 'tests/testbase'
|
29
|
+
require 'rmail/mailbox'
|
30
|
+
|
31
|
+
class TestRMailMailbox < TestBase
|
32
|
+
def test_parse_mbox_simple
|
33
|
+
expected = ["From foo@bar Wed Nov 27 12:27:32 2002\nmessage1\n",
|
34
|
+
"From foo@bar Wed Nov 27 12:27:36 2002\nmessage2\n",
|
35
|
+
"From foo@bar Wed Nov 27 12:27:40 2002\nmessage3\n"]
|
36
|
+
data_as_file("mbox.simple") { |f|
|
37
|
+
assert_equal(expected, RMail::Mailbox::parse_mbox(f))
|
38
|
+
}
|
39
|
+
data_as_file("mbox.simple") { |f|
|
40
|
+
messages = []
|
41
|
+
RMail::Mailbox::parse_mbox(f) { |m|
|
42
|
+
messages << m
|
43
|
+
}
|
44
|
+
assert_equal(expected, messages)
|
45
|
+
}
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,161 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#--
|
3
|
+
# Copyright (c) 2002 Matt Armstrong. All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
#
|
8
|
+
# 1. Redistributions of source code must retain the above copyright notice,
|
9
|
+
# this list of conditions and the following disclaimer.
|
10
|
+
# 2. Redistributions in binary form must reproduce the above copyright
|
11
|
+
# notice, this list of conditions and the following disclaimer in the
|
12
|
+
# documentation and/or other materials provided with the distribution.
|
13
|
+
# 3. The name of the author may not be used to endorse or promote products
|
14
|
+
# derived from this software without specific prior written permission.
|
15
|
+
#
|
16
|
+
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
17
|
+
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
18
|
+
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
|
19
|
+
# NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
20
|
+
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
21
|
+
# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
22
|
+
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
23
|
+
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
24
|
+
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
25
|
+
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
#
|
27
|
+
|
28
|
+
require 'tests/testbase'
|
29
|
+
require 'rmail/mailbox/mboxreader'
|
30
|
+
|
31
|
+
class TextRMailMBoxReader < TestBase
|
32
|
+
|
33
|
+
def test_mbox_s_new
|
34
|
+
r = RMail::Mailbox::MBoxReader.new("")
|
35
|
+
assert_instance_of(RMail::Mailbox::MBoxReader, r)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_mbox_simple
|
39
|
+
data_as_file("mbox.simple") { |f|
|
40
|
+
mbox = RMail::Mailbox::MBoxReader.new(f)
|
41
|
+
|
42
|
+
chunk = mbox.read(nil)
|
43
|
+
assert_equal("From foo@bar Wed Nov 27 12:27:32 2002\nmessage1\n",
|
44
|
+
chunk)
|
45
|
+
chunk = mbox.read(nil)
|
46
|
+
assert_nil(chunk)
|
47
|
+
mbox.next
|
48
|
+
|
49
|
+
chunk = mbox.read(nil)
|
50
|
+
assert_equal("From foo@bar Wed Nov 27 12:27:36 2002\nmessage2\n",
|
51
|
+
chunk)
|
52
|
+
chunk = mbox.read(nil)
|
53
|
+
assert_nil(chunk)
|
54
|
+
mbox.next
|
55
|
+
|
56
|
+
chunk = mbox.read(nil)
|
57
|
+
assert_equal("From foo@bar Wed Nov 27 12:27:40 2002\nmessage3\n",
|
58
|
+
chunk)
|
59
|
+
chunk = mbox.read(nil)
|
60
|
+
assert_nil(chunk)
|
61
|
+
|
62
|
+
mbox.next
|
63
|
+
chunk = mbox.read(nil)
|
64
|
+
assert_nil(chunk)
|
65
|
+
}
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_mbox_odd
|
69
|
+
data_as_file("mbox.odd") { |f|
|
70
|
+
mbox = RMail::Mailbox::MBoxReader.new(f)
|
71
|
+
|
72
|
+
chunk = mbox.read(nil)
|
73
|
+
assert_equal("From foo@bar Wed Nov 27 12:27:36 2002\nmessage1\n",
|
74
|
+
chunk)
|
75
|
+
chunk = mbox.read(nil)
|
76
|
+
assert_nil(chunk)
|
77
|
+
mbox.next
|
78
|
+
|
79
|
+
chunk = mbox.read(nil)
|
80
|
+
assert_equal("From foo@bar Wed Nov 27 12:27:40 2002\nmessage2\n",
|
81
|
+
chunk)
|
82
|
+
chunk = mbox.read(nil)
|
83
|
+
assert_nil(chunk)
|
84
|
+
|
85
|
+
mbox.next
|
86
|
+
chunk = mbox.read(nil)
|
87
|
+
assert_nil(chunk)
|
88
|
+
}
|
89
|
+
end
|
90
|
+
|
91
|
+
def t_chunksize_helper(reader, expected)
|
92
|
+
chunk = reader.read(nil)
|
93
|
+
assert_equal(expected, chunk)
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_mbox_chunksize
|
97
|
+
1.upto(80) { |chunk_size|
|
98
|
+
data_as_file("mbox.simple") { |f|
|
99
|
+
mbox = RMail::Mailbox::MBoxReader.new(f)
|
100
|
+
|
101
|
+
mbox.chunk_size = chunk_size
|
102
|
+
|
103
|
+
t_chunksize_helper(mbox,
|
104
|
+
"From foo@bar Wed Nov 27 12:27:32 2002\nmessage1\n")
|
105
|
+
mbox.next
|
106
|
+
t_chunksize_helper(mbox,
|
107
|
+
"From foo@bar Wed Nov 27 12:27:36 2002\nmessage2\n")
|
108
|
+
mbox.next
|
109
|
+
t_chunksize_helper(mbox,
|
110
|
+
"From foo@bar Wed Nov 27 12:27:40 2002\nmessage3\n")
|
111
|
+
mbox.next
|
112
|
+
|
113
|
+
chunk = mbox.read
|
114
|
+
assert_nil(chunk)
|
115
|
+
}
|
116
|
+
}
|
117
|
+
end
|
118
|
+
|
119
|
+
def t_randomly_randomize(template)
|
120
|
+
count = rand(10)
|
121
|
+
messages = []
|
122
|
+
0.upto(count) { |i|
|
123
|
+
messages << template[0, 5 + rand(template.length - 5)] + "\n"
|
124
|
+
}
|
125
|
+
mbox_string = messages.join("\n")
|
126
|
+
return [ messages, mbox_string ]
|
127
|
+
end
|
128
|
+
|
129
|
+
def t_randomly_parse_messages(reader)
|
130
|
+
messages = []
|
131
|
+
while message = reader.read(nil)
|
132
|
+
messages << message
|
133
|
+
reader.next
|
134
|
+
end
|
135
|
+
return messages
|
136
|
+
end
|
137
|
+
|
138
|
+
def t_randomly_parse_helper(chunk_size, messages, mbox_string)
|
139
|
+
reader = RMail::Mailbox::MBoxReader.new(mbox_string)
|
140
|
+
reader.chunk_size = chunk_size unless chunk_size.nil?
|
141
|
+
|
142
|
+
messages2 = t_randomly_parse_messages(reader)
|
143
|
+
assert_equal(messages, messages2)
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_mbox_randomly
|
147
|
+
5.times {
|
148
|
+
template = ("From foo@bar\n" +
|
149
|
+
"text1\ntext2\ntext3\ntexttexttexttexttext4\n" +
|
150
|
+
(("abcdefghijklmnopqrstuvwxyz" * rand(5)) + "\n") * rand(20))
|
151
|
+
|
152
|
+
messages, mbox_string = t_randomly_randomize(template)
|
153
|
+
|
154
|
+
1.upto(200) { |chunk_size|
|
155
|
+
t_randomly_parse_helper(chunk_size, messages, mbox_string)
|
156
|
+
}
|
157
|
+
t_randomly_parse_helper(nil, messages, mbox_string)
|
158
|
+
}
|
159
|
+
end
|
160
|
+
|
161
|
+
end
|
@@ -0,0 +1,257 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2001, 2002 Matt Armstrong. All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
#
|
8
|
+
# 1. Redistributions of source code must retain the above copyright notice,
|
9
|
+
# this list of conditions and the following disclaimer.
|
10
|
+
# 2. Redistributions in binary form must reproduce the above copyright
|
11
|
+
# notice, this list of conditions and the following disclaimer in the
|
12
|
+
# documentation and/or other materials provided with the distribution.
|
13
|
+
# 3. The name of the author may not be used to endorse or promote products
|
14
|
+
# derived from this software without specific prior written permission.
|
15
|
+
#
|
16
|
+
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
17
|
+
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
18
|
+
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
|
19
|
+
# NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
20
|
+
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
21
|
+
# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
22
|
+
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
23
|
+
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
24
|
+
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
25
|
+
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
#
|
27
|
+
|
28
|
+
require 'rmail/message'
|
29
|
+
require 'tests/testbase'
|
30
|
+
|
31
|
+
class TestRMailMessage < TestBase
|
32
|
+
|
33
|
+
def setup
|
34
|
+
super
|
35
|
+
|
36
|
+
@the_mail_file = File.join(scratch_dir, "mail_file")
|
37
|
+
|
38
|
+
@the_mail = %q{From: somedude@example.com
|
39
|
+
To: someotherdude@example.com
|
40
|
+
Subject: this is some mail
|
41
|
+
|
42
|
+
First body line.
|
43
|
+
|
44
|
+
Second body line.
|
45
|
+
}
|
46
|
+
|
47
|
+
File.open(@the_mail_file, "w") { |file|
|
48
|
+
file.print(@the_mail)
|
49
|
+
}
|
50
|
+
|
51
|
+
# Test reading in a mail file that has a bad header. This makes
|
52
|
+
# sure we consider the message header to be everything up to the
|
53
|
+
# first blank line.
|
54
|
+
@the_mail_file_2 = File.join(scratch_dir, "mail_file_2")
|
55
|
+
@the_mail_2 = %q{From: somedude@example.com
|
56
|
+
To: someotherdude@example.com
|
57
|
+
this is not a valid header
|
58
|
+
Subject: this is some mail
|
59
|
+
|
60
|
+
First body line
|
61
|
+
|
62
|
+
Second body line
|
63
|
+
}
|
64
|
+
File.open(@the_mail_file_2, "w") { |file|
|
65
|
+
file.print(@the_mail_2)
|
66
|
+
}
|
67
|
+
end
|
68
|
+
|
69
|
+
def verify_message_interface(message)
|
70
|
+
assert_not_nil(message)
|
71
|
+
assert_kind_of(RMail::Message, message)
|
72
|
+
assert_not_nil(message.header)
|
73
|
+
assert_kind_of(RMail::Header, message.header)
|
74
|
+
assert_kind_of(Enumerable, message.header,
|
75
|
+
"RMail::Message.body should be an Enumerable")
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_initialize
|
79
|
+
|
80
|
+
# Make sure an empty message actually is empty
|
81
|
+
message = RMail::Message.new
|
82
|
+
verify_message_interface(message)
|
83
|
+
assert_equal(message.header.length, 0)
|
84
|
+
assert_nil(message.body)
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_EQUAL
|
88
|
+
m1 = RMail::Message.new
|
89
|
+
m2 = RMail::Message.new
|
90
|
+
assert(m1 == m2)
|
91
|
+
|
92
|
+
m1.header['To'] = 'bob'
|
93
|
+
assert(m1 != m2)
|
94
|
+
m2.header['To'] = 'bob'
|
95
|
+
assert(m1 == m2)
|
96
|
+
|
97
|
+
m1.preamble = 'the preamble'
|
98
|
+
assert(m1 != m2)
|
99
|
+
m2.preamble = 'the preamble'
|
100
|
+
assert(m1 == m2)
|
101
|
+
|
102
|
+
m1.epilogue = 'the epilogue'
|
103
|
+
assert(m1 != m2)
|
104
|
+
m2.epilogue = 'the epilogue'
|
105
|
+
assert(m1 == m2)
|
106
|
+
|
107
|
+
m1.body = "the body"
|
108
|
+
assert(m1 != m2)
|
109
|
+
m2.body = "the body"
|
110
|
+
assert(m1 == m2)
|
111
|
+
|
112
|
+
m3 = RMail::Message.new
|
113
|
+
m3.add_part(m1)
|
114
|
+
m4 = RMail::Message.new
|
115
|
+
m4.add_part(m2)
|
116
|
+
assert(m3 == m4)
|
117
|
+
|
118
|
+
m1.body = 'the other body'
|
119
|
+
assert(m3 != m4)
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_multipart?
|
123
|
+
message = RMail::Message.new
|
124
|
+
assert_equal(false, message.multipart?)
|
125
|
+
message.add_part("This is a part.")
|
126
|
+
assert_equal(true, message.multipart?)
|
127
|
+
message.add_part("This is another part.")
|
128
|
+
assert_equal(true, message.multipart?)
|
129
|
+
end
|
130
|
+
|
131
|
+
def test_add_part
|
132
|
+
message = RMail::Message.new
|
133
|
+
part_a = Object.new
|
134
|
+
part_b = Object.new
|
135
|
+
message.add_part(part_a)
|
136
|
+
message.add_part(part_b)
|
137
|
+
assert_same(part_a, message.part(0))
|
138
|
+
assert_same(part_b, message.part(1))
|
139
|
+
end
|
140
|
+
|
141
|
+
def test_decode
|
142
|
+
message = RMail::Message.new
|
143
|
+
|
144
|
+
all_bytes = ''
|
145
|
+
0.upto(255) do |i|
|
146
|
+
all_bytes << i
|
147
|
+
end
|
148
|
+
|
149
|
+
# These are base64 encoded strings that hold the data we'd really
|
150
|
+
# like to test. This avoids any problems with editors,
|
151
|
+
# etc. stripping tabs or having screwed fontification, etc.
|
152
|
+
base64_data = "CkFBRUNBd1FGQmdjSUNRb0xEQTBPRHhBUkVoTVVGUllYR0JrYUd4d2RIaDhn\nSVNJakpDVW1KeWdwS2lzc0xTNHZNREV5TXpRMQpOamM0T1RvN1BEMCtQMEJC\nUWtORVJVWkhTRWxLUzB4TlRrOVFVVkpUVkZWV1YxaFpXbHRjWFY1ZllHRmlZ\nMlJsWm1kb2FXcHIKYkcxdWIzQnhjbk4wZFhaM2VIbDZlM3g5Zm4rQWdZS0Ro\nSVdHaDRpSmlvdU1qWTZQa0pHU2s1U1ZscGVZbVpxYm5KMmVuNkNoCm9xT2tw\nYWFucUttcXE2eXRycSt3c2JLenRMVzJ0N2k1dXJ1OHZiNi93TUhDdzhURnhz\nZkl5Y3JMek0zT3o5RFIwdFBVMWRiWAoyTm5hMjl6ZDN0L2c0ZUxqNU9YbTUr\nanA2dXZzN2U3djhQSHk4L1QxOXZmNCtmcjcvUDMrL3c9PQo9MDA9MDE9MDI9\nMDM9MDQ9MDU9MDY9MDc9MDgJPTBBPTBCPTBDPTBEPTBFPTBGPTEwPTExPTEy\nPTEzPTE0PTE1PTE2PTE3PTE4PQo9MTk9MUE9MUI9MUM9MUQ9MUU9MUYgISIj\nJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0zRD4/QEFCQ0RFRkdISUpLTE1O\nT1BRUlM9Cgo=\n".unpack("m*").first
|
153
|
+
qp_data = "PTAwPTAxPTAyPTAzPTA0PTA1PTA2PTA3PTA4CT0wQT0wQj0wQz0wRD0wRT0w\nRj0xMD0xMT0xMj0xMz0xND0xNT0xNj0xNz0xOD0KPTE5PTFBPTFCPTFDPTFE\nPTFFPTFGICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9M0Q+P0BBQkNE\nRUZHSElKS0xNTk9QUVJTPQpUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5v\ncHFyc3R1dnd4eXp7fH1+PTdGPTgwPTgxPTgyPTgzPTg0PTg1PTg2PTg3PTg4\nPQo9ODk9OEE9OEI9OEM9OEQ9OEU9OEY9OTA9OTE9OTI9OTM9OTQ9OTU9OTY9\nOTc9OTg9OTk9OUE9OUI9OUM9OUQ9OUU9OUY9QTA9QTE9Cj1BMj1BMz1BND1B\nNT1BNj1BNz1BOD1BOT1BQT1BQj1BQz1BRD1BRT1BRj1CMD1CMT1CMj1CMz1C\nND1CNT1CNj1CNz1COD1COT1CQT0KPUJCPUJDPUJEPUJFPUJGPUMwPUMxPUMy\nPUMzPUM0PUM1PUM2PUM3PUM4PUM5PUNBPUNCPUNDPUNEPUNFPUNGPUQwPUQx\nPUQyPUQzPQo9RDQ9RDU9RDY9RDc9RDg9RDk9REE9REI9REM9REQ9REU9REY9\nRTA9RTE9RTI9RTM9RTQ9RTU9RTY9RTc9RTg9RTk9RUE9RUI9RUM9Cj1FRD1F\nRT1FRj1GMD1GMT1GMj1GMz1GND1GNT1GNj1GNz1GOD1GOT1GQT1GQj1GQz1G\nRD1GRT1GRg==\n".unpack("m*").first
|
154
|
+
|
155
|
+
base64_message = RMail::Message.new
|
156
|
+
base64_message.header['Content-Transfer-Encoding'] = ' base64 '
|
157
|
+
base64_message.body = base64_data
|
158
|
+
message.add_part(base64_message)
|
159
|
+
|
160
|
+
qp_message = RMail::Message.new
|
161
|
+
qp_message.header['Content-Transfer-Encoding'] = ' quoted-printable '
|
162
|
+
qp_message.body = qp_data
|
163
|
+
message.add_part(qp_message)
|
164
|
+
|
165
|
+
e = assert_exception(TypeError) {
|
166
|
+
message.decode
|
167
|
+
}
|
168
|
+
assert_equal('Can not decode a multipart message.', e.message)
|
169
|
+
|
170
|
+
assert_equal(base64_message, message.part(0))
|
171
|
+
assert_equal(qp_message, message.part(1))
|
172
|
+
|
173
|
+
assert_equal(base64_data, message.part(0).body)
|
174
|
+
assert_equal(qp_data, message.part(1).body)
|
175
|
+
|
176
|
+
assert_equal(all_bytes, message.part(0).decode)
|
177
|
+
assert_equal(all_bytes, message.part(1).decode)
|
178
|
+
end
|
179
|
+
|
180
|
+
def test_part
|
181
|
+
message = RMail::Message.new
|
182
|
+
|
183
|
+
e = assert_exception(TypeError) {
|
184
|
+
message.part(0)
|
185
|
+
}
|
186
|
+
assert_equal('Can not get part on a single part message.', e.message)
|
187
|
+
|
188
|
+
first = RMail::Message.new
|
189
|
+
message.add_part(first)
|
190
|
+
second = RMail::Message.new
|
191
|
+
message.add_part(second)
|
192
|
+
assert_equal(first, message.part(0))
|
193
|
+
assert_equal(second, message.part(1))
|
194
|
+
end
|
195
|
+
|
196
|
+
def test_preamble
|
197
|
+
m = RMail::Message.new
|
198
|
+
assert_nil(m.preamble)
|
199
|
+
m.preamble = "hello bob"
|
200
|
+
assert_equal("hello bob", m.preamble)
|
201
|
+
m.preamble = "hello bob\n"
|
202
|
+
assert_equal("hello bob\n", m.preamble)
|
203
|
+
end
|
204
|
+
|
205
|
+
def test_epilogue
|
206
|
+
m = RMail::Message.new
|
207
|
+
assert_nil(m.epilogue)
|
208
|
+
m.epilogue = "hello bob"
|
209
|
+
assert_equal("hello bob", m.epilogue)
|
210
|
+
m.epilogue = "hello bob\n"
|
211
|
+
assert_equal("hello bob\n", m.epilogue)
|
212
|
+
end
|
213
|
+
|
214
|
+
def test_to_s
|
215
|
+
begin
|
216
|
+
m = RMail::Message.new
|
217
|
+
m.header['To'] = 'bob@example.net'
|
218
|
+
m.header['From'] = 'sam@example.com'
|
219
|
+
m.header['Subject'] = 'hi bob'
|
220
|
+
m.body = "Just wanted to say Hi!\n"
|
221
|
+
|
222
|
+
desired =
|
223
|
+
%q{To: bob@example.net
|
224
|
+
From: sam@example.com
|
225
|
+
Subject: hi bob
|
226
|
+
|
227
|
+
Just wanted to say Hi!
|
228
|
+
}
|
229
|
+
assert_equal(desired, m.to_s)
|
230
|
+
end
|
231
|
+
|
232
|
+
begin
|
233
|
+
m = RMail::Message.new
|
234
|
+
m.header.set_boundary('=-=-=')
|
235
|
+
part1 = RMail::Message.new
|
236
|
+
part1.body = "part1 body"
|
237
|
+
part2 = RMail::Message.new
|
238
|
+
part2.body = "part2 body"
|
239
|
+
m.add_part(part1)
|
240
|
+
m.add_part(part2)
|
241
|
+
assert_equal(%q{Content-Type: multipart/mixed; boundary="=-=-="
|
242
|
+
MIME-Version: 1.0
|
243
|
+
|
244
|
+
|
245
|
+
--=-=-=
|
246
|
+
|
247
|
+
part1 body
|
248
|
+
--=-=-=
|
249
|
+
|
250
|
+
part2 body
|
251
|
+
--=-=-=--
|
252
|
+
},
|
253
|
+
m.to_s)
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
end
|