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.
- checksums.yaml +4 -4
- data/CHANGELOG.rdoc +22 -0
- data/Gemfile +1 -4
- data/MIT-LICENSE +1 -1
- data/README.md +38 -2
- data/Rakefile +2 -2
- data/lib/mail.rb +8 -2
- data/lib/mail/body.rb +4 -4
- data/lib/mail/check_delivery_params.rb +3 -3
- data/lib/mail/constants.rb +2 -1
- data/lib/mail/core_extensions/nil.rb +0 -6
- data/lib/mail/core_extensions/string.rb +0 -6
- data/lib/mail/elements/address.rb +7 -7
- data/lib/mail/encodings.rb +25 -28
- data/lib/mail/encodings/8bit.rb +5 -0
- data/lib/mail/encodings/base64.rb +5 -0
- data/lib/mail/encodings/quoted_printable.rb +6 -1
- data/lib/mail/encodings/transfer_encoding.rb +26 -17
- data/lib/mail/field.rb +18 -4
- data/lib/mail/fields/bcc_field.rb +14 -3
- data/lib/mail/fields/cc_field.rb +0 -1
- data/lib/mail/fields/common/common_address.rb +7 -7
- data/lib/mail/fields/common/common_date.rb +1 -1
- data/lib/mail/fields/common/common_field.rb +1 -1
- data/lib/mail/fields/common/common_message_id.rb +2 -2
- data/lib/mail/fields/content_disposition_field.rb +11 -11
- data/lib/mail/fields/content_id_field.rb +2 -2
- data/lib/mail/fields/content_location_field.rb +1 -1
- data/lib/mail/fields/content_transfer_encoding_field.rb +1 -1
- data/lib/mail/fields/content_type_field.rb +1 -1
- data/lib/mail/fields/date_field.rb +1 -1
- data/lib/mail/fields/from_field.rb +0 -1
- data/lib/mail/fields/keywords_field.rb +1 -2
- data/lib/mail/fields/message_id_field.rb +1 -1
- data/lib/mail/fields/mime_version_field.rb +2 -2
- data/lib/mail/fields/received_field.rb +3 -3
- data/lib/mail/fields/reply_to_field.rb +0 -1
- data/lib/mail/fields/resent_bcc_field.rb +0 -1
- data/lib/mail/fields/resent_cc_field.rb +0 -1
- data/lib/mail/fields/resent_date_field.rb +1 -1
- data/lib/mail/fields/resent_from_field.rb +0 -1
- data/lib/mail/fields/resent_sender_field.rb +0 -1
- data/lib/mail/fields/resent_to_field.rb +0 -1
- data/lib/mail/fields/return_path_field.rb +0 -1
- data/lib/mail/fields/sender_field.rb +0 -1
- data/lib/mail/fields/to_field.rb +0 -1
- data/lib/mail/fields/unstructured_field.rb +1 -1
- data/lib/mail/header.rb +3 -3
- data/lib/mail/matchers/attachment_matchers.rb +28 -0
- data/lib/mail/matchers/has_sent_mail.rb +30 -7
- data/lib/mail/message.rb +15 -21
- data/lib/mail/multibyte/unicode.rb +20 -16
- data/lib/mail/parsers/address_lists_parser.rb +1 -1
- data/lib/mail/parsers/content_disposition_parser.rb +1 -1
- data/lib/mail/parsers/content_location_parser.rb +1 -1
- data/lib/mail/parsers/content_transfer_encoding_parser.rb +1 -1
- data/lib/mail/parsers/envelope_from_parser.rb +1 -1
- data/lib/mail/parsers/message_ids_parser.rb +1 -1
- data/lib/mail/parsers/mime_version_parser.rb +1 -1
- data/lib/mail/part.rb +4 -2
- data/lib/mail/parts_list.rb +25 -8
- data/lib/mail/utilities.rb +15 -0
- data/lib/mail/values/unicode_tables.dat +0 -0
- data/lib/mail/version.rb +2 -2
- data/lib/mail/version_specific/ruby_1_8.rb +10 -4
- data/lib/mail/version_specific/ruby_1_9.rb +39 -10
- metadata +8 -8
- data/lib/mail/core_extensions/object.rb +0 -13
data/lib/mail/parts_list.rb
CHANGED
@@ -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(
|
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(
|
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 =
|
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
|
-
|
43
|
-
sorted.each { |p|
|
59
|
+
@parts.clear
|
60
|
+
sorted.each { |p| @parts << p }
|
44
61
|
end
|
45
62
|
|
46
63
|
private
|
data/lib/mail/utilities.rb
CHANGED
@@ -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
|
Binary file
|
data/lib/mail/version.rb
CHANGED
@@ -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),
|
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 =
|
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 =
|
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.
|
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
|
-
|
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
|
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
|
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
|
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
|
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
|
167
|
+
when /^windows-?(.*)$/
|
163
168
|
"Windows-#{$1}"
|
164
169
|
|
165
|
-
when
|
170
|
+
when '8bit'
|
166
171
|
Encoding::ASCII_8BIT
|
167
172
|
|
168
173
|
# alternatives/misspellings of us-ascii seen in the wild
|
169
|
-
when /^iso
|
174
|
+
when /^iso[-_]?646(-us)?$/, 'us=ascii'
|
170
175
|
Encoding::ASCII
|
171
176
|
|
172
177
|
# Microsoft-specific alias for MACROMAN
|
173
|
-
when
|
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
|
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.
|
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:
|
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
|
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
|
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:
|
270
|
+
version: 1.3.1
|
271
271
|
requirements: []
|
272
272
|
rubyforge_project:
|
273
|
-
rubygems_version: 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.
|