mail 2.6.3 → 2.6.4.rc1

Sign up to get free protection for your applications and to get access to all the features.
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