mail 2.6.3 → 2.6.4.rc1

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 (68) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.rdoc +22 -0
  3. data/Gemfile +1 -4
  4. data/MIT-LICENSE +1 -1
  5. data/README.md +38 -2
  6. data/Rakefile +2 -2
  7. data/lib/mail.rb +8 -2
  8. data/lib/mail/body.rb +4 -4
  9. data/lib/mail/check_delivery_params.rb +3 -3
  10. data/lib/mail/constants.rb +2 -1
  11. data/lib/mail/core_extensions/nil.rb +0 -6
  12. data/lib/mail/core_extensions/string.rb +0 -6
  13. data/lib/mail/elements/address.rb +7 -7
  14. data/lib/mail/encodings.rb +25 -28
  15. data/lib/mail/encodings/8bit.rb +5 -0
  16. data/lib/mail/encodings/base64.rb +5 -0
  17. data/lib/mail/encodings/quoted_printable.rb +6 -1
  18. data/lib/mail/encodings/transfer_encoding.rb +26 -17
  19. data/lib/mail/field.rb +18 -4
  20. data/lib/mail/fields/bcc_field.rb +14 -3
  21. data/lib/mail/fields/cc_field.rb +0 -1
  22. data/lib/mail/fields/common/common_address.rb +7 -7
  23. data/lib/mail/fields/common/common_date.rb +1 -1
  24. data/lib/mail/fields/common/common_field.rb +1 -1
  25. data/lib/mail/fields/common/common_message_id.rb +2 -2
  26. data/lib/mail/fields/content_disposition_field.rb +11 -11
  27. data/lib/mail/fields/content_id_field.rb +2 -2
  28. data/lib/mail/fields/content_location_field.rb +1 -1
  29. data/lib/mail/fields/content_transfer_encoding_field.rb +1 -1
  30. data/lib/mail/fields/content_type_field.rb +1 -1
  31. data/lib/mail/fields/date_field.rb +1 -1
  32. data/lib/mail/fields/from_field.rb +0 -1
  33. data/lib/mail/fields/keywords_field.rb +1 -2
  34. data/lib/mail/fields/message_id_field.rb +1 -1
  35. data/lib/mail/fields/mime_version_field.rb +2 -2
  36. data/lib/mail/fields/received_field.rb +3 -3
  37. data/lib/mail/fields/reply_to_field.rb +0 -1
  38. data/lib/mail/fields/resent_bcc_field.rb +0 -1
  39. data/lib/mail/fields/resent_cc_field.rb +0 -1
  40. data/lib/mail/fields/resent_date_field.rb +1 -1
  41. data/lib/mail/fields/resent_from_field.rb +0 -1
  42. data/lib/mail/fields/resent_sender_field.rb +0 -1
  43. data/lib/mail/fields/resent_to_field.rb +0 -1
  44. data/lib/mail/fields/return_path_field.rb +0 -1
  45. data/lib/mail/fields/sender_field.rb +0 -1
  46. data/lib/mail/fields/to_field.rb +0 -1
  47. data/lib/mail/fields/unstructured_field.rb +1 -1
  48. data/lib/mail/header.rb +3 -3
  49. data/lib/mail/matchers/attachment_matchers.rb +28 -0
  50. data/lib/mail/matchers/has_sent_mail.rb +30 -7
  51. data/lib/mail/message.rb +15 -21
  52. data/lib/mail/multibyte/unicode.rb +20 -16
  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 +15 -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. metadata +8 -8
  68. data/lib/mail/core_extensions/object.rb +0 -13
@@ -1,8 +1,27 @@
1
+ require 'delegate'
2
+
1
3
  module Mail
2
- class PartsList < Array
4
+ class PartsList < DelegateClass(Array)
5
+ attr_reader :parts
6
+
7
+ def initialize(*args)
8
+ @parts = Array.new(*args)
9
+ super @parts
10
+ end
11
+
12
+ # The #encode_with and #to_yaml methods are just implemented
13
+ # for the sake of backward compatibility ; the delegator does
14
+ # not correctly delegate these calls to the delegated object
15
+ def encode_with(coder) # :nodoc:
16
+ coder.represent_object(nil, @parts)
17
+ end
18
+
19
+ def to_yaml(options = {}) # :nodoc:
20
+ @parts.to_yaml(options)
21
+ end
3
22
 
4
23
  def attachments
5
- Mail::AttachmentsList.new(self)
24
+ Mail::AttachmentsList.new(@parts)
6
25
  end
7
26
 
8
27
  def collect
@@ -14,8 +33,6 @@ module Mail
14
33
  to_a
15
34
  end
16
35
  end
17
-
18
- undef :map
19
36
  alias_method :map, :collect
20
37
 
21
38
  def map!
@@ -27,20 +44,20 @@ module Mail
27
44
  end
28
45
 
29
46
  def sort
30
- self.class.new(super)
47
+ self.class.new(@parts.sort)
31
48
  end
32
49
 
33
50
  def sort!(order)
34
51
  # stable sort should be used to maintain the relative order as the parts are added
35
52
  i = 0;
36
- sorted = self.sort_by do |a|
53
+ sorted = @parts.sort_by do |a|
37
54
  # OK, 10000 is arbitrary... if anyone actually wants to explicitly sort 10000 parts of a
38
55
  # single email message... please show me a use case and I'll put more work into this method,
39
56
  # in the meantime, it works :)
40
57
  [get_order_value(a, order), i += 1]
41
58
  end
42
- self.clear
43
- sorted.each { |p| self << p }
59
+ @parts.clear
60
+ sorted.each { |p| @parts << p }
44
61
  end
45
62
 
46
63
  private
@@ -221,5 +221,20 @@ module Mail
221
221
 
222
222
  end
223
223
 
224
+ # Returns true if the object is considered blank.
225
+ # A blank includes things like '', ' ', nil,
226
+ # and arrays and hashes that have nothing in them.
227
+ #
228
+ # This logic is mostly shared with ActiveSupport's blank?
229
+ def self.blank?(value)
230
+ if value.kind_of?(NilClass)
231
+ true
232
+ elsif value.kind_of?(String)
233
+ value !~ /\S/
234
+ else
235
+ value.respond_to?(:empty?) ? value.empty? : !value
236
+ end
237
+ end
238
+
224
239
  end
225
240
  end
@@ -3,8 +3,8 @@ module Mail
3
3
 
4
4
  MAJOR = 2
5
5
  MINOR = 6
6
- PATCH = 3
7
- BUILD = nil
6
+ PATCH = 4
7
+ BUILD = 'rc1'
8
8
 
9
9
  STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
10
10
 
@@ -54,11 +54,15 @@ module Mail
54
54
  klass.const_get( string )
55
55
  end
56
56
 
57
+ def Ruby18.transcode_charset(str, from_encoding, to_encoding = 'UTF-8')
58
+ Iconv.conv("#{normalize_iconv_charset_encoding(to_encoding)}//IGNORE", normalize_iconv_charset_encoding(from_encoding), str)
59
+ end
60
+
57
61
  def Ruby18.b_value_encode(str, encoding)
58
62
  # Ruby 1.8 requires an encoding to work
59
63
  raise ArgumentError, "Must supply an encoding" if encoding.nil?
60
64
  encoding = encoding.to_s.upcase.gsub('_', '-')
61
- [Encodings::Base64.encode(str), fix_encoding(encoding)]
65
+ [Encodings::Base64.encode(str), normalize_iconv_charset_encoding(encoding)]
62
66
  end
63
67
 
64
68
  def Ruby18.b_value_decode(str)
@@ -66,7 +70,7 @@ module Mail
66
70
  if match
67
71
  encoding = match[1]
68
72
  str = Ruby18.decode_base64(match[2])
69
- str = Iconv.conv('UTF-8//IGNORE', fix_encoding(encoding), str)
73
+ str = transcode_charset(str, encoding)
70
74
  end
71
75
  str
72
76
  end
@@ -86,7 +90,7 @@ module Mail
86
90
  # Remove trailing = if it exists in a Q encoding
87
91
  string = string.sub(/\=$/, '')
88
92
  str = Encodings::QuotedPrintable.decode(string)
89
- str = Iconv.conv('UTF-8//IGNORE', fix_encoding(encoding), str)
93
+ str = transcode_charset(str, encoding)
90
94
  end
91
95
  str
92
96
  end
@@ -103,7 +107,7 @@ module Mail
103
107
 
104
108
  private
105
109
 
106
- def Ruby18.fix_encoding(encoding)
110
+ def Ruby18.normalize_iconv_charset_encoding(encoding)
107
111
  case encoding.upcase
108
112
  when 'UTF8', 'UTF_8'
109
113
  'UTF-8'
@@ -111,6 +115,8 @@ module Mail
111
115
  'UTF-16BE'
112
116
  when 'UTF32', 'UTF-32'
113
117
  'UTF-32BE'
118
+ when 'KS_C_5601-1987'
119
+ 'CP949'
114
120
  else
115
121
  encoding
116
122
  end
@@ -73,6 +73,10 @@ module Mail
73
73
  klass.const_get( string )
74
74
  end
75
75
 
76
+ def Ruby19.transcode_charset(str, from_encoding, to_encoding = Encoding::UTF_8)
77
+ charset_encoder.encode(str.dup, from_encoding).encode(to_encoding, :undef => :replace, :invalid => :replace, :replace => '')
78
+ end
79
+
76
80
  def Ruby19.b_value_encode(str, encoding = nil)
77
81
  encoding = str.encoding.to_s
78
82
  [Ruby19.encode_base64(str), encoding]
@@ -140,37 +144,38 @@ module Mail
140
144
  # Encoding.list.map { |e| [e.to_s.upcase == pick_encoding(e.to_s.downcase.gsub("-", "")), e.to_s] }.select {|a,b| !b}
141
145
  # Encoding.list.map { |e| [e.to_s == pick_encoding(e.to_s), e.to_s] }.select {|a,b| !b}
142
146
  def Ruby19.pick_encoding(charset)
143
- case charset
147
+ charset = charset.to_s
148
+ encoding = case charset.downcase
144
149
 
145
150
  # ISO-8859-8-I etc. http://en.wikipedia.org/wiki/ISO-8859-8-I
146
- when /^iso-?8859-(\d+)(-i)?$/i
151
+ when /^iso[-_]?8859-(\d+)(-i)?$/
147
152
  "ISO-8859-#{$1}"
148
153
 
149
154
  # ISO-8859-15, ISO-2022-JP and alike
150
- when /iso-?(\d{4})-?(\w{1,2})/i
155
+ when /^iso[-_]?(\d{4})-?(\w{1,2})$/
151
156
  "ISO-#{$1}-#{$2}"
152
157
 
153
158
  # "ISO-2022-JP-KDDI" and alike
154
- when /iso-?(\d{4})-?(\w{1,2})-?(\w*)/i
159
+ when /^iso[-_]?(\d{4})-?(\w{1,2})-?(\w*)$/
155
160
  "ISO-#{$1}-#{$2}-#{$3}"
156
161
 
157
162
  # UTF-8, UTF-32BE and alike
158
- when /utf[\-_]?(\d{1,2})?(\w{1,2})/i
163
+ when /^utf[\-_]?(\d{1,2})?(\w{1,2})$/
159
164
  "UTF-#{$1}#{$2}".gsub(/\A(UTF-(?:16|32))\z/, '\\1BE')
160
165
 
161
166
  # Windows-1252 and alike
162
- when /Windows-?(.*)/i
167
+ when /^windows-?(.*)$/
163
168
  "Windows-#{$1}"
164
169
 
165
- when /^8bit$/
170
+ when '8bit'
166
171
  Encoding::ASCII_8BIT
167
172
 
168
173
  # alternatives/misspellings of us-ascii seen in the wild
169
- when /^iso-?646(-us)?$/i, /us=ascii/i
174
+ when /^iso[-_]?646(-us)?$/, 'us=ascii'
170
175
  Encoding::ASCII
171
176
 
172
177
  # Microsoft-specific alias for MACROMAN
173
- when /^macintosh$/i
178
+ when 'macintosh'
174
179
  Encoding::MACROMAN
175
180
 
176
181
  # Microsoft-specific alias for CP949 (Korean)
@@ -182,12 +187,36 @@ module Mail
182
187
  Encoding::Shift_JIS
183
188
 
184
189
  # GB2312 (Chinese charset) is a subset of GB18030 (its replacement)
185
- when /gb2312/i
190
+ when 'gb2312'
186
191
  Encoding::GB18030
187
192
 
193
+ when 'cp-850'
194
+ Encoding::CP850
195
+
196
+ when 'latin2'
197
+ Encoding::ISO_8859_2
198
+
188
199
  else
189
200
  charset
190
201
  end
202
+
203
+ convert_to_encoding(encoding)
204
+ end
205
+
206
+ class << self
207
+ private
208
+
209
+ def convert_to_encoding(encoding)
210
+ if encoding.is_a?(Encoding)
211
+ encoding
212
+ else
213
+ begin
214
+ Encoding.find(encoding)
215
+ rescue ArgumentError
216
+ Encoding::BINARY
217
+ end
218
+ end
219
+ end
191
220
  end
192
221
  end
193
222
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mail
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.6.3
4
+ version: 2.6.4.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mikel Lindsaar
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-03 00:00:00.000000000 Z
11
+ date: 2015-12-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mime-types
@@ -64,14 +64,14 @@ dependencies:
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: 3.0.0
67
+ version: '3.0'
68
68
  type: :development
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: 3.0.0
74
+ version: '3.0'
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: rdoc
77
77
  requirement: !ruby/object:Gem::Requirement
@@ -111,7 +111,6 @@ files:
111
111
  - lib/mail/configuration.rb
112
112
  - lib/mail/constants.rb
113
113
  - lib/mail/core_extensions/nil.rb
114
- - lib/mail/core_extensions/object.rb
115
114
  - lib/mail/core_extensions/smtp.rb
116
115
  - lib/mail/core_extensions/string.rb
117
116
  - lib/mail/core_extensions/string/access.rb
@@ -182,6 +181,7 @@ files:
182
181
  - lib/mail/header.rb
183
182
  - lib/mail/indifferent_hash.rb
184
183
  - lib/mail/mail.rb
184
+ - lib/mail/matchers/attachment_matchers.rb
185
185
  - lib/mail/matchers/has_sent_mail.rb
186
186
  - lib/mail/message.rb
187
187
  - lib/mail/multibyte.rb
@@ -265,12 +265,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
265
265
  version: '0'
266
266
  required_rubygems_version: !ruby/object:Gem::Requirement
267
267
  requirements:
268
- - - ">="
268
+ - - ">"
269
269
  - !ruby/object:Gem::Version
270
- version: '0'
270
+ version: 1.3.1
271
271
  requirements: []
272
272
  rubyforge_project:
273
- rubygems_version: 2.4.2
273
+ rubygems_version: 2.5.1
274
274
  signing_key:
275
275
  specification_version: 4
276
276
  summary: Mail provides a nice Ruby DSL for making, sending and reading emails.
@@ -1,13 +0,0 @@
1
- # encoding: utf-8
2
-
3
- unless Object.method_defined? :blank?
4
- class Object
5
- def blank?
6
- if respond_to?(:empty?)
7
- empty?
8
- else
9
- !self
10
- end
11
- end
12
- end
13
- end