mail 2.6.3 → 2.6.4.rc2

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 (70) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.rdoc +22 -0
  3. data/Gemfile +1 -5
  4. data/MIT-LICENSE +1 -1
  5. data/README.md +38 -2
  6. data/Rakefile +2 -2
  7. data/lib/mail/body.rb +4 -4
  8. data/lib/mail/check_delivery_params.rb +3 -3
  9. data/lib/mail/constants.rb +3 -2
  10. data/lib/mail/core_extensions/string.rb +0 -26
  11. data/lib/mail/elements/address.rb +7 -7
  12. data/lib/mail/encodings/8bit.rb +7 -2
  13. data/lib/mail/encodings/base64.rb +6 -1
  14. data/lib/mail/encodings/quoted_printable.rb +8 -3
  15. data/lib/mail/encodings/transfer_encoding.rb +26 -17
  16. data/lib/mail/encodings.rb +25 -28
  17. data/lib/mail/field.rb +18 -4
  18. data/lib/mail/fields/bcc_field.rb +14 -3
  19. data/lib/mail/fields/cc_field.rb +0 -1
  20. data/lib/mail/fields/common/common_address.rb +7 -7
  21. data/lib/mail/fields/common/common_date.rb +1 -1
  22. data/lib/mail/fields/common/common_field.rb +1 -1
  23. data/lib/mail/fields/common/common_message_id.rb +2 -2
  24. data/lib/mail/fields/content_disposition_field.rb +11 -11
  25. data/lib/mail/fields/content_id_field.rb +2 -2
  26. data/lib/mail/fields/content_location_field.rb +1 -1
  27. data/lib/mail/fields/content_transfer_encoding_field.rb +1 -1
  28. data/lib/mail/fields/content_type_field.rb +1 -1
  29. data/lib/mail/fields/date_field.rb +1 -1
  30. data/lib/mail/fields/from_field.rb +0 -1
  31. data/lib/mail/fields/keywords_field.rb +1 -2
  32. data/lib/mail/fields/message_id_field.rb +1 -1
  33. data/lib/mail/fields/mime_version_field.rb +2 -2
  34. data/lib/mail/fields/received_field.rb +3 -3
  35. data/lib/mail/fields/reply_to_field.rb +0 -1
  36. data/lib/mail/fields/resent_bcc_field.rb +0 -1
  37. data/lib/mail/fields/resent_cc_field.rb +0 -1
  38. data/lib/mail/fields/resent_date_field.rb +1 -1
  39. data/lib/mail/fields/resent_from_field.rb +0 -1
  40. data/lib/mail/fields/resent_sender_field.rb +0 -1
  41. data/lib/mail/fields/resent_to_field.rb +0 -1
  42. data/lib/mail/fields/return_path_field.rb +0 -1
  43. data/lib/mail/fields/sender_field.rb +0 -1
  44. data/lib/mail/fields/to_field.rb +0 -1
  45. data/lib/mail/fields/unstructured_field.rb +2 -2
  46. data/lib/mail/header.rb +5 -5
  47. data/lib/mail/matchers/attachment_matchers.rb +28 -0
  48. data/lib/mail/matchers/has_sent_mail.rb +30 -7
  49. data/lib/mail/message.rb +16 -22
  50. data/lib/mail/multibyte/unicode.rb +20 -16
  51. data/lib/mail/network/delivery_methods/exim.rb +1 -1
  52. data/lib/mail/network/delivery_methods/sendmail.rb +1 -1
  53. data/lib/mail/parsers/address_lists_parser.rb +1 -1
  54. data/lib/mail/parsers/content_disposition_parser.rb +1 -1
  55. data/lib/mail/parsers/content_location_parser.rb +1 -1
  56. data/lib/mail/parsers/content_transfer_encoding_parser.rb +1 -1
  57. data/lib/mail/parsers/envelope_from_parser.rb +1 -1
  58. data/lib/mail/parsers/message_ids_parser.rb +1 -1
  59. data/lib/mail/parsers/mime_version_parser.rb +1 -1
  60. data/lib/mail/part.rb +4 -2
  61. data/lib/mail/parts_list.rb +25 -8
  62. data/lib/mail/utilities.rb +36 -0
  63. data/lib/mail/values/unicode_tables.dat +0 -0
  64. data/lib/mail/version.rb +2 -2
  65. data/lib/mail/version_specific/ruby_1_8.rb +10 -4
  66. data/lib/mail/version_specific/ruby_1_9.rb +39 -10
  67. data/lib/mail.rb +8 -3
  68. metadata +10 -11
  69. data/lib/mail/core_extensions/nil.rb +0 -19
  70. data/lib/mail/core_extensions/object.rb +0 -13
@@ -5,7 +5,7 @@ module Mail
5
5
  module CommonAddress # :nodoc:
6
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
@@ -84,10 +84,10 @@ module Mail
84
84
  case
85
85
  when val.nil?
86
86
  raise ArgumentError, "Need to pass an address to <<"
87
- when val.blank?
87
+ when Utilities.blank?(val)
88
88
  parse(encoded)
89
89
  else
90
- self.value = [self.value, val].reject {|a| a.blank? }.join(", ")
90
+ self.value = [self.value, val].reject {|a| Utilities.blank?(a) }.join(", ")
91
91
  end
92
92
  end
93
93
 
@@ -99,22 +99,22 @@ module Mail
99
99
  private
100
100
 
101
101
  def do_encode(field_name)
102
- return '' if value.blank?
102
+ return '' if Utilities.blank?(value)
103
103
  address_array = address_list.addresses.reject { |a| encoded_group_addresses.include?(a.encoded) }.compact.map { |a| a.encoded }
104
104
  address_text = address_array.join(", \r\n\s")
105
105
  group_array = groups.map { |k,v| "#{k}: #{v.map { |a| a.encoded }.join(", \r\n\s")};" }
106
106
  group_text = group_array.join(" \r\n\s")
107
- return_array = [address_text, group_text].reject { |a| a.blank? }
107
+ return_array = [address_text, group_text].reject { |a| Utilities.blank?(a) }
108
108
  "#{field_name}: #{return_array.join(", \r\n\s")}\r\n"
109
109
  end
110
110
 
111
111
  def do_decode
112
- return nil if value.blank?
112
+ return nil if Utilities.blank?(value)
113
113
  address_array = address_list.addresses.reject { |a| decoded_group_addresses.include?(a.decoded) }.map { |a| a.decoded }
114
114
  address_text = address_array.join(", ")
115
115
  group_array = groups.map { |k,v| "#{k}: #{v.map { |a| a.decoded }.join(", ")};" }
116
116
  group_text = group_array.join(" ")
117
- return_array = [address_text, group_text].reject { |a| a.blank? }
117
+ return_array = [address_text, group_text].reject { |a| Utilities.blank?(a) }
118
118
  return_array.join(", ")
119
119
  end
120
120
 
@@ -11,7 +11,7 @@ module Mail
11
11
  end
12
12
 
13
13
  def parse(val = value)
14
- unless val.blank?
14
+ unless Utilities.blank?(val)
15
15
  @element = Mail::DateTimeElement.new(val)
16
16
  else
17
17
  nil
@@ -44,7 +44,7 @@ module Mail
44
44
  if value.is_a?(Array)
45
45
  value
46
46
  else
47
- value.to_s.sub(/#{field_name}:\s+/i, EMPTY)
47
+ value.to_s.sub(/\A#{field_name}:\s+/i, EMPTY)
48
48
  end
49
49
  end
50
50
 
@@ -2,11 +2,11 @@
2
2
  module Mail
3
3
  module CommonMessageId # :nodoc:
4
4
  def element
5
- @element ||= Mail::MessageIdsElement.new(value) unless value.blank?
5
+ @element ||= Mail::MessageIdsElement.new(value) unless Utilities.blank?(value)
6
6
  end
7
7
 
8
8
  def parse(val = value)
9
- unless val.blank?
9
+ unless Utilities.blank?(val)
10
10
  @element = Mail::MessageIdsElement.new(val)
11
11
  else
12
12
  nil
@@ -3,10 +3,10 @@ require 'mail/fields/common/parameter_hash'
3
3
 
4
4
  module Mail
5
5
  class ContentDispositionField < StructuredField
6
-
6
+
7
7
  FIELD_NAME = 'content-disposition'
8
8
  CAPITALIZED_FIELD = 'Content-Disposition'
9
-
9
+
10
10
  def initialize(value = nil, charset = 'utf-8')
11
11
  self.charset = charset
12
12
  ensure_filename_quoted(value)
@@ -14,13 +14,13 @@ module Mail
14
14
  self.parse
15
15
  self
16
16
  end
17
-
17
+
18
18
  def parse(val = value)
19
- unless val.blank?
19
+ unless Utilities.blank?(val)
20
20
  @element = Mail::ContentDispositionElement.new(val)
21
21
  end
22
22
  end
23
-
23
+
24
24
  def element
25
25
  @element ||= Mail::ContentDispositionElement.new(value)
26
26
  end
@@ -28,20 +28,20 @@ module Mail
28
28
  def disposition_type
29
29
  element.disposition_type
30
30
  end
31
-
31
+
32
32
  def parameters
33
33
  @parameters = ParameterHash.new
34
- element.parameters.each { |p| @parameters.merge!(p) }
34
+ element.parameters.each { |p| @parameters.merge!(p) } unless element.parameters.nil?
35
35
  @parameters
36
36
  end
37
37
 
38
38
  def filename
39
39
  case
40
- when !parameters['filename'].blank?
40
+ when !Utilities.blank?(parameters['filename'])
41
41
  @filename = parameters['filename']
42
- when !parameters['name'].blank?
42
+ when !Utilities.blank?(parameters['name'])
43
43
  @filename = parameters['name']
44
- else
44
+ else
45
45
  @filename = nil
46
46
  end
47
47
  @filename
@@ -56,7 +56,7 @@ module Mail
56
56
  end
57
57
  "#{CAPITALIZED_FIELD}: #{disposition_type}" + p
58
58
  end
59
-
59
+
60
60
  def decoded
61
61
  if parameters.length > 0
62
62
  p = "; #{parameters.decoded}"
@@ -11,7 +11,7 @@ module Mail
11
11
  def initialize(value = nil, charset = 'utf-8')
12
12
  self.charset = charset
13
13
  @uniq = 1
14
- if value.blank?
14
+ if Utilities.blank?(value)
15
15
  value = generate_content_id
16
16
  else
17
17
  value = strip_field(FIELD_NAME, value)
@@ -22,7 +22,7 @@ module Mail
22
22
  end
23
23
 
24
24
  def parse(val = value)
25
- unless val.blank?
25
+ unless Utilities.blank?(val)
26
26
  @element = Mail::MessageIdsElement.new(val)
27
27
  end
28
28
  end
@@ -16,7 +16,7 @@ module Mail
16
16
  end
17
17
 
18
18
  def parse(val = value)
19
- unless val.blank?
19
+ unless Utilities.blank?(val)
20
20
  @element = Mail::ContentLocationElement.new(val)
21
21
  end
22
22
  end
@@ -18,7 +18,7 @@ module Mail
18
18
  end
19
19
 
20
20
  def parse(val = value)
21
- unless val.blank?
21
+ unless Utilities.blank?(val)
22
22
  @element = Mail::ContentTransferEncodingElement.new(val)
23
23
  end
24
24
  end
@@ -26,7 +26,7 @@ module Mail
26
26
  end
27
27
 
28
28
  def parse(val = value)
29
- unless val.blank?
29
+ unless Utilities.blank?(val)
30
30
  self.value = val
31
31
  @element = nil
32
32
  element
@@ -33,7 +33,7 @@ module Mail
33
33
 
34
34
  def initialize(value = nil, charset = 'utf-8')
35
35
  self.charset = charset
36
- if value.blank?
36
+ if Utilities.blank?(value)
37
37
  value = ::DateTime.now.strftime('%a, %d %b %Y %H:%M:%S %z')
38
38
  else
39
39
  value = strip_field(FIELD_NAME, value)
@@ -39,7 +39,6 @@ module Mail
39
39
  def initialize(value = nil, charset = 'utf-8')
40
40
  self.charset = charset
41
41
  super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
42
- self.parse
43
42
  self
44
43
  end
45
44
 
@@ -10,12 +10,11 @@ module Mail
10
10
  def initialize(value = nil, charset = 'utf-8')
11
11
  self.charset = charset
12
12
  super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
13
- self.parse
14
13
  self
15
14
  end
16
15
 
17
16
  def parse(val = value)
18
- unless val.blank?
17
+ unless Utilities.blank?(val)
19
18
  @phrase_list ||= PhraseList.new(value)
20
19
  end
21
20
  end
@@ -41,7 +41,7 @@ module Mail
41
41
  def initialize(value = nil, charset = 'utf-8')
42
42
  self.charset = charset
43
43
  @uniq = 1
44
- if value.blank?
44
+ if Utilities.blank?(value)
45
45
  self.name = CAPITALIZED_FIELD
46
46
  self.value = generate_message_id
47
47
  else
@@ -10,7 +10,7 @@ module Mail
10
10
 
11
11
  def initialize(value = nil, charset = 'utf-8')
12
12
  self.charset = charset
13
- if value.blank?
13
+ if Utilities.blank?(value)
14
14
  value = '1.0'
15
15
  end
16
16
  super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
@@ -20,7 +20,7 @@ module Mail
20
20
  end
21
21
 
22
22
  def parse(val = value)
23
- unless val.blank?
23
+ unless Utilities.blank?(val)
24
24
  @element = Mail::MimeVersionElement.new(val)
25
25
  end
26
26
  end
@@ -34,7 +34,7 @@ module Mail
34
34
  end
35
35
 
36
36
  def parse(val = value)
37
- unless val.blank?
37
+ unless Utilities.blank?(val)
38
38
  @element = Mail::ReceivedElement.new(val)
39
39
  end
40
40
  end
@@ -56,7 +56,7 @@ module Mail
56
56
  end
57
57
 
58
58
  def encoded
59
- if value.blank?
59
+ if Utilities.blank?(value)
60
60
  "#{CAPITALIZED_FIELD}: \r\n"
61
61
  else
62
62
  "#{CAPITALIZED_FIELD}: #{info}; #{formatted_date}\r\n"
@@ -64,7 +64,7 @@ module Mail
64
64
  end
65
65
 
66
66
  def decoded
67
- if value.blank?
67
+ if Utilities.blank?(value)
68
68
  ""
69
69
  else
70
70
  "#{info}; #{formatted_date}"
@@ -39,7 +39,6 @@ module Mail
39
39
  def initialize(value = nil, charset = 'utf-8')
40
40
  self.charset = charset
41
41
  super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
42
- self.parse
43
42
  self
44
43
  end
45
44
 
@@ -39,7 +39,6 @@ module Mail
39
39
  def initialize(value = nil, charset = 'utf-8')
40
40
  self.charset = charset
41
41
  super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
42
- self.parse
43
42
  self
44
43
  end
45
44
 
@@ -39,7 +39,6 @@ module Mail
39
39
  def initialize(value = nil, charset = 'utf-8')
40
40
  self.charset = charset
41
41
  super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
42
- self.parse
43
42
  self
44
43
  end
45
44
 
@@ -13,7 +13,7 @@ module Mail
13
13
 
14
14
  def initialize(value = nil, charset = 'utf-8')
15
15
  self.charset = charset
16
- if value.blank?
16
+ if Utilities.blank?(value)
17
17
  value = ::DateTime.now.strftime('%a, %d %b %Y %H:%M:%S %z')
18
18
  else
19
19
  value = strip_field(FIELD_NAME, value)
@@ -39,7 +39,6 @@ module Mail
39
39
  def initialize(value = nil, charset = 'utf-8')
40
40
  self.charset = charset
41
41
  super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
42
- self.parse
43
42
  self
44
43
  end
45
44
 
@@ -38,7 +38,6 @@ module Mail
38
38
  def initialize(value = nil, charset = 'utf-8')
39
39
  self.charset = charset
40
40
  super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
41
- self.parse
42
41
  self
43
42
  end
44
43
 
@@ -39,7 +39,6 @@ module Mail
39
39
  def initialize(value = nil, charset = 'utf-8')
40
40
  self.charset = charset
41
41
  super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
42
- self.parse
43
42
  self
44
43
  end
45
44
 
@@ -41,7 +41,6 @@ module Mail
41
41
  value = nil if value == '<>'
42
42
  self.charset = charset
43
43
  super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
44
- self.parse
45
44
  self
46
45
  end
47
46
 
@@ -39,7 +39,6 @@ module Mail
39
39
  def initialize(value = nil, charset = 'utf-8')
40
40
  self.charset = charset
41
41
  super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
42
- self.parse
43
42
  self
44
43
  end
45
44
 
@@ -39,7 +39,6 @@ module Mail
39
39
  def initialize(value = nil, charset = 'utf-8')
40
40
  self.charset = charset
41
41
  super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
42
- self.parse
43
42
  self
44
43
  end
45
44
 
@@ -70,7 +70,7 @@ module Mail
70
70
  end
71
71
 
72
72
  def do_decode
73
- value.blank? ? nil : Encodings.decode_encode(value, :decode)
73
+ Utilities.blank?(value) ? nil : Encodings.decode_encode(value, :decode)
74
74
  end
75
75
 
76
76
  # 2.2.3. Long Header Fields
@@ -143,7 +143,7 @@ module Mail
143
143
  while !words.empty?
144
144
  limit = 78 - prepend
145
145
  limit = limit - 7 - encoding.length if should_encode
146
- line = ""
146
+ line = String.new
147
147
  first_word = true
148
148
  while !words.empty?
149
149
  break unless word = words.first.dup
data/lib/mail/header.rb CHANGED
@@ -49,7 +49,7 @@ module Mail
49
49
  # me the example so we can fix it.
50
50
  def initialize(header_text = nil, charset = nil)
51
51
  @charset = charset
52
- self.raw_source = header_text.to_crlf.lstrip
52
+ self.raw_source = ::Mail::Utilities.to_crlf(header_text).lstrip
53
53
  split_header if header_text
54
54
  end
55
55
 
@@ -136,7 +136,7 @@ module Mail
136
136
  case
137
137
  when selected.length > 1
138
138
  selected.map { |f| f }
139
- when !selected.blank?
139
+ when !Utilities.blank?(selected)
140
140
  selected.first
141
141
  else
142
142
  nil
@@ -166,11 +166,11 @@ module Mail
166
166
 
167
167
  case
168
168
  # User wants to delete the field
169
- when !selected.blank? && value == nil
169
+ when !Utilities.blank?(selected) && value == nil
170
170
  fields.delete_if { |f| selected.include?(f) }
171
171
 
172
172
  # User wants to change the field
173
- when !selected.blank? && limited_field?(fn)
173
+ when !Utilities.blank?(selected) && limited_field?(fn)
174
174
  selected.first.update(fn, value)
175
175
 
176
176
  # User wants to create the field
@@ -204,7 +204,7 @@ module Mail
204
204
  content-id content-disposition content-location]
205
205
 
206
206
  def encoded
207
- buffer = ''
207
+ buffer = String.new
208
208
  buffer.force_encoding('us-ascii') if buffer.respond_to?(:force_encoding)
209
209
  fields.each do |field|
210
210
  buffer << field.encoded
@@ -0,0 +1,28 @@
1
+ module Mail
2
+ module Matchers
3
+ def any_attachment
4
+ AnyAttachmentMatcher.new
5
+ end
6
+
7
+ def an_attachment_with_filename(filename)
8
+ AttachmentFilenameMatcher.new(filename)
9
+ end
10
+
11
+ class AnyAttachmentMatcher
12
+ def ===(other)
13
+ other.attachment?
14
+ end
15
+ end
16
+
17
+ class AttachmentFilenameMatcher
18
+ attr_reader :filename
19
+ def initialize(filename)
20
+ @filename = filename
21
+ end
22
+
23
+ def ===(other)
24
+ other.attachment? && other.filename == filename
25
+ end
26
+ end
27
+ end
28
+ end
@@ -42,15 +42,25 @@ module Mail
42
42
 
43
43
  def bcc(recipient_or_list)
44
44
  @blind_copy_recipients ||= []
45
+ @blind_copy_recipients.concat(Array(recipient_or_list))
46
+ self
47
+ end
45
48
 
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
49
+ def with_attachments(attachments)
50
+ @attachments ||= []
51
+ @attachments.concat(Array(attachments))
52
+ self
53
+ end
54
+
55
+ def with_no_attachments
56
+ @having_attachments = false
51
57
  self
52
58
  end
53
59
 
60
+ def with_any_attachments
61
+ @having_attachments = true
62
+ self
63
+ end
54
64
 
55
65
  def with_subject(subject)
56
66
  @subject = subject
@@ -95,8 +105,10 @@ module Mail
95
105
 
96
106
  def filter_matched_deliveries(deliveries)
97
107
  candidate_deliveries = deliveries
98
-
99
- %w(sender recipients copy_recipients blind_copy_recipients subject subject_matcher body body_matcher).each do |modifier_name|
108
+ modifiers =
109
+ %w(sender recipients copy_recipients blind_copy_recipients subject
110
+ subject_matcher body body_matcher having_attachments attachments)
111
+ modifiers.each do |modifier_name|
100
112
  next unless instance_variable_defined?("@#{modifier_name}")
101
113
  candidate_deliveries = candidate_deliveries.select{|matching_delivery| self.send("matches_on_#{modifier_name}?", matching_delivery)}
102
114
  end
@@ -128,6 +140,17 @@ module Mail
128
140
  @subject_matcher.match delivery.subject
129
141
  end
130
142
 
143
+ def matches_on_having_attachments?(delivery)
144
+ @having_attachments && delivery.attachments.any? ||
145
+ (!@having_attachments && delivery.attachments.none?)
146
+ end
147
+
148
+ def matches_on_attachments?(delivery)
149
+ @attachments.each_with_index.inject( true ) do |sent_attachments, (attachment, index)|
150
+ sent_attachments &&= (attachment === delivery.attachments[index])
151
+ end
152
+ end
153
+
131
154
  def matches_on_body?(delivery)
132
155
  delivery.body == @body
133
156
  end
data/lib/mail/message.rb CHANGED
@@ -1415,7 +1415,7 @@ module Mail
1415
1415
  end
1416
1416
 
1417
1417
  def has_content_transfer_encoding?
1418
- header[:content_transfer_encoding] && header[:content_transfer_encoding].errors.blank?
1418
+ header[:content_transfer_encoding] && Utilities.blank?(header[:content_transfer_encoding].errors)
1419
1419
  end
1420
1420
 
1421
1421
  def has_transfer_encoding? # :nodoc:
@@ -1669,6 +1669,8 @@ module Mail
1669
1669
  def html_part=(msg)
1670
1670
  # Assign the html part and set multipart/alternative if there's a text part.
1671
1671
  if msg
1672
+ msg = Mail::Part.new(:body => msg) unless msg.kind_of?(Mail::Message)
1673
+
1672
1674
  @html_part = msg
1673
1675
  @html_part.content_type = 'text/html' unless @html_part.has_content_type?
1674
1676
  add_multipart_alternate_header if text_part
@@ -1691,6 +1693,8 @@ module Mail
1691
1693
  def text_part=(msg)
1692
1694
  # Assign the text part and set multipart/alternative if there's an html part.
1693
1695
  if msg
1696
+ msg = Mail::Part.new(:body => msg) unless msg.kind_of?(Mail::Message)
1697
+
1694
1698
  @text_part = msg
1695
1699
  @text_part.content_type = 'text/plain' unless @text_part.has_content_type?
1696
1700
  add_multipart_alternate_header if html_part
@@ -1709,7 +1713,7 @@ module Mail
1709
1713
 
1710
1714
  # Adds a part to the parts list or creates the part list
1711
1715
  def add_part(part)
1712
- if !body.multipart? && !self.body.decoded.blank?
1716
+ if !body.multipart? && !Utilities.blank?(self.body.decoded)
1713
1717
  @text_part = Mail::Part.new('Content-Type: text/plain;')
1714
1718
  @text_part.body = body.decoded
1715
1719
  self.body << @text_part
@@ -1765,14 +1769,17 @@ module Mail
1765
1769
  #
1766
1770
  # See also #attachments
1767
1771
  def add_file(values)
1768
- convert_to_multipart unless self.multipart? || self.body.decoded.blank?
1772
+ convert_to_multipart unless self.multipart? || Utilities.blank?(self.body.decoded)
1769
1773
  add_multipart_mixed_header
1770
1774
  if values.is_a?(String)
1771
1775
  basename = File.basename(values)
1772
1776
  filedata = File.open(values, 'rb') { |f| f.read }
1773
1777
  else
1774
1778
  basename = values[:filename]
1775
- filedata = values[:content] || File.open(values[:filename], 'rb') { |f| f.read }
1779
+ filedata = values
1780
+ unless filedata[:content]
1781
+ filedata = values.merge(:content=>File.open(values[:filename], 'rb') { |f| f.read })
1782
+ end
1776
1783
  end
1777
1784
  self.attachments[basename] = filedata
1778
1785
  end
@@ -1857,7 +1864,7 @@ module Mail
1857
1864
  case
1858
1865
  when k == 'delivery_handler'
1859
1866
  begin
1860
- m.delivery_handler = Object.const_get(v) unless v.blank?
1867
+ m.delivery_handler = Object.const_get(v) unless Utilities.blank?(v)
1861
1868
  rescue NameError
1862
1869
  end
1863
1870
  when k == 'transport_encoding'
@@ -1987,7 +1994,7 @@ module Mail
1987
1994
 
1988
1995
  def raw_source=(value)
1989
1996
  value = value.dup.force_encoding(Encoding::BINARY) if RUBY_VERSION >= "1.9.1"
1990
- @raw_source = value.to_crlf
1997
+ @raw_source = ::Mail::Utilities.to_crlf(value)
1991
1998
  end
1992
1999
 
1993
2000
  # see comments to body=. We take data and process it lazily
@@ -2020,7 +2027,7 @@ module Mail
2020
2027
  raw_string = raw_source.to_s
2021
2028
  if match_data = raw_source.to_s.match(/\AFrom\s(#{TEXT}+)#{CRLF}/m)
2022
2029
  set_envelope(match_data[1])
2023
- self.raw_source = raw_string.sub(match_data[0], "")
2030
+ self.raw_source = raw_string.sub(match_data[0], "")
2024
2031
  end
2025
2032
  end
2026
2033
 
@@ -2046,7 +2053,7 @@ module Mail
2046
2053
  add_required_message_fields
2047
2054
  add_multipart_mixed_header if body.multipart?
2048
2055
  add_content_type unless has_content_type?
2049
- add_charset unless has_charset?
2056
+ add_charset if text? && !has_charset?
2050
2057
  add_content_transfer_encoding unless has_content_transfer_encoding?
2051
2058
  end
2052
2059
 
@@ -2146,20 +2153,7 @@ module Mail
2146
2153
  end
2147
2154
 
2148
2155
  def decode_body_as_text
2149
- body_text = decode_body
2150
- if charset
2151
- if RUBY_VERSION < '1.9'
2152
- require 'iconv'
2153
- return Iconv.conv("UTF-8//TRANSLIT//IGNORE", charset, body_text)
2154
- else
2155
- if encoding = Encoding.find(charset) rescue nil
2156
- body_text.force_encoding(encoding)
2157
- return body_text.encode(Encoding::UTF_8, :undef => :replace, :invalid => :replace, :replace => '')
2158
- end
2159
- end
2160
- end
2161
- body_text
2156
+ Encodings.transcode_charset decode_body, charset, 'UTF-8'
2162
2157
  end
2163
-
2164
2158
  end
2165
2159
  end