mail 2.1.3 → 2.1.5
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of mail might be problematic. Click here for more details.
- data/CHANGELOG.rdoc +37 -0
- data/README.rdoc +1 -1
- data/Rakefile +2 -3
- data/TODO.rdoc +2 -12
- data/lib/mail.rb +7 -4
- data/lib/mail/attachments_list.rb +28 -10
- data/lib/mail/body.rb +44 -15
- data/lib/mail/core_extensions/string.rb +4 -0
- data/lib/mail/elements/content_transfer_encoding_element.rb +4 -1
- data/lib/mail/encodings/7bit.rb +29 -0
- data/lib/mail/encodings/8bit.rb +29 -0
- data/lib/mail/encodings/base64.rb +18 -5
- data/lib/mail/encodings/binary.rb +29 -0
- data/lib/mail/encodings/encodings.rb +22 -6
- data/lib/mail/encodings/quoted_printable.rb +27 -4
- data/lib/mail/encodings/transfer_encoding.rb +58 -0
- data/lib/mail/field.rb +4 -2
- data/lib/mail/fields/common/parameter_hash.rb +12 -3
- data/lib/mail/fields/content_disposition_field.rb +12 -2
- data/lib/mail/fields/content_location_field.rb +2 -2
- data/lib/mail/fields/content_transfer_encoding_field.rb +5 -3
- data/lib/mail/fields/content_type_field.rb +14 -4
- data/lib/mail/fields/mime_version_field.rb +2 -2
- data/lib/mail/fields/received_field.rb +8 -4
- data/lib/mail/fields/structured_field.rb +4 -0
- data/lib/mail/fields/unstructured_field.rb +5 -0
- data/lib/mail/header.rb +13 -6
- data/lib/mail/mail.rb +1 -1
- data/lib/mail/message.rb +100 -28
- data/lib/mail/network/delivery_methods/smtp.rb +1 -1
- data/lib/mail/parsers/address_lists.rb +4 -1
- data/lib/mail/parsers/content_disposition.rb +24 -6
- data/lib/mail/parsers/content_location.rb +8 -2
- data/lib/mail/parsers/content_transfer_encoding.rb +73 -83
- data/lib/mail/parsers/content_transfer_encoding.treetop +5 -10
- data/lib/mail/parsers/content_type.rb +36 -9
- data/lib/mail/parsers/date_time.rb +4 -1
- data/lib/mail/parsers/envelope_from.rb +8 -2
- data/lib/mail/parsers/message_ids.rb +4 -1
- data/lib/mail/parsers/mime_version.rb +4 -1
- data/lib/mail/parsers/phrase_lists.rb +4 -1
- data/lib/mail/parsers/received.rb +4 -1
- data/lib/mail/parsers/rfc2045.rb +75 -17
- data/lib/mail/parsers/rfc2045.treetop +2 -1
- data/lib/mail/parsers/rfc2822.rb +316 -79
- data/lib/mail/parsers/rfc2822_obsolete.rb +200 -50
- data/lib/mail/part.rb +21 -6
- data/lib/mail/patterns.rb +3 -3
- data/lib/mail/utilities.rb +4 -4
- data/lib/mail/vendor/treetop-1.4.3/Or +0 -0
- data/lib/mail/vendor/treetop-1.4.3/Rakefile +11 -6
- data/lib/mail/vendor/treetop-1.4.3/Treetop.tmbundle/Preferences/Comments.tmPreferences +22 -0
- data/lib/mail/vendor/treetop-1.4.3/Treetop.tmbundle/Syntaxes/Treetop Grammar.tmLanguage +28 -1
- data/lib/mail/vendor/treetop-1.4.3/bin/tt +5 -5
- data/lib/mail/vendor/treetop-1.4.3/lib/treetop.rb +3 -19
- data/lib/mail/vendor/treetop-1.4.3/lib/treetop/bootstrap_gen_1_metagrammar.rb +4 -7
- data/lib/mail/vendor/treetop-1.4.3/lib/treetop/compiler.rb +7 -6
- data/lib/mail/vendor/treetop-1.4.3/lib/treetop/compiler/metagrammar.rb +1 -1
- data/lib/mail/vendor/treetop-1.4.3/lib/treetop/compiler/node_classes.rb +19 -20
- data/lib/mail/vendor/treetop-1.4.3/lib/treetop/polyglot.rb +9 -0
- data/lib/mail/vendor/treetop-1.4.3/lib/treetop/ruby_extensions.rb +1 -2
- data/lib/mail/vendor/treetop-1.4.3/lib/treetop/runtime.rb +6 -5
- data/lib/mail/vendor/treetop-1.4.3/lib/treetop/runtime/interval_skip_list.rb +3 -4
- data/lib/mail/vendor/treetop-1.4.3/lib/treetop/runtime/syntax_node.rb +7 -7
- data/lib/mail/vendor/treetop-1.4.3/lib/treetop/version.rb +1 -1
- data/lib/mail/vendor/treetop-1.4.3/script/generate_metagrammar.rb +3 -4
- data/lib/mail/vendor/treetop-1.4.3/spec/compiler/and_predicate_spec.rb +2 -2
- data/lib/mail/vendor/treetop-1.4.3/spec/compiler/anything_symbol_spec.rb +2 -2
- data/lib/mail/vendor/treetop-1.4.3/spec/compiler/character_class_spec.rb +1 -1
- data/lib/mail/vendor/treetop-1.4.3/spec/compiler/choice_spec.rb +2 -2
- data/lib/mail/vendor/treetop-1.4.3/spec/compiler/circular_compilation_spec.rb +3 -1
- data/lib/mail/vendor/treetop-1.4.3/spec/compiler/failure_propagation_functional_spec.rb +2 -2
- data/lib/mail/vendor/treetop-1.4.3/spec/compiler/grammar_compiler_spec.rb +1 -1
- data/lib/mail/vendor/treetop-1.4.3/spec/compiler/grammar_spec.rb +1 -1
- data/lib/mail/vendor/treetop-1.4.3/spec/compiler/multibyte_chars_spec.rb +1 -9
- data/lib/mail/vendor/treetop-1.4.3/spec/compiler/nonterminal_symbol_spec.rb +2 -2
- data/lib/mail/vendor/treetop-1.4.3/spec/compiler/not_predicate_spec.rb +2 -2
- data/lib/mail/vendor/treetop-1.4.3/spec/compiler/one_or_more_spec.rb +2 -2
- data/lib/mail/vendor/treetop-1.4.3/spec/compiler/optional_spec.rb +1 -1
- data/lib/mail/vendor/treetop-1.4.3/spec/compiler/parenthesized_expression_spec.rb +1 -1
- data/lib/mail/vendor/treetop-1.4.3/spec/compiler/parsing_rule_spec.rb +1 -1
- data/lib/mail/vendor/treetop-1.4.3/spec/compiler/repeated_subrule_spec.rb +1 -1
- data/lib/mail/vendor/treetop-1.4.3/spec/compiler/semantic_predicate_spec.rb +1 -1
- data/lib/mail/vendor/treetop-1.4.3/spec/compiler/sequence_spec.rb +1 -1
- data/lib/mail/vendor/treetop-1.4.3/spec/compiler/terminal_spec.rb +1 -1
- data/lib/mail/vendor/treetop-1.4.3/spec/compiler/terminal_symbol_spec.rb +1 -1
- data/lib/mail/vendor/treetop-1.4.3/spec/compiler/tt_compiler_spec.rb +1 -1
- data/lib/mail/vendor/treetop-1.4.3/spec/compiler/zero_or_more_spec.rb +1 -1
- data/lib/mail/vendor/treetop-1.4.3/spec/composition/grammar_composition_spec.rb +1 -1
- data/lib/mail/vendor/treetop-1.4.3/spec/ruby_extensions/string_spec.rb +1 -1
- data/lib/mail/vendor/treetop-1.4.3/spec/runtime/compiled_parser_spec.rb +1 -1
- data/lib/mail/vendor/treetop-1.4.3/spec/runtime/interval_skip_list/delete_spec.rb +2 -2
- data/lib/mail/vendor/treetop-1.4.3/spec/runtime/interval_skip_list/expire_range_spec.rb +2 -2
- data/lib/mail/vendor/treetop-1.4.3/spec/runtime/interval_skip_list/insert_spec.rb +1 -1
- data/lib/mail/vendor/treetop-1.4.3/spec/runtime/interval_skip_list/interval_skip_list_spec.rb +2 -2
- data/lib/mail/vendor/treetop-1.4.3/spec/runtime/interval_skip_list/palindromic_fixture_spec.rb +2 -3
- data/lib/mail/vendor/treetop-1.4.3/spec/runtime/interval_skip_list/spec_helper.rb +2 -2
- data/lib/mail/vendor/treetop-1.4.3/spec/runtime/syntax_node_spec.rb +1 -1
- data/lib/mail/vendor/treetop-1.4.3/spec/spec_helper.rb +4 -5
- data/lib/mail/vendor/treetop-1.4.3/treetop.gemspec +2 -2
- data/lib/mail/version.rb +1 -1
- data/lib/mail/version_specific/ruby_1_8.rb +1 -3
- data/lib/mail/version_specific/ruby_1_9.rb +1 -2
- data/lib/tasks/treetop.rake +1 -1
- metadata +33 -14
- data/lib/mail/vendor/treetop-1.4.3/spec/spec_suite.rb +0 -4
@@ -7,15 +7,25 @@ module Mail
|
|
7
7
|
module Encodings
|
8
8
|
|
9
9
|
include Mail::Patterns
|
10
|
-
|
10
|
+
|
11
|
+
@transfer_encodings = {}
|
12
|
+
|
13
|
+
# Register transfer encoding
|
14
|
+
#
|
15
|
+
# Example
|
16
|
+
#
|
17
|
+
# Encodings.register "base64", Mail::Encodings::Base64
|
18
|
+
def Encodings.register(name, cls)
|
19
|
+
@transfer_encodings[get_name(name)] = cls
|
20
|
+
end
|
21
|
+
|
11
22
|
# Is the encoding we want defined?
|
12
23
|
#
|
13
24
|
# Example:
|
14
25
|
#
|
15
26
|
# Encodings.defined?(:base64) #=> true
|
16
27
|
def Encodings.defined?( str )
|
17
|
-
|
18
|
-
RubyVer.has_constant?(Mail::Encodings, string)
|
28
|
+
@transfer_encodings.include? get_name(str)
|
19
29
|
end
|
20
30
|
|
21
31
|
# Gets a defined encoding type, QuotedPrintable or Base64 for now.
|
@@ -27,8 +37,15 @@ module Mail
|
|
27
37
|
#
|
28
38
|
# Encodings.get_encoding(:base64) #=> Mail::Encodings::Base64
|
29
39
|
def Encodings.get_encoding( str )
|
30
|
-
|
31
|
-
|
40
|
+
@transfer_encodings[get_name(str)]
|
41
|
+
end
|
42
|
+
|
43
|
+
def Encodings.get_all
|
44
|
+
@transfer_encodings.values
|
45
|
+
end
|
46
|
+
|
47
|
+
def Encodings.get_name(enc)
|
48
|
+
enc = enc.to_s.gsub("-", "_").downcase
|
32
49
|
end
|
33
50
|
|
34
51
|
# Encodes a parameter value using URI Escaping, note the language field 'en' can
|
@@ -196,6 +213,5 @@ module Mail
|
|
196
213
|
def Encodings.find_encoding(str)
|
197
214
|
RUBY_VERSION >= '1.9' ? str.encoding : $KCODE
|
198
215
|
end
|
199
|
-
|
200
216
|
end
|
201
217
|
end
|
@@ -1,18 +1,39 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module Mail
|
3
3
|
module Encodings
|
4
|
-
class QuotedPrintable
|
5
|
-
|
4
|
+
class QuotedPrintable < SevenBit
|
5
|
+
NAME='quoted-printable'
|
6
|
+
|
7
|
+
PRIORITY = 2
|
8
|
+
|
9
|
+
def self.can_encode?(str)
|
10
|
+
EightBit.can_encode? str
|
11
|
+
end
|
12
|
+
|
6
13
|
# Decode the string from Quoted-Printable
|
7
14
|
def self.decode(str)
|
8
15
|
str.unpack("M*").first
|
9
16
|
end
|
10
17
|
|
11
18
|
def self.encode(str)
|
12
|
-
|
19
|
+
l = []
|
20
|
+
str.each_line{|line| l << qp_encode_line(line)}
|
21
|
+
l.join("\r\n")
|
13
22
|
end
|
14
23
|
|
24
|
+
def self.cost(str)
|
25
|
+
# These bytes probably do not need encoding
|
26
|
+
c = str.count("\x9\xA\xD\x20-\x3C\x3E-\x7E")
|
27
|
+
# Everything else turns into =XX where XX is a
|
28
|
+
# two digit hex number (taking 3 bytes)
|
29
|
+
total = (str.bytesize - c)*3 + c
|
30
|
+
total.to_f/str.bytesize
|
31
|
+
end
|
32
|
+
|
15
33
|
private
|
34
|
+
def self.qp_encode_line(str)
|
35
|
+
str.chomp.gsub( /[^a-z ]/i ) { quoted_printable_encode($&) }
|
36
|
+
end
|
16
37
|
|
17
38
|
# Convert the given character to quoted printable format, taking into
|
18
39
|
# account multi-byte characters (if executing with $KCODE="u", for instance)
|
@@ -21,6 +42,8 @@ module Mail
|
|
21
42
|
character.each_byte { |b| result << "=%02X" % b }
|
22
43
|
result
|
23
44
|
end
|
45
|
+
|
46
|
+
Encodings.register(NAME, self)
|
24
47
|
end
|
25
48
|
end
|
26
|
-
end
|
49
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mail
|
3
|
+
module Encodings
|
4
|
+
class TransferEncoding
|
5
|
+
NAME = ''
|
6
|
+
|
7
|
+
PRIORITY = -1
|
8
|
+
|
9
|
+
def self.can_transport?(enc)
|
10
|
+
enc = Encodings.get_name(enc)
|
11
|
+
if Encodings.defined? enc
|
12
|
+
Encodings.get_encoding(enc).new.is_a? self
|
13
|
+
else
|
14
|
+
false
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.can_encode?(enc)
|
19
|
+
can_transport? enc
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.cost(str)
|
23
|
+
raise "Unimplemented"
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.to_s
|
27
|
+
self::NAME
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.get_best_compatible(source_encoding, str)
|
31
|
+
if self.can_transport? source_encoding then
|
32
|
+
source_encoding
|
33
|
+
else
|
34
|
+
choices = []
|
35
|
+
Encodings.get_all.each do |enc|
|
36
|
+
choices << enc if self.can_transport? enc and enc.can_encode? source_encoding
|
37
|
+
end
|
38
|
+
best = nil
|
39
|
+
best_cost = 100
|
40
|
+
choices.each do |enc|
|
41
|
+
this_cost = enc.cost str
|
42
|
+
if this_cost < best_cost then
|
43
|
+
best_cost = this_cost
|
44
|
+
best = enc
|
45
|
+
elsif this_cost == best_cost then
|
46
|
+
best = enc if enc::PRIORITY < best::PRIORITY
|
47
|
+
end
|
48
|
+
end
|
49
|
+
best
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def to_s
|
54
|
+
self.class.to_s
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/lib/mail/field.rb
CHANGED
@@ -141,15 +141,17 @@ module Mail
|
|
141
141
|
def create_field(name, value)
|
142
142
|
begin
|
143
143
|
self.field = new_field(name, value)
|
144
|
-
rescue
|
144
|
+
rescue => e
|
145
145
|
self.field = Mail::UnstructuredField.new(name, value)
|
146
|
+
self.field.errors << [name, value, e]
|
147
|
+
self.field
|
146
148
|
end
|
147
149
|
end
|
148
150
|
|
149
151
|
def new_field(name, value)
|
150
152
|
# Could do this with constantize and make it "as DRY as", but a simple case
|
151
153
|
# statement is, well, simpler...
|
152
|
-
case name.to_s
|
154
|
+
case name.to_s.downcase
|
153
155
|
when /^to$/i
|
154
156
|
ToField.new(name, value)
|
155
157
|
when /^cc$/i
|
@@ -2,12 +2,16 @@
|
|
2
2
|
module Mail
|
3
3
|
|
4
4
|
# ParameterHash is an intelligent Hash that allows you to add
|
5
|
-
# parameter values including the
|
5
|
+
# parameter values including the MIME extension paramaters that
|
6
6
|
# have the name*0="blah", name*1="bleh" keys, and will just return
|
7
7
|
# a single key called name="blahbleh" and do any required un-encoding
|
8
8
|
# to make that happen
|
9
|
+
# Parameters are defined in RFC2045, split keys are in RFC2231
|
10
|
+
|
9
11
|
class ParameterHash < HashWithIndifferentAccess
|
10
12
|
|
13
|
+
include Mail::Utilities
|
14
|
+
|
11
15
|
def [](key_name)
|
12
16
|
pairs = select { |k,v| k =~ /^#{key_name}\*/ }
|
13
17
|
pairs = pairs.to_a if RUBY_VERSION >= '1.9'
|
@@ -31,9 +35,14 @@ module Mail
|
|
31
35
|
value = Mail::Encodings.param_encode(value)
|
32
36
|
key_name = "#{key_name}*"
|
33
37
|
end
|
34
|
-
%Q{#{key_name}
|
38
|
+
%Q{#{key_name}=#{quote_token(value)}}
|
35
39
|
end.join(";\r\n\t")
|
36
40
|
end
|
37
41
|
|
42
|
+
def decoded
|
43
|
+
map.sort { |a,b| a.first <=> b.first }.map do |key_name, value|
|
44
|
+
%Q{#{key_name}=#{quote_token(value)}}
|
45
|
+
end.join("; ")
|
46
|
+
end
|
38
47
|
end
|
39
|
-
end
|
48
|
+
end
|
@@ -49,11 +49,21 @@ module Mail
|
|
49
49
|
|
50
50
|
# TODO: Fix this up
|
51
51
|
def encoded
|
52
|
-
|
52
|
+
if parameters.length > 0
|
53
|
+
p = ";\r\n\t#{parameters.encoded}\r\n"
|
54
|
+
else
|
55
|
+
p = ""
|
56
|
+
end
|
57
|
+
"#{CAPITALIZED_FIELD}: #{disposition_type}" + p
|
53
58
|
end
|
54
59
|
|
55
60
|
def decoded
|
56
|
-
|
61
|
+
if parameters.length > 0
|
62
|
+
p = "; #{parameters.decoded}"
|
63
|
+
else
|
64
|
+
p = ""
|
65
|
+
end
|
66
|
+
"#{disposition_type}" + p
|
57
67
|
end
|
58
68
|
|
59
69
|
end
|
@@ -10,16 +10,18 @@ module Mail
|
|
10
10
|
|
11
11
|
def initialize(*args)
|
12
12
|
super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, args.last.to_s.downcase))
|
13
|
+
parse(value)
|
14
|
+
self
|
13
15
|
end
|
14
16
|
|
15
17
|
def parse(val = value)
|
16
18
|
unless val.blank?
|
17
19
|
@element = Mail::ContentTransferEncodingElement.new(val)
|
18
|
-
@tree = @element.tree
|
19
20
|
end
|
20
21
|
end
|
21
22
|
|
22
23
|
def tree
|
24
|
+
STDERR.puts("tree is deprecated. Please use encoding to get parse result\n#{caller}")
|
23
25
|
@element ||= Mail::ContentTransferEncodingElement.new(value)
|
24
26
|
@tree ||= @element.tree
|
25
27
|
end
|
@@ -34,11 +36,11 @@ module Mail
|
|
34
36
|
|
35
37
|
# TODO: Fix this up
|
36
38
|
def encoded
|
37
|
-
"#{CAPITALIZED_FIELD}: #{
|
39
|
+
"#{CAPITALIZED_FIELD}: #{encoding}\r\n"
|
38
40
|
end
|
39
41
|
|
40
42
|
def decoded
|
41
|
-
|
43
|
+
encoding
|
42
44
|
end
|
43
45
|
|
44
46
|
end
|
@@ -44,7 +44,7 @@ module Mail
|
|
44
44
|
# Sanitize the value, handle special cases
|
45
45
|
@element ||= Mail::ContentTypeElement.new(sanatize(value))
|
46
46
|
rescue
|
47
|
-
# All else fails, just get the
|
47
|
+
# All else fails, just get the MIME media type
|
48
48
|
@element ||= Mail::ContentTypeElement.new(get_mime_type(value))
|
49
49
|
end
|
50
50
|
|
@@ -108,11 +108,21 @@ module Mail
|
|
108
108
|
|
109
109
|
# TODO: Fix this up
|
110
110
|
def encoded
|
111
|
-
|
111
|
+
if parameters.length > 0
|
112
|
+
p = ";\r\n\t#{parameters.encoded}\r\n"
|
113
|
+
else
|
114
|
+
p = ""
|
115
|
+
end
|
116
|
+
"#{CAPITALIZED_FIELD}: #{content_type}" + p
|
112
117
|
end
|
113
118
|
|
114
119
|
def decoded
|
115
|
-
|
120
|
+
if parameters.length > 0
|
121
|
+
p = "; #{parameters.decoded}"
|
122
|
+
else
|
123
|
+
p = ""
|
124
|
+
end
|
125
|
+
"#{content_type}" + p
|
116
126
|
end
|
117
127
|
|
118
128
|
private
|
@@ -135,7 +145,7 @@ module Mail
|
|
135
145
|
"#{$1}/#{$2}; #{$3}"
|
136
146
|
when val.chomp =~ /^\s*([\w\d\-_]+)\/([\w\d\-_]+)\s*;(ISO[\w\d\-_]+)$/i
|
137
147
|
# Microsoft helper:
|
138
|
-
# Handles '
|
148
|
+
# Handles 'type/subtype;ISO-8559-1'
|
139
149
|
"#{$1}/#{$2}; charset=#{quote_atom($3)}"
|
140
150
|
when val.chomp =~ /^text;?$/i
|
141
151
|
# Handles 'text;' and 'text'
|
@@ -43,19 +43,23 @@ module Mail
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def date_time
|
46
|
-
::DateTime.parse("#{element.date_time}")
|
46
|
+
@datetime ||= ::DateTime.parse("#{element.date_time}")
|
47
47
|
end
|
48
48
|
|
49
49
|
def info
|
50
50
|
element.info
|
51
51
|
end
|
52
|
-
|
52
|
+
|
53
|
+
def formatted_date
|
54
|
+
date_time.strftime("%a, %d %b %Y %H:%M:%S ") + date_time.zone.delete(':')
|
55
|
+
end
|
56
|
+
|
53
57
|
def encoded
|
54
|
-
"#{CAPITALIZED_FIELD}: #{
|
58
|
+
"#{CAPITALIZED_FIELD}: #{info}; #{formatted_date}\r\n"
|
55
59
|
end
|
56
60
|
|
57
61
|
def decoded
|
58
|
-
|
62
|
+
"#{info}; #{formatted_date}"
|
59
63
|
end
|
60
64
|
|
61
65
|
end
|
data/lib/mail/header.rb
CHANGED
@@ -34,6 +34,7 @@ module Mail
|
|
34
34
|
# these cases, please make a patch and send it in, or at the least, send
|
35
35
|
# me the example so we can fix it.
|
36
36
|
def initialize(header_text = nil)
|
37
|
+
@errors = []
|
37
38
|
self.raw_source = header_text.to_crlf
|
38
39
|
split_header if header_text
|
39
40
|
end
|
@@ -74,6 +75,7 @@ module Mail
|
|
74
75
|
unfolded_fields.each do |field|
|
75
76
|
|
76
77
|
field = Field.new(field)
|
78
|
+
field.errors.each { |error| self.errors << error }
|
77
79
|
selected = select_field_for(field.name)
|
78
80
|
|
79
81
|
if selected.any? && limited_field?(field.name)
|
@@ -85,6 +87,10 @@ module Mail
|
|
85
87
|
|
86
88
|
end
|
87
89
|
|
90
|
+
def errors
|
91
|
+
@errors
|
92
|
+
end
|
93
|
+
|
88
94
|
# 3.6. Field definitions
|
89
95
|
#
|
90
96
|
# The following table indicates limits on the number of times each
|
@@ -107,7 +113,7 @@ module Mail
|
|
107
113
|
# h['To'] #=> 'mikel@me.com'
|
108
114
|
# h['X-Mail-SPAM'] #=> ['15', '20']
|
109
115
|
def [](name)
|
110
|
-
name = dasherize(name)
|
116
|
+
name = dasherize(name).downcase
|
111
117
|
selected = select_field_for(name)
|
112
118
|
case
|
113
119
|
when selected.length > 1
|
@@ -134,7 +140,8 @@ module Mail
|
|
134
140
|
# h['X-Mail-SPAM'] # => nil
|
135
141
|
def []=(name, value)
|
136
142
|
name = dasherize(name)
|
137
|
-
|
143
|
+
fn = name.downcase
|
144
|
+
selected = select_field_for(fn)
|
138
145
|
|
139
146
|
case
|
140
147
|
# User wants to delete the field
|
@@ -142,8 +149,8 @@ module Mail
|
|
142
149
|
fields.delete_if { |f| selected.include?(f) }
|
143
150
|
|
144
151
|
# User wants to change the field
|
145
|
-
when !selected.blank? && limited_field?(
|
146
|
-
selected.first.update(
|
152
|
+
when !selected.blank? && limited_field?(fn)
|
153
|
+
selected.first.update(fn, value)
|
147
154
|
|
148
155
|
# User wants to create the field
|
149
156
|
else
|
@@ -193,7 +200,7 @@ module Mail
|
|
193
200
|
!fields.select { |f| f.responsible_for?('Date') }.empty?
|
194
201
|
end
|
195
202
|
|
196
|
-
# Returns true if the header has a
|
203
|
+
# Returns true if the header has a MIME version defined (empty or not)
|
197
204
|
def has_mime_version?
|
198
205
|
!fields.select { |f| f.responsible_for?('Mime-Version') }.empty?
|
199
206
|
end
|
@@ -236,4 +243,4 @@ module Mail
|
|
236
243
|
end
|
237
244
|
|
238
245
|
end
|
239
|
-
end
|
246
|
+
end
|