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.

Files changed (106) hide show
  1. data/CHANGELOG.rdoc +37 -0
  2. data/README.rdoc +1 -1
  3. data/Rakefile +2 -3
  4. data/TODO.rdoc +2 -12
  5. data/lib/mail.rb +7 -4
  6. data/lib/mail/attachments_list.rb +28 -10
  7. data/lib/mail/body.rb +44 -15
  8. data/lib/mail/core_extensions/string.rb +4 -0
  9. data/lib/mail/elements/content_transfer_encoding_element.rb +4 -1
  10. data/lib/mail/encodings/7bit.rb +29 -0
  11. data/lib/mail/encodings/8bit.rb +29 -0
  12. data/lib/mail/encodings/base64.rb +18 -5
  13. data/lib/mail/encodings/binary.rb +29 -0
  14. data/lib/mail/encodings/encodings.rb +22 -6
  15. data/lib/mail/encodings/quoted_printable.rb +27 -4
  16. data/lib/mail/encodings/transfer_encoding.rb +58 -0
  17. data/lib/mail/field.rb +4 -2
  18. data/lib/mail/fields/common/parameter_hash.rb +12 -3
  19. data/lib/mail/fields/content_disposition_field.rb +12 -2
  20. data/lib/mail/fields/content_location_field.rb +2 -2
  21. data/lib/mail/fields/content_transfer_encoding_field.rb +5 -3
  22. data/lib/mail/fields/content_type_field.rb +14 -4
  23. data/lib/mail/fields/mime_version_field.rb +2 -2
  24. data/lib/mail/fields/received_field.rb +8 -4
  25. data/lib/mail/fields/structured_field.rb +4 -0
  26. data/lib/mail/fields/unstructured_field.rb +5 -0
  27. data/lib/mail/header.rb +13 -6
  28. data/lib/mail/mail.rb +1 -1
  29. data/lib/mail/message.rb +100 -28
  30. data/lib/mail/network/delivery_methods/smtp.rb +1 -1
  31. data/lib/mail/parsers/address_lists.rb +4 -1
  32. data/lib/mail/parsers/content_disposition.rb +24 -6
  33. data/lib/mail/parsers/content_location.rb +8 -2
  34. data/lib/mail/parsers/content_transfer_encoding.rb +73 -83
  35. data/lib/mail/parsers/content_transfer_encoding.treetop +5 -10
  36. data/lib/mail/parsers/content_type.rb +36 -9
  37. data/lib/mail/parsers/date_time.rb +4 -1
  38. data/lib/mail/parsers/envelope_from.rb +8 -2
  39. data/lib/mail/parsers/message_ids.rb +4 -1
  40. data/lib/mail/parsers/mime_version.rb +4 -1
  41. data/lib/mail/parsers/phrase_lists.rb +4 -1
  42. data/lib/mail/parsers/received.rb +4 -1
  43. data/lib/mail/parsers/rfc2045.rb +75 -17
  44. data/lib/mail/parsers/rfc2045.treetop +2 -1
  45. data/lib/mail/parsers/rfc2822.rb +316 -79
  46. data/lib/mail/parsers/rfc2822_obsolete.rb +200 -50
  47. data/lib/mail/part.rb +21 -6
  48. data/lib/mail/patterns.rb +3 -3
  49. data/lib/mail/utilities.rb +4 -4
  50. data/lib/mail/vendor/treetop-1.4.3/Or +0 -0
  51. data/lib/mail/vendor/treetop-1.4.3/Rakefile +11 -6
  52. data/lib/mail/vendor/treetop-1.4.3/Treetop.tmbundle/Preferences/Comments.tmPreferences +22 -0
  53. data/lib/mail/vendor/treetop-1.4.3/Treetop.tmbundle/Syntaxes/Treetop Grammar.tmLanguage +28 -1
  54. data/lib/mail/vendor/treetop-1.4.3/bin/tt +5 -5
  55. data/lib/mail/vendor/treetop-1.4.3/lib/treetop.rb +3 -19
  56. data/lib/mail/vendor/treetop-1.4.3/lib/treetop/bootstrap_gen_1_metagrammar.rb +4 -7
  57. data/lib/mail/vendor/treetop-1.4.3/lib/treetop/compiler.rb +7 -6
  58. data/lib/mail/vendor/treetop-1.4.3/lib/treetop/compiler/metagrammar.rb +1 -1
  59. data/lib/mail/vendor/treetop-1.4.3/lib/treetop/compiler/node_classes.rb +19 -20
  60. data/lib/mail/vendor/treetop-1.4.3/lib/treetop/polyglot.rb +9 -0
  61. data/lib/mail/vendor/treetop-1.4.3/lib/treetop/ruby_extensions.rb +1 -2
  62. data/lib/mail/vendor/treetop-1.4.3/lib/treetop/runtime.rb +6 -5
  63. data/lib/mail/vendor/treetop-1.4.3/lib/treetop/runtime/interval_skip_list.rb +3 -4
  64. data/lib/mail/vendor/treetop-1.4.3/lib/treetop/runtime/syntax_node.rb +7 -7
  65. data/lib/mail/vendor/treetop-1.4.3/lib/treetop/version.rb +1 -1
  66. data/lib/mail/vendor/treetop-1.4.3/script/generate_metagrammar.rb +3 -4
  67. data/lib/mail/vendor/treetop-1.4.3/spec/compiler/and_predicate_spec.rb +2 -2
  68. data/lib/mail/vendor/treetop-1.4.3/spec/compiler/anything_symbol_spec.rb +2 -2
  69. data/lib/mail/vendor/treetop-1.4.3/spec/compiler/character_class_spec.rb +1 -1
  70. data/lib/mail/vendor/treetop-1.4.3/spec/compiler/choice_spec.rb +2 -2
  71. data/lib/mail/vendor/treetop-1.4.3/spec/compiler/circular_compilation_spec.rb +3 -1
  72. data/lib/mail/vendor/treetop-1.4.3/spec/compiler/failure_propagation_functional_spec.rb +2 -2
  73. data/lib/mail/vendor/treetop-1.4.3/spec/compiler/grammar_compiler_spec.rb +1 -1
  74. data/lib/mail/vendor/treetop-1.4.3/spec/compiler/grammar_spec.rb +1 -1
  75. data/lib/mail/vendor/treetop-1.4.3/spec/compiler/multibyte_chars_spec.rb +1 -9
  76. data/lib/mail/vendor/treetop-1.4.3/spec/compiler/nonterminal_symbol_spec.rb +2 -2
  77. data/lib/mail/vendor/treetop-1.4.3/spec/compiler/not_predicate_spec.rb +2 -2
  78. data/lib/mail/vendor/treetop-1.4.3/spec/compiler/one_or_more_spec.rb +2 -2
  79. data/lib/mail/vendor/treetop-1.4.3/spec/compiler/optional_spec.rb +1 -1
  80. data/lib/mail/vendor/treetop-1.4.3/spec/compiler/parenthesized_expression_spec.rb +1 -1
  81. data/lib/mail/vendor/treetop-1.4.3/spec/compiler/parsing_rule_spec.rb +1 -1
  82. data/lib/mail/vendor/treetop-1.4.3/spec/compiler/repeated_subrule_spec.rb +1 -1
  83. data/lib/mail/vendor/treetop-1.4.3/spec/compiler/semantic_predicate_spec.rb +1 -1
  84. data/lib/mail/vendor/treetop-1.4.3/spec/compiler/sequence_spec.rb +1 -1
  85. data/lib/mail/vendor/treetop-1.4.3/spec/compiler/terminal_spec.rb +1 -1
  86. data/lib/mail/vendor/treetop-1.4.3/spec/compiler/terminal_symbol_spec.rb +1 -1
  87. data/lib/mail/vendor/treetop-1.4.3/spec/compiler/tt_compiler_spec.rb +1 -1
  88. data/lib/mail/vendor/treetop-1.4.3/spec/compiler/zero_or_more_spec.rb +1 -1
  89. data/lib/mail/vendor/treetop-1.4.3/spec/composition/grammar_composition_spec.rb +1 -1
  90. data/lib/mail/vendor/treetop-1.4.3/spec/ruby_extensions/string_spec.rb +1 -1
  91. data/lib/mail/vendor/treetop-1.4.3/spec/runtime/compiled_parser_spec.rb +1 -1
  92. data/lib/mail/vendor/treetop-1.4.3/spec/runtime/interval_skip_list/delete_spec.rb +2 -2
  93. data/lib/mail/vendor/treetop-1.4.3/spec/runtime/interval_skip_list/expire_range_spec.rb +2 -2
  94. data/lib/mail/vendor/treetop-1.4.3/spec/runtime/interval_skip_list/insert_spec.rb +1 -1
  95. data/lib/mail/vendor/treetop-1.4.3/spec/runtime/interval_skip_list/interval_skip_list_spec.rb +2 -2
  96. data/lib/mail/vendor/treetop-1.4.3/spec/runtime/interval_skip_list/palindromic_fixture_spec.rb +2 -3
  97. data/lib/mail/vendor/treetop-1.4.3/spec/runtime/interval_skip_list/spec_helper.rb +2 -2
  98. data/lib/mail/vendor/treetop-1.4.3/spec/runtime/syntax_node_spec.rb +1 -1
  99. data/lib/mail/vendor/treetop-1.4.3/spec/spec_helper.rb +4 -5
  100. data/lib/mail/vendor/treetop-1.4.3/treetop.gemspec +2 -2
  101. data/lib/mail/version.rb +1 -1
  102. data/lib/mail/version_specific/ruby_1_8.rb +1 -3
  103. data/lib/mail/version_specific/ruby_1_9.rb +1 -2
  104. data/lib/tasks/treetop.rake +1 -1
  105. metadata +33 -14
  106. 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
- string = str.to_s.split(/[_-]/).map { |v| v.capitalize }.join('')
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
- string = str.to_s.split(/[_-]/).map { |v| v.capitalize }.join('')
31
- RubyVer.get_constant(Mail::Encodings, string)
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
- str.gsub( /[^a-z ]/i ) { quoted_printable_encode($&) }
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 mime extension paramaters that
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}="#{value}"}
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
- "#{CAPITALIZED_FIELD}: #{value}\r\n"
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
- value
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
@@ -31,11 +31,11 @@ module Mail
31
31
 
32
32
  # TODO: Fix this up
33
33
  def encoded
34
- "#{CAPITALIZED_FIELD}: #{value}\r\n"
34
+ "#{CAPITALIZED_FIELD}: #{location}\r\n"
35
35
  end
36
36
 
37
37
  def decoded
38
- value
38
+ location
39
39
  end
40
40
 
41
41
  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}: #{value}\r\n"
39
+ "#{CAPITALIZED_FIELD}: #{encoding}\r\n"
38
40
  end
39
41
 
40
42
  def decoded
41
- value
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 mime type
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
- "#{CAPITALIZED_FIELD}: #{content_type};\r\n\t#{parameters.encoded};\r\n"
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
- value
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 'mime/type;ISO-8559-1'
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,11 +43,11 @@ module Mail
43
43
  end
44
44
 
45
45
  def encoded
46
- "#{CAPITALIZED_FIELD}: #{value}\r\n"
46
+ "#{CAPITALIZED_FIELD}: #{version}\r\n"
47
47
  end
48
48
 
49
49
  def decoded
50
- value
50
+ version
51
51
  end
52
52
 
53
53
  end
@@ -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}: #{value}"
58
+ "#{CAPITALIZED_FIELD}: #{info}; #{formatted_date}\r\n"
55
59
  end
56
60
 
57
61
  def decoded
58
- value
62
+ "#{info}; #{formatted_date}"
59
63
  end
60
64
 
61
65
  end
@@ -31,6 +31,10 @@ module Mail
31
31
  def default
32
32
  decoded
33
33
  end
34
+
35
+ def errors
36
+ []
37
+ end
34
38
 
35
39
  end
36
40
  end
@@ -18,11 +18,16 @@ module Mail
18
18
  include Mail::Utilities
19
19
 
20
20
  def initialize(*args)
21
+ @errors = []
21
22
  self.name = args.first
22
23
  self.value = args.last
23
24
  self
24
25
  end
25
26
 
27
+ def errors
28
+ @errors
29
+ end
30
+
26
31
  def encoded
27
32
  do_encode(self.name)
28
33
  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
- selected = select_field_for(name)
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?(name)
146
- selected.first.update(name, value)
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 message_id defined (empty or not)
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