mail 2.5.5 → 2.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.rdoc +8 -9
- data/CONTRIBUTING.md +13 -0
- data/Dependencies.txt +0 -1
- data/Gemfile +7 -24
- data/README.md +36 -15
- data/Rakefile +10 -2
- data/VERSION +4 -0
- data/lib/mail.rb +1 -1
- data/lib/mail/body.rb +2 -2
- data/lib/mail/check_delivery_params.rb +10 -47
- data/lib/mail/core_extensions/string.rb +12 -2
- data/lib/mail/elements/address.rb +38 -82
- data/lib/mail/elements/address_list.rb +19 -42
- data/lib/mail/elements/content_disposition_element.rb +3 -7
- data/lib/mail/elements/content_location_element.rb +2 -6
- data/lib/mail/elements/content_transfer_encoding_element.rb +3 -10
- data/lib/mail/elements/content_type_element.rb +4 -8
- data/lib/mail/elements/date_time_element.rb +3 -7
- data/lib/mail/elements/envelope_from_element.rb +3 -11
- data/lib/mail/elements/message_ids_element.rb +1 -6
- data/lib/mail/elements/mime_version_element.rb +3 -7
- data/lib/mail/elements/phrase_list.rb +2 -7
- data/lib/mail/elements/received_element.rb +3 -7
- data/lib/mail/encodings.rb +0 -1
- data/lib/mail/envelope.rb +0 -5
- data/lib/mail/field.rb +53 -17
- data/lib/mail/field_list.rb +18 -18
- data/lib/mail/fields/common/common_address.rb +15 -20
- data/lib/mail/fields/common/common_date.rb +0 -7
- data/lib/mail/fields/common/common_field.rb +1 -1
- data/lib/mail/fields/content_transfer_encoding_field.rb +0 -6
- data/lib/mail/fields/resent_sender_field.rb +1 -1
- data/lib/mail/fields/sender_field.rb +1 -1
- data/lib/mail/fields/unstructured_field.rb +7 -1
- data/lib/mail/header.rb +8 -22
- data/lib/mail/mail.rb +12 -0
- data/lib/mail/matchers/has_sent_mail.rb +34 -1
- data/lib/mail/message.rb +18 -11
- data/lib/mail/multibyte/unicode.rb +1 -1
- data/lib/mail/network/delivery_methods/exim.rb +10 -6
- data/lib/mail/network/delivery_methods/file_delivery.rb +8 -4
- data/lib/mail/network/delivery_methods/sendmail.rb +7 -9
- data/lib/mail/network/delivery_methods/smtp.rb +5 -2
- data/lib/mail/network/delivery_methods/smtp_connection.rb +6 -2
- data/lib/mail/network/delivery_methods/test_mailer.rb +8 -5
- data/lib/mail/network/retriever_methods/imap.rb +18 -13
- data/lib/mail/parsers.rb +26 -0
- data/lib/mail/parsers/address_lists_parser.rb +132 -0
- data/lib/mail/parsers/content_disposition_parser.rb +67 -0
- data/lib/mail/parsers/content_location_parser.rb +35 -0
- data/lib/mail/parsers/content_transfer_encoding_parser.rb +33 -0
- data/lib/mail/parsers/content_type_parser.rb +64 -0
- data/lib/mail/parsers/date_time_parser.rb +36 -0
- data/lib/mail/parsers/envelope_from_parser.rb +45 -0
- data/lib/mail/parsers/message_ids_parser.rb +39 -0
- data/lib/mail/parsers/mime_version_parser.rb +41 -0
- data/lib/mail/parsers/phrase_lists_parser.rb +33 -0
- data/lib/mail/parsers/ragel.rb +17 -0
- data/lib/mail/parsers/ragel/common.rl +184 -0
- data/lib/mail/parsers/ragel/date_time.rl +30 -0
- data/lib/mail/parsers/ragel/parser_info.rb +61 -0
- data/lib/mail/parsers/ragel/ruby.rb +29 -0
- data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb +14864 -0
- data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb.rl +37 -0
- data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb +751 -0
- data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb.rl +37 -0
- data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb +614 -0
- data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb.rl +37 -0
- data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb +447 -0
- data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb.rl +37 -0
- data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb +825 -0
- data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb.rl +37 -0
- data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb +817 -0
- data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb.rl +37 -0
- data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb +2129 -0
- data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb.rl +37 -0
- data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb +1570 -0
- data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb.rl +37 -0
- data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb +440 -0
- data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb.rl +37 -0
- data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb +564 -0
- data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb.rl +37 -0
- data/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl +51 -0
- data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb +5144 -0
- data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb.rl +37 -0
- data/lib/mail/parsers/ragel/ruby/parser.rb.rl.erb +37 -0
- data/lib/mail/parsers/received_parser.rb +47 -0
- data/lib/mail/parts_list.rb +4 -2
- data/lib/mail/patterns.rb +3 -1
- data/lib/mail/utilities.rb +3 -1
- data/lib/mail/version.rb +1 -1
- data/lib/mail/version_specific/ruby_1_8.rb +1 -1
- data/lib/mail/version_specific/ruby_1_9.rb +13 -1
- metadata +55 -51
- data/lib/VERSION +0 -4
- data/lib/load_parsers.rb +0 -35
- data/lib/mail/parsers/address_lists.rb +0 -64
- data/lib/mail/parsers/address_lists.treetop +0 -19
- data/lib/mail/parsers/content_disposition.rb +0 -535
- data/lib/mail/parsers/content_disposition.treetop +0 -46
- data/lib/mail/parsers/content_location.rb +0 -139
- data/lib/mail/parsers/content_location.treetop +0 -20
- data/lib/mail/parsers/content_transfer_encoding.rb +0 -201
- data/lib/mail/parsers/content_transfer_encoding.treetop +0 -18
- data/lib/mail/parsers/content_type.rb +0 -971
- data/lib/mail/parsers/content_type.treetop +0 -68
- data/lib/mail/parsers/date_time.rb +0 -114
- data/lib/mail/parsers/date_time.treetop +0 -11
- data/lib/mail/parsers/envelope_from.rb +0 -194
- data/lib/mail/parsers/envelope_from.treetop +0 -32
- data/lib/mail/parsers/message_ids.rb +0 -45
- data/lib/mail/parsers/message_ids.treetop +0 -15
- data/lib/mail/parsers/mime_version.rb +0 -144
- data/lib/mail/parsers/mime_version.treetop +0 -19
- data/lib/mail/parsers/phrase_lists.rb +0 -45
- data/lib/mail/parsers/phrase_lists.treetop +0 -15
- data/lib/mail/parsers/received.rb +0 -71
- data/lib/mail/parsers/received.treetop +0 -11
- data/lib/mail/parsers/rfc2045.rb +0 -421
- data/lib/mail/parsers/rfc2045.treetop +0 -35
- data/lib/mail/parsers/rfc2822.rb +0 -5397
- data/lib/mail/parsers/rfc2822.treetop +0 -408
- data/lib/mail/parsers/rfc2822_obsolete.rb +0 -3768
- data/lib/mail/parsers/rfc2822_obsolete.treetop +0 -241
- data/lib/tasks/corpus.rake +0 -125
- data/lib/tasks/treetop.rake +0 -10
@@ -6,7 +6,7 @@ module Mail
|
|
6
6
|
|
7
7
|
def parse(val = value)
|
8
8
|
unless val.blank?
|
9
|
-
@
|
9
|
+
@address_list = AddressList.new(encode_if_needed(val))
|
10
10
|
else
|
11
11
|
nil
|
12
12
|
end
|
@@ -20,44 +20,40 @@ module Mail
|
|
20
20
|
Encodings.address_encode(val, charset)
|
21
21
|
end
|
22
22
|
|
23
|
-
# Allows you to iterate through each address object in the
|
23
|
+
# Allows you to iterate through each address object in the address_list
|
24
24
|
def each
|
25
|
-
|
25
|
+
address_list.addresses.each do |address|
|
26
26
|
yield(address)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
30
|
# Returns the address string of all the addresses in the address list
|
31
31
|
def addresses
|
32
|
-
list =
|
32
|
+
list = address_list.addresses.map { |a| a.address }
|
33
33
|
Mail::AddressContainer.new(self, list)
|
34
34
|
end
|
35
35
|
|
36
36
|
# Returns the formatted string of all the addresses in the address list
|
37
37
|
def formatted
|
38
|
-
list =
|
38
|
+
list = address_list.addresses.map { |a| a.format }
|
39
39
|
Mail::AddressContainer.new(self, list)
|
40
40
|
end
|
41
41
|
|
42
42
|
# Returns the display name of all the addresses in the address list
|
43
43
|
def display_names
|
44
|
-
list =
|
44
|
+
list = address_list.addresses.map { |a| a.display_name }
|
45
45
|
Mail::AddressContainer.new(self, list)
|
46
46
|
end
|
47
47
|
|
48
48
|
# Returns the actual address objects in the address list
|
49
49
|
def addrs
|
50
|
-
list =
|
50
|
+
list = address_list.addresses
|
51
51
|
Mail::AddressContainer.new(self, list)
|
52
52
|
end
|
53
53
|
|
54
54
|
# Returns a hash of group name => address strings for the address list
|
55
55
|
def groups
|
56
|
-
|
57
|
-
tree.group_recipients.each do |group|
|
58
|
-
@groups[group.group_name.text_value.to_str] = get_group_addresses(group.group_list)
|
59
|
-
end
|
60
|
-
@groups
|
56
|
+
address_list.addresses_grouped_by_group
|
61
57
|
end
|
62
58
|
|
63
59
|
# Returns the addresses that are part of groups
|
@@ -77,7 +73,7 @@ module Mail
|
|
77
73
|
|
78
74
|
# Returns the name of all the groups in a string
|
79
75
|
def group_names # :nodoc:
|
80
|
-
|
76
|
+
address_list.group_names
|
81
77
|
end
|
82
78
|
|
83
79
|
def default
|
@@ -104,7 +100,7 @@ module Mail
|
|
104
100
|
|
105
101
|
def do_encode(field_name)
|
106
102
|
return '' if value.blank?
|
107
|
-
address_array =
|
103
|
+
address_array = address_list.addresses.reject { |a| encoded_group_addresses.include?(a.encoded) }.compact.map { |a| a.encoded }
|
108
104
|
address_text = address_array.join(", \r\n\s")
|
109
105
|
group_array = groups.map { |k,v| "#{k}: #{v.map { |a| a.encoded }.join(", \r\n\s")};" }
|
110
106
|
group_text = group_array.join(" \r\n\s")
|
@@ -114,7 +110,7 @@ module Mail
|
|
114
110
|
|
115
111
|
def do_decode
|
116
112
|
return nil if value.blank?
|
117
|
-
address_array =
|
113
|
+
address_array = address_list.addresses.reject { |a| decoded_group_addresses.include?(a.decoded) }.map { |a| a.decoded }
|
118
114
|
address_text = address_array.join(", ")
|
119
115
|
group_array = groups.map { |k,v| "#{k}: #{v.map { |a| a.decoded }.join(", ")};" }
|
120
116
|
group_text = group_array.join(" ")
|
@@ -122,15 +118,14 @@ module Mail
|
|
122
118
|
return_array.join(", ")
|
123
119
|
end
|
124
120
|
|
125
|
-
|
126
|
-
|
127
|
-
@tree ||= AddressList.new(value)
|
121
|
+
def address_list # :nodoc:
|
122
|
+
@address_list ||= AddressList.new(value)
|
128
123
|
end
|
129
124
|
|
130
125
|
def get_group_addresses(group_list)
|
131
126
|
if group_list.respond_to?(:addresses)
|
132
|
-
group_list.addresses.map do |
|
133
|
-
Mail::Address.new(
|
127
|
+
group_list.addresses.map do |address|
|
128
|
+
Mail::Address.new(address)
|
134
129
|
end
|
135
130
|
else
|
136
131
|
[]
|
@@ -13,7 +13,6 @@ module Mail
|
|
13
13
|
def parse(val = value)
|
14
14
|
unless val.blank?
|
15
15
|
@element = Mail::DateTimeElement.new(val)
|
16
|
-
@tree = @element.tree
|
17
16
|
else
|
18
17
|
nil
|
19
18
|
end
|
@@ -32,11 +31,5 @@ module Mail
|
|
32
31
|
def element
|
33
32
|
@element ||= Mail::DateTimeElement.new(value)
|
34
33
|
end
|
35
|
-
|
36
|
-
# Returns the syntax tree of the Date
|
37
|
-
def tree
|
38
|
-
@tree ||= element.tree
|
39
|
-
end
|
40
|
-
|
41
34
|
end
|
42
35
|
end
|
@@ -23,12 +23,6 @@ module Mail
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
def tree
|
27
|
-
STDERR.puts("tree is deprecated. Please use encoding to get parse result\n#{caller}")
|
28
|
-
@element ||= Mail::ContentTransferEncodingElement.new(value)
|
29
|
-
@tree ||= @element.tree
|
30
|
-
end
|
31
|
-
|
32
26
|
def element
|
33
27
|
@element ||= Mail::ContentTransferEncodingElement.new(value)
|
34
28
|
end
|
@@ -144,6 +144,7 @@ module Mail
|
|
144
144
|
limit = 78 - prepend
|
145
145
|
limit = limit - 7 - encoding.length if should_encode
|
146
146
|
line = ""
|
147
|
+
first_word = true
|
147
148
|
while !words.empty?
|
148
149
|
break unless word = words.first.dup
|
149
150
|
word.encode!(charset) if charset && word.respond_to?(:encode!)
|
@@ -158,7 +159,12 @@ module Mail
|
|
158
159
|
# Remove the word from the queue ...
|
159
160
|
words.shift
|
160
161
|
# Add word separator
|
161
|
-
|
162
|
+
if first_word
|
163
|
+
first_word = false
|
164
|
+
else
|
165
|
+
line << " " if !should_encode
|
166
|
+
end
|
167
|
+
|
162
168
|
# ... add it in encoded form to the current line
|
163
169
|
line << word
|
164
170
|
end
|
data/lib/mail/header.rb
CHANGED
@@ -48,11 +48,15 @@ module Mail
|
|
48
48
|
# these cases, please make a patch and send it in, or at the least, send
|
49
49
|
# me the example so we can fix it.
|
50
50
|
def initialize(header_text = nil, charset = nil)
|
51
|
-
@errors = []
|
52
51
|
@charset = charset
|
53
52
|
self.raw_source = header_text.to_crlf.lstrip
|
54
53
|
split_header if header_text
|
55
54
|
end
|
55
|
+
|
56
|
+
def initialize_copy(original)
|
57
|
+
super
|
58
|
+
@fields = @fields.dup
|
59
|
+
end
|
56
60
|
|
57
61
|
# The preserved raw source of the header as you passed it in, untouched
|
58
62
|
# for your Regexing glory.
|
@@ -91,7 +95,6 @@ module Mail
|
|
91
95
|
unfolded_fields[0..(self.class.maximum_amount-1)].each do |field|
|
92
96
|
|
93
97
|
field = Field.new(field, nil, charset)
|
94
|
-
field.errors.each { |error| self.errors << error }
|
95
98
|
if limited_field?(field.name) && (selected = select_field_for(field.name)) && selected.any?
|
96
99
|
selected.first.update(field.name, field.value)
|
97
100
|
else
|
@@ -102,7 +105,7 @@ module Mail
|
|
102
105
|
end
|
103
106
|
|
104
107
|
def errors
|
105
|
-
@errors
|
108
|
+
@fields.map(&:errors).flatten(1)
|
106
109
|
end
|
107
110
|
|
108
111
|
# 3.6. Field definitions
|
@@ -177,7 +180,7 @@ module Mail
|
|
177
180
|
if dasherize(fn) == "content-type"
|
178
181
|
# Update charset if specified in Content-Type
|
179
182
|
params = self[:content_type].parameters rescue nil
|
180
|
-
@charset = params && params[:charset]
|
183
|
+
@charset = params[:charset] if params && params[:charset]
|
181
184
|
end
|
182
185
|
end
|
183
186
|
|
@@ -246,27 +249,10 @@ module Mail
|
|
246
249
|
@raw_source = val
|
247
250
|
end
|
248
251
|
|
249
|
-
# 2.2.3. Long Header Fields
|
250
|
-
#
|
251
|
-
# The process of moving from this folded multiple-line representation
|
252
|
-
# of a header field to its single line representation is called
|
253
|
-
# "unfolding". Unfolding is accomplished by simply removing any CRLF
|
254
|
-
# that is immediately followed by WSP. Each header field should be
|
255
|
-
# treated in its unfolded form for further syntactic and semantic
|
256
|
-
# evaluation.
|
257
|
-
def unfold(string)
|
258
|
-
string.gsub(/#{CRLF}#{WSP}+/, ' ').gsub(/#{WSP}+/, ' ')
|
259
|
-
end
|
260
|
-
|
261
|
-
# Returns the header with all the folds removed
|
262
|
-
def unfolded_header
|
263
|
-
@unfolded_header ||= unfold(raw_source)
|
264
|
-
end
|
265
|
-
|
266
252
|
# Splits an unfolded and line break cleaned header into individual field
|
267
253
|
# strings.
|
268
254
|
def split_header
|
269
|
-
self.fields =
|
255
|
+
self.fields = raw_source.split(HEADER_SPLIT)
|
270
256
|
end
|
271
257
|
|
272
258
|
def select_field_for(name)
|
data/lib/mail/mail.rb
CHANGED
@@ -206,6 +206,12 @@ module Mail
|
|
206
206
|
end
|
207
207
|
end
|
208
208
|
|
209
|
+
# Unregister the given observer, allowing mail to resume operations
|
210
|
+
# without it.
|
211
|
+
def self.unregister_observer(observer)
|
212
|
+
@@delivery_notification_observers.delete(observer)
|
213
|
+
end
|
214
|
+
|
209
215
|
# You can register an object to be given every mail object that will be sent,
|
210
216
|
# before it is sent. So if you want to add special headers or modify any
|
211
217
|
# email that gets sent through the Mail library, you can do so.
|
@@ -219,6 +225,12 @@ module Mail
|
|
219
225
|
end
|
220
226
|
end
|
221
227
|
|
228
|
+
# Unregister the given interceptor, allowing mail to resume operations
|
229
|
+
# without it.
|
230
|
+
def self.unregister_interceptor(interceptor)
|
231
|
+
@@delivery_interceptors.delete(interceptor)
|
232
|
+
end
|
233
|
+
|
222
234
|
def self.inform_observers(mail)
|
223
235
|
@@delivery_notification_observers.each do |observer|
|
224
236
|
observer.delivered_email(mail)
|
@@ -29,6 +29,29 @@ module Mail
|
|
29
29
|
self
|
30
30
|
end
|
31
31
|
|
32
|
+
def cc(recipient_or_list)
|
33
|
+
@copy_recipients ||= []
|
34
|
+
|
35
|
+
if recipient_or_list.kind_of?(Array)
|
36
|
+
@copy_recipients += recipient_or_list
|
37
|
+
else
|
38
|
+
@copy_recipients << recipient_or_list
|
39
|
+
end
|
40
|
+
self
|
41
|
+
end
|
42
|
+
|
43
|
+
def bcc(recipient_or_list)
|
44
|
+
@blind_copy_recipients ||= []
|
45
|
+
|
46
|
+
if recipient_or_list.kind_of?(Array)
|
47
|
+
@blind_copy_recipients += recipient_or_list
|
48
|
+
else
|
49
|
+
@blind_copy_recipients << recipient_or_list
|
50
|
+
end
|
51
|
+
self
|
52
|
+
end
|
53
|
+
|
54
|
+
|
32
55
|
def with_subject(subject)
|
33
56
|
@subject = subject
|
34
57
|
self
|
@@ -73,7 +96,7 @@ module Mail
|
|
73
96
|
def filter_matched_deliveries(deliveries)
|
74
97
|
candidate_deliveries = deliveries
|
75
98
|
|
76
|
-
%w(sender recipients subject subject_matcher body body_matcher).each do |modifier_name|
|
99
|
+
%w(sender recipients copy_recipients blind_copy_recipients subject subject_matcher body body_matcher).each do |modifier_name|
|
77
100
|
next unless instance_variable_defined?("@#{modifier_name}")
|
78
101
|
candidate_deliveries = candidate_deliveries.select{|matching_delivery| self.send("matches_on_#{modifier_name}?", matching_delivery)}
|
79
102
|
end
|
@@ -89,6 +112,14 @@ module Mail
|
|
89
112
|
@recipients.all? {|recipient| delivery.to.include?(recipient) }
|
90
113
|
end
|
91
114
|
|
115
|
+
def matches_on_copy_recipients?(delivery)
|
116
|
+
@copy_recipients.all? {|recipient| delivery.cc.include?(recipient) }
|
117
|
+
end
|
118
|
+
|
119
|
+
def matches_on_blind_copy_recipients?(delivery)
|
120
|
+
@blind_copy_recipients.all? {|recipient| delivery.bcc.include?(recipient) }
|
121
|
+
end
|
122
|
+
|
92
123
|
def matches_on_subject?(delivery)
|
93
124
|
delivery.subject == @subject
|
94
125
|
end
|
@@ -109,6 +140,8 @@ module Mail
|
|
109
140
|
result = ''
|
110
141
|
result += "from #{@sender} " if instance_variable_defined?('@sender')
|
111
142
|
result += "to #{@recipients.inspect} " if instance_variable_defined?('@recipients')
|
143
|
+
result += "cc #{@copy_recipients.inspect} " if instance_variable_defined?('@copy_recipients')
|
144
|
+
result += "bcc #{@blind_copy_recipients.inspect} " if instance_variable_defined?('@blind_copy_recipients')
|
112
145
|
result += "with subject \"#{@subject}\" " if instance_variable_defined?('@subject')
|
113
146
|
result += "with subject matching \"#{@subject_matcher}\" " if instance_variable_defined?('@subject_matcher')
|
114
147
|
result += "with body \"#{@body}\" " if instance_variable_defined?('@body')
|
data/lib/mail/message.rb
CHANGED
@@ -240,7 +240,7 @@ module Mail
|
|
240
240
|
# This method bypasses checking perform_deliveries and raise_delivery_errors,
|
241
241
|
# so use with caution.
|
242
242
|
#
|
243
|
-
# It still however fires off the
|
243
|
+
# It still however fires off the interceptors and calls the observers callbacks if they are defined.
|
244
244
|
#
|
245
245
|
# Returns self
|
246
246
|
def deliver!
|
@@ -353,17 +353,23 @@ module Mail
|
|
353
353
|
return false unless other.respond_to?(:encoded)
|
354
354
|
|
355
355
|
if self.message_id && other.message_id
|
356
|
-
|
356
|
+
self.encoded == other.encoded
|
357
357
|
else
|
358
358
|
self_message_id, other_message_id = self.message_id, other.message_id
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
359
|
+
begin
|
360
|
+
self.message_id, other.message_id = '<temp@test>', '<temp@test>'
|
361
|
+
self.encoded == other.encoded
|
362
|
+
ensure
|
363
|
+
self.message_id, other.message_id = self_message_id, other_message_id
|
364
|
+
end
|
364
365
|
end
|
365
366
|
end
|
366
367
|
|
368
|
+
def initialize_copy(original)
|
369
|
+
super
|
370
|
+
@header = @header.dup
|
371
|
+
end
|
372
|
+
|
367
373
|
# Provides access to the raw source of the message as it was when it
|
368
374
|
# was instantiated. This is set at initialization and so is untouched
|
369
375
|
# by the parsers or decoder / encoders
|
@@ -1388,7 +1394,7 @@ module Mail
|
|
1388
1394
|
header.has_date?
|
1389
1395
|
end
|
1390
1396
|
|
1391
|
-
# Returns true if the message has a
|
1397
|
+
# Returns true if the message has a Mime-Version field, the field may or may
|
1392
1398
|
# not have a value, but the field exists or not.
|
1393
1399
|
def has_mime_version?
|
1394
1400
|
header.has_mime_version?
|
@@ -1594,7 +1600,7 @@ module Mail
|
|
1594
1600
|
end
|
1595
1601
|
|
1596
1602
|
# Returns an AttachmentsList object, which holds all of the attachments in
|
1597
|
-
# the receiver object (either the
|
1603
|
+
# the receiver object (either the entire email or a part within) and all
|
1598
1604
|
# of its descendants.
|
1599
1605
|
#
|
1600
1606
|
# It also allows you to add attachments to the mail object directly, like so:
|
@@ -1974,8 +1980,9 @@ module Mail
|
|
1974
1980
|
end
|
1975
1981
|
|
1976
1982
|
def raw_source=(value)
|
1977
|
-
value.force_encoding("binary") if RUBY_VERSION >= "1.9.1"
|
1978
1983
|
@raw_source = value.to_crlf
|
1984
|
+
@raw_source.force_encoding("binary") if RUBY_VERSION >= "1.9.1"
|
1985
|
+
@raw_source
|
1979
1986
|
end
|
1980
1987
|
|
1981
1988
|
# see comments to body=. We take data and process it lazily
|
@@ -2128,7 +2135,7 @@ module Mail
|
|
2128
2135
|
if perform_deliveries
|
2129
2136
|
delivery_method.deliver!(self)
|
2130
2137
|
end
|
2131
|
-
rescue
|
2138
|
+
rescue => e # Net::SMTP errors or sendmail pipe errors
|
2132
2139
|
raise e if raise_delivery_errors
|
2133
2140
|
end
|
2134
2141
|
end
|
@@ -341,7 +341,7 @@ module Mail
|
|
341
341
|
def load
|
342
342
|
begin
|
343
343
|
@codepoints, @composition_exclusion, @composition_map, @boundary, @cp1252 = File.open(self.class.filename, 'rb') { |f| Marshal.load f.read }
|
344
|
-
rescue
|
344
|
+
rescue => e
|
345
345
|
raise IOError.new("Couldn't load the Unicode tables for UTF8Handler (#{e.message}), Mail::Multibyte is unusable")
|
346
346
|
end
|
347
347
|
|
@@ -36,13 +36,17 @@ module Mail
|
|
36
36
|
#
|
37
37
|
# mail.deliver!
|
38
38
|
class Exim < Sendmail
|
39
|
-
|
40
|
-
:location
|
41
|
-
|
42
|
-
|
39
|
+
def initialize(values)
|
40
|
+
self.settings = { :location => '/usr/sbin/exim',
|
41
|
+
:arguments => '-i -t' }.merge(values)
|
42
|
+
end
|
43
43
|
|
44
|
-
def self.call(path, arguments, destinations,
|
45
|
-
|
44
|
+
def self.call(path, arguments, destinations, mail)
|
45
|
+
popen "#{path} #{arguments}" do |io|
|
46
|
+
io.puts mail.encoded.to_lf
|
47
|
+
io.flush
|
48
|
+
end
|
46
49
|
end
|
50
|
+
|
47
51
|
end
|
48
52
|
end
|