mail 2.6.1 → 2.7.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.
Files changed (179) hide show
  1. checksums.yaml +5 -5
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +92 -80
  4. data/lib/mail/attachments_list.rb +11 -5
  5. data/lib/mail/body.rb +81 -44
  6. data/lib/mail/check_delivery_params.rb +50 -10
  7. data/lib/mail/configuration.rb +3 -0
  8. data/lib/mail/{patterns.rb → constants.rb} +26 -6
  9. data/lib/mail/core_extensions/smtp.rb +20 -16
  10. data/lib/mail/core_extensions/string.rb +1 -27
  11. data/lib/mail/elements/address.rb +81 -93
  12. data/lib/mail/elements/address_list.rb +12 -29
  13. data/lib/mail/elements/content_disposition_element.rb +9 -15
  14. data/lib/mail/elements/content_location_element.rb +8 -12
  15. data/lib/mail/elements/content_transfer_encoding_element.rb +6 -10
  16. data/lib/mail/elements/content_type_element.rb +9 -19
  17. data/lib/mail/elements/date_time_element.rb +7 -14
  18. data/lib/mail/elements/envelope_from_element.rb +15 -21
  19. data/lib/mail/elements/message_ids_element.rb +12 -14
  20. data/lib/mail/elements/mime_version_element.rb +7 -14
  21. data/lib/mail/elements/phrase_list.rb +7 -9
  22. data/lib/mail/elements/received_element.rb +10 -15
  23. data/lib/mail/elements.rb +1 -0
  24. data/lib/mail/encodings/7bit.rb +6 -15
  25. data/lib/mail/encodings/8bit.rb +5 -18
  26. data/lib/mail/encodings/base64.rb +15 -10
  27. data/lib/mail/encodings/binary.rb +4 -22
  28. data/lib/mail/encodings/identity.rb +24 -0
  29. data/lib/mail/encodings/quoted_printable.rb +13 -7
  30. data/lib/mail/encodings/transfer_encoding.rb +47 -28
  31. data/lib/mail/encodings/unix_to_unix.rb +20 -0
  32. data/lib/mail/encodings.rb +121 -82
  33. data/lib/mail/envelope.rb +2 -1
  34. data/lib/mail/field.rb +114 -62
  35. data/lib/mail/field_list.rb +2 -1
  36. data/lib/mail/fields/bcc_field.rb +17 -5
  37. data/lib/mail/fields/cc_field.rb +2 -2
  38. data/lib/mail/fields/comments_field.rb +2 -1
  39. data/lib/mail/fields/common/address_container.rb +3 -2
  40. data/lib/mail/fields/common/common_address.rb +40 -14
  41. data/lib/mail/fields/common/common_date.rb +2 -1
  42. data/lib/mail/fields/common/common_field.rb +6 -11
  43. data/lib/mail/fields/common/common_message_id.rb +3 -2
  44. data/lib/mail/fields/common/parameter_hash.rb +5 -4
  45. data/lib/mail/fields/content_description_field.rb +2 -1
  46. data/lib/mail/fields/content_disposition_field.rb +14 -13
  47. data/lib/mail/fields/content_id_field.rb +5 -4
  48. data/lib/mail/fields/content_location_field.rb +3 -2
  49. data/lib/mail/fields/content_transfer_encoding_field.rb +3 -2
  50. data/lib/mail/fields/content_type_field.rb +7 -11
  51. data/lib/mail/fields/date_field.rb +4 -4
  52. data/lib/mail/fields/from_field.rb +2 -2
  53. data/lib/mail/fields/in_reply_to_field.rb +2 -1
  54. data/lib/mail/fields/keywords_field.rb +3 -3
  55. data/lib/mail/fields/message_id_field.rb +3 -2
  56. data/lib/mail/fields/mime_version_field.rb +4 -3
  57. data/lib/mail/fields/optional_field.rb +5 -1
  58. data/lib/mail/fields/received_field.rb +5 -4
  59. data/lib/mail/fields/references_field.rb +2 -1
  60. data/lib/mail/fields/reply_to_field.rb +2 -2
  61. data/lib/mail/fields/resent_bcc_field.rb +2 -2
  62. data/lib/mail/fields/resent_cc_field.rb +2 -2
  63. data/lib/mail/fields/resent_date_field.rb +2 -2
  64. data/lib/mail/fields/resent_from_field.rb +2 -2
  65. data/lib/mail/fields/resent_message_id_field.rb +2 -1
  66. data/lib/mail/fields/resent_sender_field.rb +2 -2
  67. data/lib/mail/fields/resent_to_field.rb +2 -2
  68. data/lib/mail/fields/return_path_field.rb +2 -2
  69. data/lib/mail/fields/sender_field.rb +2 -2
  70. data/lib/mail/fields/structured_field.rb +1 -0
  71. data/lib/mail/fields/subject_field.rb +2 -1
  72. data/lib/mail/fields/to_field.rb +2 -2
  73. data/lib/mail/fields/unstructured_field.rb +28 -10
  74. data/lib/mail/fields.rb +1 -0
  75. data/lib/mail/header.rb +18 -14
  76. data/lib/mail/indifferent_hash.rb +1 -0
  77. data/lib/mail/mail.rb +6 -11
  78. data/lib/mail/matchers/attachment_matchers.rb +29 -0
  79. data/lib/mail/matchers/has_sent_mail.rb +53 -9
  80. data/lib/mail/message.rb +99 -89
  81. data/lib/mail/multibyte/chars.rb +32 -30
  82. data/lib/mail/multibyte/unicode.rb +31 -26
  83. data/lib/mail/multibyte/utils.rb +1 -0
  84. data/lib/mail/multibyte.rb +65 -15
  85. data/lib/mail/network/delivery_methods/exim.rb +7 -10
  86. data/lib/mail/network/delivery_methods/file_delivery.rb +5 -8
  87. data/lib/mail/network/delivery_methods/logger_delivery.rb +37 -0
  88. data/lib/mail/network/delivery_methods/sendmail.rb +17 -11
  89. data/lib/mail/network/delivery_methods/smtp.rb +60 -53
  90. data/lib/mail/network/delivery_methods/smtp_connection.rb +11 -6
  91. data/lib/mail/network/delivery_methods/test_mailer.rb +6 -8
  92. data/lib/mail/network/retriever_methods/base.rb +1 -0
  93. data/lib/mail/network/retriever_methods/imap.rb +19 -5
  94. data/lib/mail/network/retriever_methods/pop3.rb +4 -1
  95. data/lib/mail/network/retriever_methods/test_retriever.rb +2 -1
  96. data/lib/mail/network.rb +2 -0
  97. data/lib/mail/parser_tools.rb +15 -0
  98. data/lib/mail/parsers/address_lists_parser.rb +33208 -104
  99. data/lib/mail/parsers/address_lists_parser.rl +172 -0
  100. data/lib/mail/parsers/content_disposition_parser.rb +877 -49
  101. data/lib/mail/parsers/content_disposition_parser.rl +82 -0
  102. data/lib/mail/parsers/content_location_parser.rb +804 -23
  103. data/lib/mail/parsers/content_location_parser.rl +71 -0
  104. data/lib/mail/parsers/content_transfer_encoding_parser.rb +502 -19
  105. data/lib/mail/parsers/content_transfer_encoding_parser.rl +64 -0
  106. data/lib/mail/parsers/content_type_parser.rb +1024 -46
  107. data/lib/mail/parsers/content_type_parser.rl +83 -0
  108. data/lib/mail/parsers/date_time_parser.rb +872 -23
  109. data/lib/mail/parsers/date_time_parser.rl +62 -0
  110. data/lib/mail/parsers/envelope_from_parser.rb +3570 -34
  111. data/lib/mail/parsers/envelope_from_parser.rl +82 -0
  112. data/lib/mail/parsers/message_ids_parser.rb +2840 -25
  113. data/lib/mail/parsers/message_ids_parser.rl +82 -0
  114. data/lib/mail/parsers/mime_version_parser.rb +492 -26
  115. data/lib/mail/parsers/mime_version_parser.rl +61 -0
  116. data/lib/mail/parsers/phrase_lists_parser.rb +862 -17
  117. data/lib/mail/parsers/phrase_lists_parser.rl +83 -0
  118. data/lib/mail/parsers/received_parser.rb +8765 -36
  119. data/lib/mail/parsers/received_parser.rl +84 -0
  120. data/lib/mail/parsers/rfc2045_content_transfer_encoding.rl +13 -0
  121. data/lib/mail/parsers/rfc2045_content_type.rl +25 -0
  122. data/lib/mail/parsers/rfc2045_mime.rl +16 -0
  123. data/lib/mail/parsers/rfc2183_content_disposition.rl +15 -0
  124. data/lib/mail/parsers/rfc3629_utf8.rl +19 -0
  125. data/lib/mail/parsers/rfc5234_abnf_core_rules.rl +22 -0
  126. data/lib/mail/parsers/rfc5322.rl +59 -0
  127. data/lib/mail/parsers/rfc5322_address.rl +72 -0
  128. data/lib/mail/parsers/{ragel/date_time.rl → rfc5322_date_time.rl} +8 -1
  129. data/lib/mail/parsers/rfc5322_lexical_tokens.rl +60 -0
  130. data/lib/mail/parsers.rb +17 -24
  131. data/lib/mail/part.rb +8 -5
  132. data/lib/mail/parts_list.rb +31 -14
  133. data/lib/mail/utilities.rb +112 -13
  134. data/lib/mail/values/unicode_tables.dat +0 -0
  135. data/lib/mail/version.rb +8 -15
  136. data/lib/mail/version_specific/ruby_1_8.rb +52 -8
  137. data/lib/mail/version_specific/ruby_1_9.rb +143 -24
  138. data/lib/mail.rb +8 -14
  139. metadata +71 -81
  140. data/CHANGELOG.rdoc +0 -752
  141. data/CONTRIBUTING.md +0 -60
  142. data/Dependencies.txt +0 -2
  143. data/Gemfile +0 -15
  144. data/Rakefile +0 -29
  145. data/TODO.rdoc +0 -9
  146. data/VERSION +0 -4
  147. data/lib/mail/core_extensions/nil.rb +0 -19
  148. data/lib/mail/core_extensions/object.rb +0 -13
  149. data/lib/mail/core_extensions/string/access.rb +0 -145
  150. data/lib/mail/core_extensions/string/multibyte.rb +0 -78
  151. data/lib/mail/multibyte/exceptions.rb +0 -8
  152. data/lib/mail/parsers/ragel/common.rl +0 -184
  153. data/lib/mail/parsers/ragel/parser_info.rb +0 -61
  154. data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb +0 -14864
  155. data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb.rl +0 -37
  156. data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb +0 -751
  157. data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb.rl +0 -37
  158. data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb +0 -614
  159. data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb.rl +0 -37
  160. data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb +0 -447
  161. data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb.rl +0 -37
  162. data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb +0 -825
  163. data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb.rl +0 -37
  164. data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb +0 -817
  165. data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb.rl +0 -37
  166. data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb +0 -2129
  167. data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb.rl +0 -37
  168. data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb +0 -1570
  169. data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb.rl +0 -37
  170. data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb +0 -440
  171. data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb.rl +0 -37
  172. data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb +0 -564
  173. data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb.rl +0 -37
  174. data/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl +0 -51
  175. data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb +0 -5144
  176. data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb.rl +0 -37
  177. data/lib/mail/parsers/ragel/ruby/parser.rb.rl.erb +0 -37
  178. data/lib/mail/parsers/ragel/ruby.rb +0 -39
  179. data/lib/mail/parsers/ragel.rb +0 -17
@@ -1,25 +1,32 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
  require 'mail/fields/common/address_container'
3
4
 
4
5
  module Mail
5
6
  module CommonAddress # :nodoc:
6
-
7
7
  def parse(val = value)
8
- unless val.blank?
8
+ unless Utilities.blank?(val)
9
9
  @address_list = AddressList.new(encode_if_needed(val))
10
10
  else
11
11
  nil
12
12
  end
13
13
  end
14
-
14
+
15
15
  def charset
16
16
  @charset
17
17
  end
18
-
19
- def encode_if_needed(val)
20
- Encodings.address_encode(val, charset)
18
+
19
+ def encode_if_needed(val) #:nodoc:
20
+ # Need to join arrays of addresses into a single value
21
+ if val.kind_of?(Array)
22
+ val.compact.map { |a| encode_if_needed a }.join(', ')
23
+
24
+ # Pass through UTF-8; encode non-UTF-8.
25
+ else
26
+ utf8_if_needed(val) || Encodings.encode_non_usascii(val, charset)
27
+ end
21
28
  end
22
-
29
+
23
30
  # Allows you to iterate through each address object in the address_list
24
31
  def each
25
32
  address_list.addresses.each do |address|
@@ -84,10 +91,10 @@ module Mail
84
91
  case
85
92
  when val.nil?
86
93
  raise ArgumentError, "Need to pass an address to <<"
87
- when val.blank?
94
+ when Utilities.blank?(val)
88
95
  parse(encoded)
89
96
  else
90
- self.value = [self.value, val].reject {|a| a.blank? }.join(", ")
97
+ self.value = [self.value, val].reject {|a| Utilities.blank?(a) }.join(", ")
91
98
  end
92
99
  end
93
100
 
@@ -97,24 +104,43 @@ module Mail
97
104
  end
98
105
 
99
106
  private
100
-
107
+
108
+ if 'string'.respond_to?(:encoding)
109
+ # Pass through UTF-8 addresses
110
+ def utf8_if_needed(val)
111
+ if charset =~ /\AUTF-?8\z/i
112
+ val
113
+ elsif val.encoding == Encoding::UTF_8
114
+ val
115
+ elsif (utf8 = val.dup.force_encoding(Encoding::UTF_8)).valid_encoding?
116
+ utf8
117
+ end
118
+ end
119
+ else
120
+ def utf8_if_needed(val)
121
+ if charset =~ /\AUTF-?8\z/i
122
+ val
123
+ end
124
+ end
125
+ end
126
+
101
127
  def do_encode(field_name)
102
- return '' if value.blank?
128
+ return '' if Utilities.blank?(value)
103
129
  address_array = address_list.addresses.reject { |a| encoded_group_addresses.include?(a.encoded) }.compact.map { |a| a.encoded }
104
130
  address_text = address_array.join(", \r\n\s")
105
131
  group_array = groups.map { |k,v| "#{k}: #{v.map { |a| a.encoded }.join(", \r\n\s")};" }
106
132
  group_text = group_array.join(" \r\n\s")
107
- return_array = [address_text, group_text].reject { |a| a.blank? }
133
+ return_array = [address_text, group_text].reject { |a| Utilities.blank?(a) }
108
134
  "#{field_name}: #{return_array.join(", \r\n\s")}\r\n"
109
135
  end
110
136
 
111
137
  def do_decode
112
- return nil if value.blank?
138
+ return nil if Utilities.blank?(value)
113
139
  address_array = address_list.addresses.reject { |a| decoded_group_addresses.include?(a.decoded) }.map { |a| a.decoded }
114
140
  address_text = address_array.join(", ")
115
141
  group_array = groups.map { |k,v| "#{k}: #{v.map { |a| a.decoded }.join(", ")};" }
116
142
  group_text = group_array.join(" ")
117
- return_array = [address_text, group_text].reject { |a| a.blank? }
143
+ return_array = [address_text, group_text].reject { |a| Utilities.blank?(a) }
118
144
  return_array.join(", ")
119
145
  end
120
146
 
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
  module Mail
3
4
  module CommonDate # :nodoc:
4
5
  # Returns a date time object of the parsed date
@@ -11,7 +12,7 @@ module Mail
11
12
  end
12
13
 
13
14
  def parse(val = value)
14
- unless val.blank?
15
+ unless Utilities.blank?(val)
15
16
  @element = Mail::DateTimeElement.new(val)
16
17
  else
17
18
  nil
@@ -1,6 +1,8 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
  module Mail
3
4
  module CommonField # :nodoc:
5
+ include Mail::Constants
4
6
 
5
7
  def name=(value)
6
8
  @name = value
@@ -12,9 +14,8 @@ module Mail
12
14
 
13
15
  def value=(value)
14
16
  @length = nil
15
- @tree = nil
16
17
  @element = nil
17
- @value = value
18
+ @value = value.is_a?(Array) ? value : value.to_s
18
19
  end
19
20
 
20
21
  def value
@@ -39,18 +40,12 @@ module Mail
39
40
 
40
41
  private
41
42
 
42
- def strip_field(field_name, value)
43
- if value.is_a?(Array)
44
- value
45
- else
46
- value.to_s.sub(/#{field_name}:\s+/i, '')
47
- end
48
- end
49
-
50
43
  FILENAME_RE = /\b(filename|name)=([^;"\r\n]+\s[^;"\r\n]+)/
51
44
  def ensure_filename_quoted(value)
52
45
  if value.is_a?(String)
53
- value.sub! FILENAME_RE, '\1="\2"'
46
+ value.sub FILENAME_RE, '\1="\2"'
47
+ else
48
+ value
54
49
  end
55
50
  end
56
51
  end
@@ -1,12 +1,13 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
  module Mail
3
4
  module CommonMessageId # :nodoc:
4
5
  def element
5
- @element ||= Mail::MessageIdsElement.new(value) unless value.blank?
6
+ @element ||= Mail::MessageIdsElement.new(value) unless Utilities.blank?(value)
6
7
  end
7
8
 
8
9
  def parse(val = value)
9
- unless val.blank?
10
+ unless Utilities.blank?(val)
10
11
  @element = Mail::MessageIdsElement.new(val)
11
12
  else
12
13
  nil
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
  module Mail
3
4
 
4
5
  # ParameterHash is an intelligent Hash that allows you to add
@@ -18,7 +19,7 @@ module Mail
18
19
  exact = nil
19
20
  each do |k,v|
20
21
  if k =~ /^#{key_pattern}(\*|$)/i
21
- if $1 == '*'
22
+ if $1 == ASTERISK
22
23
  pairs << [k, v]
23
24
  else
24
25
  exact = k
@@ -29,7 +30,7 @@ module Mail
29
30
  super(exact || key_name)
30
31
  else # Dealing with a multiple value pair or a single encoded value pair
31
32
  string = pairs.sort { |a,b| a.first.to_s <=> b.first.to_s }.map { |v| v.last }.join('')
32
- if mt = string.match(/([\w\-]+)'(\w\w)'(.*)/)
33
+ if mt = string.match(/([\w\-]+)?'(\w\w)?'(.*)/)
33
34
  string = mt[3]
34
35
  encoding = mt[1]
35
36
  else
@@ -40,7 +41,7 @@ module Mail
40
41
  end
41
42
 
42
43
  def encoded
43
- map.sort { |a,b| a.first.to_s <=> b.first.to_s }.map do |key_name, value|
44
+ map.sort_by { |a| a.first.to_s }.map! do |key_name, value|
44
45
  unless value.ascii_only?
45
46
  value = Mail::Encodings.param_encode(value)
46
47
  key_name = "#{key_name}*"
@@ -50,7 +51,7 @@ module Mail
50
51
  end
51
52
 
52
53
  def decoded
53
- map.sort { |a,b| a.first.to_s <=> b.first.to_s }.map do |key_name, value|
54
+ map.sort_by { |a| a.first.to_s }.map! do |key_name, value|
54
55
  %Q{#{key_name}=#{quote_token(value)}}
55
56
  end.join("; ")
56
57
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
  #
3
4
  #
4
5
  #
@@ -10,7 +11,7 @@ module Mail
10
11
 
11
12
  def initialize(value = nil, charset = 'utf-8')
12
13
  self.charset = charset
13
- super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
14
+ super(CAPITALIZED_FIELD, value, charset)
14
15
  self.parse
15
16
  self
16
17
  end
@@ -1,26 +1,27 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
  require 'mail/fields/common/parameter_hash'
3
4
 
4
5
  module Mail
5
6
  class ContentDispositionField < StructuredField
6
-
7
+
7
8
  FIELD_NAME = 'content-disposition'
8
9
  CAPITALIZED_FIELD = 'Content-Disposition'
9
-
10
+
10
11
  def initialize(value = nil, charset = 'utf-8')
11
12
  self.charset = charset
12
- ensure_filename_quoted(value)
13
- super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
13
+ value = ensure_filename_quoted(value)
14
+ super(CAPITALIZED_FIELD, value, charset)
14
15
  self.parse
15
16
  self
16
17
  end
17
-
18
+
18
19
  def parse(val = value)
19
- unless val.blank?
20
+ unless Utilities.blank?(val)
20
21
  @element = Mail::ContentDispositionElement.new(val)
21
22
  end
22
23
  end
23
-
24
+
24
25
  def element
25
26
  @element ||= Mail::ContentDispositionElement.new(value)
26
27
  end
@@ -28,20 +29,20 @@ module Mail
28
29
  def disposition_type
29
30
  element.disposition_type
30
31
  end
31
-
32
+
32
33
  def parameters
33
34
  @parameters = ParameterHash.new
34
- element.parameters.each { |p| @parameters.merge!(p) }
35
+ element.parameters.each { |p| @parameters.merge!(p) } unless element.parameters.nil?
35
36
  @parameters
36
37
  end
37
38
 
38
39
  def filename
39
40
  case
40
- when !parameters['filename'].blank?
41
+ when parameters['filename']
41
42
  @filename = parameters['filename']
42
- when !parameters['name'].blank?
43
+ when parameters['name']
43
44
  @filename = parameters['name']
44
- else
45
+ else
45
46
  @filename = nil
46
47
  end
47
48
  @filename
@@ -56,7 +57,7 @@ module Mail
56
57
  end
57
58
  "#{CAPITALIZED_FIELD}: #{disposition_type}" + p
58
59
  end
59
-
60
+
60
61
  def decoded
61
62
  if parameters.length > 0
62
63
  p = "; #{parameters.decoded}"
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
  #
3
4
  #
4
5
  #
@@ -11,18 +12,18 @@ module Mail
11
12
  def initialize(value = nil, charset = 'utf-8')
12
13
  self.charset = charset
13
14
  @uniq = 1
14
- if value.blank?
15
+ if Utilities.blank?(value)
15
16
  value = generate_content_id
16
17
  else
17
- value = strip_field(FIELD_NAME, value)
18
+ value = value.to_s
18
19
  end
19
- super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
20
+ super(CAPITALIZED_FIELD, value, charset)
20
21
  self.parse
21
22
  self
22
23
  end
23
24
 
24
25
  def parse(val = value)
25
- unless val.blank?
26
+ unless Utilities.blank?(val)
26
27
  @element = Mail::MessageIdsElement.new(val)
27
28
  end
28
29
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
  #
3
4
  #
4
5
  #
@@ -10,13 +11,13 @@ module Mail
10
11
 
11
12
  def initialize(value = nil, charset = 'utf-8')
12
13
  self.charset = charset
13
- super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
14
+ super(CAPITALIZED_FIELD, value, charset)
14
15
  self.parse
15
16
  self
16
17
  end
17
18
 
18
19
  def parse(val = value)
19
- unless val.blank?
20
+ unless Utilities.blank?(val)
20
21
  @element = Mail::ContentLocationElement.new(val)
21
22
  end
22
23
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
  #
3
4
  #
4
5
  #
@@ -12,13 +13,13 @@ module Mail
12
13
  self.charset = charset
13
14
  value = '7bit' if value.to_s =~ /7-?bits?/i
14
15
  value = '8bit' if value.to_s =~ /8-?bits?/i
15
- super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
16
+ super(CAPITALIZED_FIELD, value, charset)
16
17
  self.parse
17
18
  self
18
19
  end
19
20
 
20
21
  def parse(val = value)
21
- unless val.blank?
22
+ unless Utilities.blank?(val)
22
23
  @element = Mail::ContentTransferEncodingElement.new(val)
23
24
  end
24
25
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
  require 'mail/fields/common/parameter_hash'
3
4
 
4
5
  module Mail
@@ -17,16 +18,16 @@ module Mail
17
18
  @main_type = nil
18
19
  @sub_type = nil
19
20
  @parameters = nil
20
- value = strip_field(FIELD_NAME, value)
21
+ value = value.to_s
21
22
  end
22
- ensure_filename_quoted(value)
23
+ value = ensure_filename_quoted(value)
23
24
  super(CAPITALIZED_FIELD, value, charset)
24
25
  self.parse
25
26
  self
26
27
  end
27
28
 
28
29
  def parse(val = value)
29
- unless val.blank?
30
+ unless Utilities.blank?(val)
30
31
  self.value = val
31
32
  @element = nil
32
33
  element
@@ -144,9 +145,7 @@ module Mail
144
145
  # TODO: check if there are cases where whitespace is not a separator
145
146
  val = val.
146
147
  gsub(/\s*=\s*/,'='). # remove whitespaces around equal sign
147
- tr(' ',';').
148
- squeeze(';').
149
- gsub(';', '; '). #use '; ' as a separator (or EOL)
148
+ gsub(/[; ]+/, '; '). #use '; ' as a separator (or EOL)
150
149
  gsub(/;\s*$/,'') #remove trailing to keep examples below
151
150
 
152
151
  if val =~ /(boundary=(\S*))/i
@@ -156,9 +155,6 @@ module Mail
156
155
  end
157
156
 
158
157
  case
159
- when val.chomp =~ /^\s*([\w\-]+)\/([\w\-]+)\s*;;+(.*)$/i
160
- # Handles 'text/plain;; format="flowed"' (double semi colon)
161
- "#{$1}/#{$2}; #{$3}"
162
158
  when val.chomp =~ /^\s*([\w\-]+)\/([\w\-]+)\s*;\s?(ISO[\w\-]+)$/i
163
159
  # Microsoft helper:
164
160
  # Handles 'type/subtype;ISO-8559-1'
@@ -179,13 +175,13 @@ module Mail
179
175
  # and: audio/x-midi;\r\n\sname=Part .exe
180
176
  params = $2.to_s.split(/\s+/)
181
177
  params = params.map { |i| i.to_s.chomp.strip }
182
- params = params.map { |i| i.split(/\s*\=\s*/) }
178
+ params = params.map { |i| i.split(/\s*\=\s*/, 2) }
183
179
  params = params.map { |i| "#{i[0]}=#{dquote(i[1].to_s.gsub(/;$/,""))}" }.join('; ')
184
180
  "#{type}; #{params}"
185
181
  when val =~ /^\s*$/
186
182
  'text/plain'
187
183
  else
188
- ''
184
+ val
189
185
  end
190
186
  end
191
187
 
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
  #
3
4
  # = Date Field
4
5
  #
@@ -33,12 +34,11 @@ module Mail
33
34
 
34
35
  def initialize(value = nil, charset = 'utf-8')
35
36
  self.charset = charset
36
- if value.blank?
37
+ if Utilities.blank?(value)
37
38
  value = ::DateTime.now.strftime('%a, %d %b %Y %H:%M:%S %z')
38
39
  else
39
- value = strip_field(FIELD_NAME, value)
40
- value.to_s.gsub!(/\(.*?\)/, '')
41
- value = ::DateTime.parse(value.to_s.squeeze(" ")).strftime('%a, %d %b %Y %H:%M:%S %z')
40
+ value = value.to_s.gsub(/\(.*?\)/, '').squeeze(' ')
41
+ value = ::DateTime.parse(value).strftime('%a, %d %b %Y %H:%M:%S %z')
42
42
  end
43
43
  super(CAPITALIZED_FIELD, value, charset)
44
44
  rescue ArgumentError => e
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
  #
3
4
  # = From Field
4
5
  #
@@ -38,8 +39,7 @@ module Mail
38
39
 
39
40
  def initialize(value = nil, charset = 'utf-8')
40
41
  self.charset = charset
41
- super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
42
- self.parse
42
+ super(CAPITALIZED_FIELD, value, charset)
43
43
  self
44
44
  end
45
45
 
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
  #
3
4
  # = In-Reply-To Field
4
5
  #
@@ -39,7 +40,7 @@ module Mail
39
40
  def initialize(value = nil, charset = 'utf-8')
40
41
  self.charset = charset
41
42
  value = value.join("\r\n\s") if value.is_a?(Array)
42
- super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
43
+ super(CAPITALIZED_FIELD, value, charset)
43
44
  self.parse
44
45
  self
45
46
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
  #
3
4
  # keywords = "Keywords:" phrase *("," phrase) CRLF
4
5
  module Mail
@@ -9,13 +10,12 @@ module Mail
9
10
 
10
11
  def initialize(value = nil, charset = 'utf-8')
11
12
  self.charset = charset
12
- super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
13
- self.parse
13
+ super(CAPITALIZED_FIELD, value, charset)
14
14
  self
15
15
  end
16
16
 
17
17
  def parse(val = value)
18
- unless val.blank?
18
+ unless Utilities.blank?(val)
19
19
  @phrase_list ||= PhraseList.new(value)
20
20
  end
21
21
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
  #
3
4
  # = Message-ID Field
4
5
  #
@@ -41,11 +42,11 @@ module Mail
41
42
  def initialize(value = nil, charset = 'utf-8')
42
43
  self.charset = charset
43
44
  @uniq = 1
44
- if value.blank?
45
+ if Utilities.blank?(value)
45
46
  self.name = CAPITALIZED_FIELD
46
47
  self.value = generate_message_id
47
48
  else
48
- super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
49
+ super(CAPITALIZED_FIELD, value, charset)
49
50
  end
50
51
  self.parse
51
52
  self
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
  #
3
4
  #
4
5
  #
@@ -10,17 +11,17 @@ module Mail
10
11
 
11
12
  def initialize(value = nil, charset = 'utf-8')
12
13
  self.charset = charset
13
- if value.blank?
14
+ if Utilities.blank?(value)
14
15
  value = '1.0'
15
16
  end
16
- super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
17
+ super(CAPITALIZED_FIELD, value, charset)
17
18
  self.parse
18
19
  self
19
20
 
20
21
  end
21
22
 
22
23
  def parse(val = value)
23
- unless val.blank?
24
+ unless Utilities.blank?(val)
24
25
  @element = Mail::MimeVersionElement.new(val)
25
26
  end
26
27
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
  #
3
4
  # The field names of any optional-field MUST NOT be identical to any
4
5
  # field name specified elsewhere in this standard.
@@ -8,6 +9,9 @@ require 'mail/fields/unstructured_field'
8
9
 
9
10
  module Mail
10
11
  class OptionalField < UnstructuredField
11
-
12
+ private
13
+ def do_encode
14
+ "#{wrapped_value}\r\n"
15
+ end
12
16
  end
13
17
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
  #
3
4
  # trace = [return]
4
5
  # 1*received
@@ -27,14 +28,14 @@ module Mail
27
28
 
28
29
  def initialize(value = nil, charset = 'utf-8')
29
30
  self.charset = charset
30
- super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
31
+ super(CAPITALIZED_FIELD, value, charset)
31
32
  self.parse
32
33
  self
33
34
 
34
35
  end
35
36
 
36
37
  def parse(val = value)
37
- unless val.blank?
38
+ unless Utilities.blank?(val)
38
39
  @element = Mail::ReceivedElement.new(val)
39
40
  end
40
41
  end
@@ -56,7 +57,7 @@ module Mail
56
57
  end
57
58
 
58
59
  def encoded
59
- if value.blank?
60
+ if Utilities.blank?(value)
60
61
  "#{CAPITALIZED_FIELD}: \r\n"
61
62
  else
62
63
  "#{CAPITALIZED_FIELD}: #{info}; #{formatted_date}\r\n"
@@ -64,7 +65,7 @@ module Mail
64
65
  end
65
66
 
66
67
  def decoded
67
- if value.blank?
68
+ if Utilities.blank?(value)
68
69
  ""
69
70
  else
70
71
  "#{info}; #{formatted_date}"
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
  #
3
4
  # = References Field
4
5
  #
@@ -39,7 +40,7 @@ module Mail
39
40
  def initialize(value = nil, charset = 'utf-8')
40
41
  self.charset = charset
41
42
  value = value.join("\r\n\s") if value.is_a?(Array)
42
- super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
43
+ super(CAPITALIZED_FIELD, value, charset)
43
44
  self.parse
44
45
  self
45
46
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
  #
3
4
  # = Reply-To Field
4
5
  #
@@ -38,8 +39,7 @@ module Mail
38
39
 
39
40
  def initialize(value = nil, charset = 'utf-8')
40
41
  self.charset = charset
41
- super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
42
- self.parse
42
+ super(CAPITALIZED_FIELD, value, charset)
43
43
  self
44
44
  end
45
45
 
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
  #
3
4
  # = Resent-Bcc Field
4
5
  #
@@ -38,8 +39,7 @@ module Mail
38
39
 
39
40
  def initialize(value = nil, charset = 'utf-8')
40
41
  self.charset = charset
41
- super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
42
- self.parse
42
+ super(CAPITALIZED_FIELD, value, charset)
43
43
  self
44
44
  end
45
45