mail 2.7.1 → 2.8.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.
- checksums.yaml +4 -4
- data/README.md +59 -28
- data/lib/mail/attachments_list.rb +2 -5
- data/lib/mail/body.rb +24 -47
- data/lib/mail/check_delivery_params.rb +21 -16
- data/lib/mail/constants.rb +27 -5
- data/lib/mail/elements/address.rb +27 -27
- data/lib/mail/elements/address_list.rb +1 -1
- data/lib/mail/elements/content_disposition_element.rb +1 -1
- data/lib/mail/elements/content_location_element.rb +1 -1
- data/lib/mail/elements/content_transfer_encoding_element.rb +1 -1
- data/lib/mail/elements/content_type_element.rb +8 -4
- data/lib/mail/elements/date_time_element.rb +1 -1
- data/lib/mail/elements/envelope_from_element.rb +13 -7
- data/lib/mail/elements/message_ids_element.rb +14 -5
- data/lib/mail/elements/mime_version_element.rb +1 -1
- data/lib/mail/elements/phrase_list.rb +7 -2
- data/lib/mail/elements/received_element.rb +20 -6
- data/lib/mail/encodings/7bit.rb +5 -0
- data/lib/mail/encodings/base64.rb +2 -2
- data/lib/mail/encodings/quoted_printable.rb +2 -2
- data/lib/mail/encodings.rb +30 -59
- data/lib/mail/envelope.rb +11 -14
- data/lib/mail/field.rb +37 -53
- data/lib/mail/field_list.rb +60 -7
- data/lib/mail/fields/bcc_field.rb +34 -52
- data/lib/mail/fields/cc_field.rb +28 -49
- data/lib/mail/fields/comments_field.rb +27 -37
- data/lib/mail/fields/common_address_field.rb +170 -0
- data/lib/mail/fields/common_date_field.rb +58 -0
- data/lib/mail/fields/common_field.rb +77 -0
- data/lib/mail/fields/common_message_id_field.rb +42 -0
- data/lib/mail/fields/content_description_field.rb +7 -14
- data/lib/mail/fields/content_disposition_field.rb +13 -38
- data/lib/mail/fields/content_id_field.rb +24 -51
- data/lib/mail/fields/content_location_field.rb +11 -25
- data/lib/mail/fields/content_transfer_encoding_field.rb +31 -31
- data/lib/mail/fields/content_type_field.rb +46 -71
- data/lib/mail/fields/date_field.rb +23 -51
- data/lib/mail/fields/from_field.rb +28 -49
- data/lib/mail/fields/in_reply_to_field.rb +38 -49
- data/lib/mail/fields/keywords_field.rb +18 -31
- data/lib/mail/fields/message_id_field.rb +25 -71
- data/lib/mail/fields/mime_version_field.rb +19 -30
- data/lib/mail/fields/named_structured_field.rb +11 -0
- data/lib/mail/fields/named_unstructured_field.rb +11 -0
- data/lib/mail/fields/optional_field.rb +5 -6
- data/lib/mail/fields/{common/parameter_hash.rb → parameter_hash.rb} +12 -10
- data/lib/mail/fields/received_field.rb +43 -57
- data/lib/mail/fields/references_field.rb +35 -49
- data/lib/mail/fields/reply_to_field.rb +28 -49
- data/lib/mail/fields/resent_bcc_field.rb +28 -49
- data/lib/mail/fields/resent_cc_field.rb +28 -49
- data/lib/mail/fields/resent_date_field.rb +5 -29
- data/lib/mail/fields/resent_from_field.rb +28 -49
- data/lib/mail/fields/resent_message_id_field.rb +5 -29
- data/lib/mail/fields/resent_sender_field.rb +27 -56
- data/lib/mail/fields/resent_to_field.rb +28 -49
- data/lib/mail/fields/return_path_field.rb +50 -54
- data/lib/mail/fields/sender_field.rb +34 -55
- data/lib/mail/fields/structured_field.rb +3 -30
- data/lib/mail/fields/subject_field.rb +9 -11
- data/lib/mail/fields/to_field.rb +28 -49
- data/lib/mail/fields/unstructured_field.rb +16 -48
- data/lib/mail/header.rb +69 -110
- data/lib/mail/matchers/attachment_matchers.rb +15 -0
- data/lib/mail/message.rb +52 -66
- data/lib/mail/multibyte/chars.rb +8 -166
- data/lib/mail/multibyte/utils.rb +26 -43
- data/lib/mail/multibyte.rb +1 -11
- data/lib/mail/network/delivery_methods/exim.rb +5 -4
- data/lib/mail/network/delivery_methods/file_delivery.rb +11 -10
- data/lib/mail/network/delivery_methods/logger_delivery.rb +2 -5
- data/lib/mail/network/delivery_methods/sendmail.rb +56 -18
- data/lib/mail/network/delivery_methods/smtp.rb +25 -9
- data/lib/mail/network/delivery_methods/smtp_connection.rb +3 -12
- data/lib/mail/network/delivery_methods/test_mailer.rb +4 -2
- data/lib/mail/network/retriever_methods/base.rb +8 -8
- data/lib/mail/network/retriever_methods/imap.rb +2 -2
- data/lib/mail/network/retriever_methods/pop3.rb +2 -2
- data/lib/mail/network/retriever_methods/test_retriever.rb +2 -1
- data/lib/mail/parsers/address_lists_parser.rb +33070 -33064
- data/lib/mail/parsers/address_lists_parser.rl +7 -0
- data/lib/mail/parsers/content_disposition_parser.rb +833 -827
- data/lib/mail/parsers/content_disposition_parser.rl +7 -0
- data/lib/mail/parsers/content_location_parser.rb +770 -764
- data/lib/mail/parsers/content_location_parser.rl +7 -0
- data/lib/mail/parsers/content_transfer_encoding_parser.rb +474 -468
- data/lib/mail/parsers/content_transfer_encoding_parser.rl +7 -0
- data/lib/mail/parsers/content_type_parser.rb +971 -965
- data/lib/mail/parsers/content_type_parser.rl +7 -0
- data/lib/mail/parsers/date_time_parser.rb +838 -832
- data/lib/mail/parsers/date_time_parser.rl +7 -0
- data/lib/mail/parsers/envelope_from_parser.rb +3623 -3529
- data/lib/mail/parsers/envelope_from_parser.rl +7 -0
- data/lib/mail/parsers/message_ids_parser.rb +5107 -2800
- data/lib/mail/parsers/message_ids_parser.rl +12 -1
- data/lib/mail/parsers/mime_version_parser.rb +463 -457
- data/lib/mail/parsers/mime_version_parser.rl +7 -0
- data/lib/mail/parsers/phrase_lists_parser.rb +836 -830
- data/lib/mail/parsers/phrase_lists_parser.rl +8 -1
- data/lib/mail/parsers/received_parser.rb +8688 -8682
- data/lib/mail/parsers/received_parser.rl +7 -0
- data/lib/mail/parsers/rfc5322.rl +28 -13
- data/lib/mail/parsers.rb +11 -17
- data/lib/mail/part.rb +5 -9
- data/lib/mail/parts_list.rb +57 -0
- data/lib/mail/smtp_envelope.rb +57 -0
- data/lib/mail/utilities.rb +307 -69
- data/lib/mail/version.rb +1 -1
- data/lib/mail/yaml.rb +30 -0
- data/lib/mail.rb +3 -20
- metadata +72 -18
- data/lib/mail/core_extensions/smtp.rb +0 -28
- data/lib/mail/core_extensions/string.rb +0 -17
- data/lib/mail/fields/common/address_container.rb +0 -17
- data/lib/mail/fields/common/common_address.rb +0 -161
- data/lib/mail/fields/common/common_date.rb +0 -36
- data/lib/mail/fields/common/common_field.rb +0 -52
- data/lib/mail/fields/common/common_message_id.rb +0 -49
- data/lib/mail/version_specific/ruby_1_8.rb +0 -163
- data/lib/mail/version_specific/ruby_1_9.rb +0 -278
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.
|
4
|
+
version: 2.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mikel Lindsaar
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-02-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mini_mime
|
@@ -24,6 +24,48 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.1.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: net-smtp
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: net-imap
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: net-pop
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
27
69
|
- !ruby/object:Gem::Dependency
|
28
70
|
name: bundler
|
29
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,6 +108,20 @@ dependencies:
|
|
66
108
|
- - "~>"
|
67
109
|
- !ruby/object:Gem::Version
|
68
110
|
version: '3.0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rspec-benchmark
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
69
125
|
- !ruby/object:Gem::Dependency
|
70
126
|
name: rdoc
|
71
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -109,8 +165,6 @@ files:
|
|
109
165
|
- lib/mail/check_delivery_params.rb
|
110
166
|
- lib/mail/configuration.rb
|
111
167
|
- lib/mail/constants.rb
|
112
|
-
- lib/mail/core_extensions/smtp.rb
|
113
|
-
- lib/mail/core_extensions/string.rb
|
114
168
|
- lib/mail/elements.rb
|
115
169
|
- lib/mail/elements/address.rb
|
116
170
|
- lib/mail/elements/address_list.rb
|
@@ -140,12 +194,10 @@ files:
|
|
140
194
|
- lib/mail/fields/bcc_field.rb
|
141
195
|
- lib/mail/fields/cc_field.rb
|
142
196
|
- lib/mail/fields/comments_field.rb
|
143
|
-
- lib/mail/fields/
|
144
|
-
- lib/mail/fields/
|
145
|
-
- lib/mail/fields/
|
146
|
-
- lib/mail/fields/
|
147
|
-
- lib/mail/fields/common/common_message_id.rb
|
148
|
-
- lib/mail/fields/common/parameter_hash.rb
|
197
|
+
- lib/mail/fields/common_address_field.rb
|
198
|
+
- lib/mail/fields/common_date_field.rb
|
199
|
+
- lib/mail/fields/common_field.rb
|
200
|
+
- lib/mail/fields/common_message_id_field.rb
|
149
201
|
- lib/mail/fields/content_description_field.rb
|
150
202
|
- lib/mail/fields/content_disposition_field.rb
|
151
203
|
- lib/mail/fields/content_id_field.rb
|
@@ -158,7 +210,10 @@ files:
|
|
158
210
|
- lib/mail/fields/keywords_field.rb
|
159
211
|
- lib/mail/fields/message_id_field.rb
|
160
212
|
- lib/mail/fields/mime_version_field.rb
|
213
|
+
- lib/mail/fields/named_structured_field.rb
|
214
|
+
- lib/mail/fields/named_unstructured_field.rb
|
161
215
|
- lib/mail/fields/optional_field.rb
|
216
|
+
- lib/mail/fields/parameter_hash.rb
|
162
217
|
- lib/mail/fields/received_field.rb
|
163
218
|
- lib/mail/fields/references_field.rb
|
164
219
|
- lib/mail/fields/reply_to_field.rb
|
@@ -233,16 +288,16 @@ files:
|
|
233
288
|
- lib/mail/parsers/rfc5322_lexical_tokens.rl
|
234
289
|
- lib/mail/part.rb
|
235
290
|
- lib/mail/parts_list.rb
|
291
|
+
- lib/mail/smtp_envelope.rb
|
236
292
|
- lib/mail/utilities.rb
|
237
293
|
- lib/mail/values/unicode_tables.dat
|
238
294
|
- lib/mail/version.rb
|
239
|
-
- lib/mail/
|
240
|
-
- lib/mail/version_specific/ruby_1_9.rb
|
295
|
+
- lib/mail/yaml.rb
|
241
296
|
homepage: https://github.com/mikel/mail
|
242
297
|
licenses:
|
243
298
|
- MIT
|
244
299
|
metadata: {}
|
245
|
-
post_install_message:
|
300
|
+
post_install_message:
|
246
301
|
rdoc_options:
|
247
302
|
- "--exclude"
|
248
303
|
- lib/mail/values/unicode_tables.dat
|
@@ -252,16 +307,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
252
307
|
requirements:
|
253
308
|
- - ">="
|
254
309
|
- !ruby/object:Gem::Version
|
255
|
-
version: '
|
310
|
+
version: '2.5'
|
256
311
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
257
312
|
requirements:
|
258
313
|
- - ">="
|
259
314
|
- !ruby/object:Gem::Version
|
260
315
|
version: '0'
|
261
316
|
requirements: []
|
262
|
-
|
263
|
-
|
264
|
-
signing_key:
|
317
|
+
rubygems_version: 3.1.6
|
318
|
+
signing_key:
|
265
319
|
specification_version: 4
|
266
320
|
summary: Mail provides a nice Ruby DSL for making, sending and reading emails.
|
267
321
|
test_files: []
|
@@ -1,28 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
# frozen_string_literal: true
|
3
|
-
|
4
|
-
# This is a backport of r30294 from ruby trunk because of a bug in net/smtp.
|
5
|
-
# http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=30294
|
6
|
-
#
|
7
|
-
# Fixed in Ruby 1.9.3 - tlsconnect also does not exist in some early versions of ruby
|
8
|
-
if RUBY_VERSION < '1.9.3'
|
9
|
-
module Net
|
10
|
-
class SMTP
|
11
|
-
begin
|
12
|
-
alias_method :original_tlsconnect, :tlsconnect
|
13
|
-
|
14
|
-
def tlsconnect(s)
|
15
|
-
verified = false
|
16
|
-
begin
|
17
|
-
original_tlsconnect(s).tap { verified = true }
|
18
|
-
ensure
|
19
|
-
unless verified
|
20
|
-
s.close rescue nil
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
rescue NameError
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
# frozen_string_literal: true
|
3
|
-
class String #:nodoc:
|
4
|
-
|
5
|
-
unless method_defined?(:ascii_only?)
|
6
|
-
# Backport from Ruby 1.9 checks for non-us-ascii characters.
|
7
|
-
def ascii_only?
|
8
|
-
self !~ MATCH_NON_US_ASCII
|
9
|
-
end
|
10
|
-
|
11
|
-
MATCH_NON_US_ASCII = /[^\x00-\x7f]/
|
12
|
-
end
|
13
|
-
|
14
|
-
unless method_defined?(:bytesize)
|
15
|
-
alias :bytesize :length
|
16
|
-
end
|
17
|
-
end
|
@@ -1,161 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
# frozen_string_literal: true
|
3
|
-
require 'mail/fields/common/address_container'
|
4
|
-
|
5
|
-
module Mail
|
6
|
-
module CommonAddress # :nodoc:
|
7
|
-
def parse(val = value)
|
8
|
-
unless Utilities.blank?(val)
|
9
|
-
@address_list = AddressList.new(encode_if_needed(val))
|
10
|
-
else
|
11
|
-
nil
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def charset
|
16
|
-
@charset
|
17
|
-
end
|
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
|
28
|
-
end
|
29
|
-
|
30
|
-
# Allows you to iterate through each address object in the address_list
|
31
|
-
def each
|
32
|
-
address_list.addresses.each do |address|
|
33
|
-
yield(address)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
# Returns the address string of all the addresses in the address list
|
38
|
-
def addresses
|
39
|
-
list = address_list.addresses.map { |a| a.address }
|
40
|
-
Mail::AddressContainer.new(self, list)
|
41
|
-
end
|
42
|
-
|
43
|
-
# Returns the formatted string of all the addresses in the address list
|
44
|
-
def formatted
|
45
|
-
list = address_list.addresses.map { |a| a.format }
|
46
|
-
Mail::AddressContainer.new(self, list)
|
47
|
-
end
|
48
|
-
|
49
|
-
# Returns the display name of all the addresses in the address list
|
50
|
-
def display_names
|
51
|
-
list = address_list.addresses.map { |a| a.display_name }
|
52
|
-
Mail::AddressContainer.new(self, list)
|
53
|
-
end
|
54
|
-
|
55
|
-
# Returns the actual address objects in the address list
|
56
|
-
def addrs
|
57
|
-
list = address_list.addresses
|
58
|
-
Mail::AddressContainer.new(self, list)
|
59
|
-
end
|
60
|
-
|
61
|
-
# Returns a hash of group name => address strings for the address list
|
62
|
-
def groups
|
63
|
-
address_list.addresses_grouped_by_group
|
64
|
-
end
|
65
|
-
|
66
|
-
# Returns the addresses that are part of groups
|
67
|
-
def group_addresses
|
68
|
-
decoded_group_addresses
|
69
|
-
end
|
70
|
-
|
71
|
-
# Returns a list of decoded group addresses
|
72
|
-
def decoded_group_addresses
|
73
|
-
groups.map { |k,v| v.map { |a| a.decoded } }.flatten
|
74
|
-
end
|
75
|
-
|
76
|
-
# Returns a list of encoded group addresses
|
77
|
-
def encoded_group_addresses
|
78
|
-
groups.map { |k,v| v.map { |a| a.encoded } }.flatten
|
79
|
-
end
|
80
|
-
|
81
|
-
# Returns the name of all the groups in a string
|
82
|
-
def group_names # :nodoc:
|
83
|
-
address_list.group_names
|
84
|
-
end
|
85
|
-
|
86
|
-
def default
|
87
|
-
addresses
|
88
|
-
end
|
89
|
-
|
90
|
-
def <<(val)
|
91
|
-
case
|
92
|
-
when val.nil?
|
93
|
-
raise ArgumentError, "Need to pass an address to <<"
|
94
|
-
when Utilities.blank?(val)
|
95
|
-
parse(encoded)
|
96
|
-
else
|
97
|
-
self.value = [self.value, val].reject {|a| Utilities.blank?(a) }.join(", ")
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
def value=(val)
|
102
|
-
super
|
103
|
-
parse(self.value)
|
104
|
-
end
|
105
|
-
|
106
|
-
private
|
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
|
-
|
127
|
-
def do_encode(field_name)
|
128
|
-
return '' if Utilities.blank?(value)
|
129
|
-
address_array = address_list.addresses.reject { |a| encoded_group_addresses.include?(a.encoded) }.compact.map { |a| a.encoded }
|
130
|
-
address_text = address_array.join(", \r\n\s")
|
131
|
-
group_array = groups.map { |k,v| "#{k}: #{v.map { |a| a.encoded }.join(", \r\n\s")};" }
|
132
|
-
group_text = group_array.join(" \r\n\s")
|
133
|
-
return_array = [address_text, group_text].reject { |a| Utilities.blank?(a) }
|
134
|
-
"#{field_name}: #{return_array.join(", \r\n\s")}\r\n"
|
135
|
-
end
|
136
|
-
|
137
|
-
def do_decode
|
138
|
-
return nil if Utilities.blank?(value)
|
139
|
-
address_array = address_list.addresses.reject { |a| decoded_group_addresses.include?(a.decoded) }.map { |a| a.decoded }
|
140
|
-
address_text = address_array.join(", ")
|
141
|
-
group_array = groups.map { |k,v| "#{k}: #{v.map { |a| a.decoded }.join(", ")};" }
|
142
|
-
group_text = group_array.join(" ")
|
143
|
-
return_array = [address_text, group_text].reject { |a| Utilities.blank?(a) }
|
144
|
-
return_array.join(", ")
|
145
|
-
end
|
146
|
-
|
147
|
-
def address_list # :nodoc:
|
148
|
-
@address_list ||= AddressList.new(value)
|
149
|
-
end
|
150
|
-
|
151
|
-
def get_group_addresses(group_list)
|
152
|
-
if group_list.respond_to?(:addresses)
|
153
|
-
group_list.addresses.map do |address|
|
154
|
-
Mail::Address.new(address)
|
155
|
-
end
|
156
|
-
else
|
157
|
-
[]
|
158
|
-
end
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
# frozen_string_literal: true
|
3
|
-
module Mail
|
4
|
-
module CommonDate # :nodoc:
|
5
|
-
# Returns a date time object of the parsed date
|
6
|
-
def date_time
|
7
|
-
::DateTime.parse("#{element.date_string} #{element.time_string}")
|
8
|
-
end
|
9
|
-
|
10
|
-
def default
|
11
|
-
date_time
|
12
|
-
end
|
13
|
-
|
14
|
-
def parse(val = value)
|
15
|
-
unless Utilities.blank?(val)
|
16
|
-
@element = Mail::DateTimeElement.new(val)
|
17
|
-
else
|
18
|
-
nil
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def do_encode(field_name)
|
25
|
-
"#{field_name}: #{value}\r\n"
|
26
|
-
end
|
27
|
-
|
28
|
-
def do_decode
|
29
|
-
"#{value}"
|
30
|
-
end
|
31
|
-
|
32
|
-
def element
|
33
|
-
@element ||= Mail::DateTimeElement.new(value)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
# frozen_string_literal: true
|
3
|
-
module Mail
|
4
|
-
module CommonField # :nodoc:
|
5
|
-
include Mail::Constants
|
6
|
-
|
7
|
-
def name=(value)
|
8
|
-
@name = value
|
9
|
-
end
|
10
|
-
|
11
|
-
def name
|
12
|
-
@name ||= nil
|
13
|
-
end
|
14
|
-
|
15
|
-
def value=(value)
|
16
|
-
@length = nil
|
17
|
-
@element = nil
|
18
|
-
@value = value.is_a?(Array) ? value : value.to_s
|
19
|
-
end
|
20
|
-
|
21
|
-
def value
|
22
|
-
@value
|
23
|
-
end
|
24
|
-
|
25
|
-
def to_s
|
26
|
-
decoded.to_s
|
27
|
-
end
|
28
|
-
|
29
|
-
def default
|
30
|
-
decoded
|
31
|
-
end
|
32
|
-
|
33
|
-
def field_length
|
34
|
-
@length ||= "#{name}: #{encode(decoded)}".length
|
35
|
-
end
|
36
|
-
|
37
|
-
def responsible_for?( val )
|
38
|
-
name.to_s.casecmp(val.to_s) == 0
|
39
|
-
end
|
40
|
-
|
41
|
-
private
|
42
|
-
|
43
|
-
FILENAME_RE = /\b(filename|name)=([^;"\r\n]+\s[^;"\r\n]+)/
|
44
|
-
def ensure_filename_quoted(value)
|
45
|
-
if value.is_a?(String)
|
46
|
-
value.sub FILENAME_RE, '\1="\2"'
|
47
|
-
else
|
48
|
-
value
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
# frozen_string_literal: true
|
3
|
-
module Mail
|
4
|
-
module CommonMessageId # :nodoc:
|
5
|
-
def element
|
6
|
-
@element ||= Mail::MessageIdsElement.new(value) unless Utilities.blank?(value)
|
7
|
-
end
|
8
|
-
|
9
|
-
def parse(val = value)
|
10
|
-
unless Utilities.blank?(val)
|
11
|
-
@element = Mail::MessageIdsElement.new(val)
|
12
|
-
else
|
13
|
-
nil
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def message_id
|
18
|
-
element.message_id if element
|
19
|
-
end
|
20
|
-
|
21
|
-
def message_ids
|
22
|
-
element.message_ids if element
|
23
|
-
end
|
24
|
-
|
25
|
-
def default
|
26
|
-
return nil unless message_ids
|
27
|
-
if message_ids.length == 1
|
28
|
-
message_ids[0]
|
29
|
-
else
|
30
|
-
message_ids
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
def do_encode(field_name)
|
37
|
-
%Q{#{field_name}: #{formated_message_ids("\r\n ")}\r\n}
|
38
|
-
end
|
39
|
-
|
40
|
-
def do_decode
|
41
|
-
formated_message_ids(' ')
|
42
|
-
end
|
43
|
-
|
44
|
-
def formated_message_ids(join)
|
45
|
-
message_ids.map{ |m| "<#{m}>" }.join(join) if message_ids
|
46
|
-
end
|
47
|
-
|
48
|
-
end
|
49
|
-
end
|
@@ -1,163 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
# frozen_string_literal: true
|
3
|
-
require 'net/imap' # for decode_utf7
|
4
|
-
|
5
|
-
module Mail
|
6
|
-
class Ruby18
|
7
|
-
require 'base64'
|
8
|
-
require 'iconv'
|
9
|
-
|
10
|
-
# Escapes any parenthesis in a string that are unescaped. This can't
|
11
|
-
# use the Ruby 1.9.1 regexp feature of negative look behind so we have
|
12
|
-
# to do two replacement, first unescape everything, then re-escape it
|
13
|
-
def Ruby18.escape_paren( str )
|
14
|
-
re = /\\\)/
|
15
|
-
str = str.gsub(re) { |s| ')'}
|
16
|
-
re = /\\\(/
|
17
|
-
str = str.gsub(re) { |s| '('}
|
18
|
-
re = /([\(\)])/ # Only match unescaped parens
|
19
|
-
str.gsub(re) { |s| '\\' + s }
|
20
|
-
end
|
21
|
-
|
22
|
-
def Ruby18.paren( str )
|
23
|
-
str = $1 if str =~ /^\((.*)?\)$/
|
24
|
-
str = escape_paren( str )
|
25
|
-
'(' + str + ')'
|
26
|
-
end
|
27
|
-
|
28
|
-
def Ruby18.escape_bracket( str )
|
29
|
-
re = /\\\>/
|
30
|
-
str = str.gsub(re) { |s| '>'}
|
31
|
-
re = /\\\</
|
32
|
-
str = str.gsub(re) { |s| '<'}
|
33
|
-
re = /([\<\>])/ # Only match unescaped parens
|
34
|
-
str.gsub(re) { |s| '\\' + s }
|
35
|
-
end
|
36
|
-
|
37
|
-
def Ruby18.bracket( str )
|
38
|
-
str = $1 if str =~ /^\<(.*)?\>$/
|
39
|
-
str = escape_bracket( str )
|
40
|
-
'<' + str + '>'
|
41
|
-
end
|
42
|
-
|
43
|
-
def Ruby18.decode_base64(str)
|
44
|
-
Base64.decode64(str) if str
|
45
|
-
end
|
46
|
-
|
47
|
-
def Ruby18.encode_base64(str)
|
48
|
-
Base64.encode64(str)
|
49
|
-
end
|
50
|
-
|
51
|
-
def Ruby18.has_constant?(klass, string)
|
52
|
-
klass.constants.include?( string )
|
53
|
-
end
|
54
|
-
|
55
|
-
def Ruby18.get_constant(klass, string)
|
56
|
-
klass.const_get( string )
|
57
|
-
end
|
58
|
-
|
59
|
-
def Ruby18.transcode_charset(str, from_encoding, to_encoding = 'UTF-8')
|
60
|
-
case from_encoding
|
61
|
-
when /utf-?7/i
|
62
|
-
decode_utf7(str)
|
63
|
-
else
|
64
|
-
retried = false
|
65
|
-
begin
|
66
|
-
Iconv.conv("#{normalize_iconv_charset_encoding(to_encoding)}//IGNORE", normalize_iconv_charset_encoding(from_encoding), str)
|
67
|
-
rescue Iconv::InvalidEncoding
|
68
|
-
if retried
|
69
|
-
raise
|
70
|
-
else
|
71
|
-
from_encoding = 'ASCII'
|
72
|
-
retried = true
|
73
|
-
retry
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def Ruby18.decode_utf7(str)
|
80
|
-
Net::IMAP.decode_utf7(str)
|
81
|
-
end
|
82
|
-
|
83
|
-
def Ruby18.b_value_encode(str, encoding)
|
84
|
-
# Ruby 1.8 requires an encoding to work
|
85
|
-
raise ArgumentError, "Must supply an encoding" if encoding.nil?
|
86
|
-
encoding = encoding.to_s.upcase.gsub('_', '-')
|
87
|
-
[Encodings::Base64.encode(str), normalize_iconv_charset_encoding(encoding)]
|
88
|
-
end
|
89
|
-
|
90
|
-
def Ruby18.b_value_decode(str)
|
91
|
-
match = str.match(/\=\?(.+)?\?[Bb]\?(.*)\?\=/m)
|
92
|
-
if match
|
93
|
-
encoding = match[1]
|
94
|
-
str = Ruby18.decode_base64(match[2])
|
95
|
-
str = transcode_charset(str, encoding)
|
96
|
-
end
|
97
|
-
str
|
98
|
-
end
|
99
|
-
|
100
|
-
def Ruby18.q_value_encode(str, encoding)
|
101
|
-
# Ruby 1.8 requires an encoding to work
|
102
|
-
raise ArgumentError, "Must supply an encoding" if encoding.nil?
|
103
|
-
encoding = encoding.to_s.upcase.gsub('_', '-')
|
104
|
-
[Encodings::QuotedPrintable.encode(str), encoding]
|
105
|
-
end
|
106
|
-
|
107
|
-
def Ruby18.q_value_decode(str)
|
108
|
-
match = str.match(/\=\?(.+)?\?[Qq]\?(.*)\?\=/m)
|
109
|
-
if match
|
110
|
-
encoding = match[1]
|
111
|
-
string = match[2].gsub(/_/, '=20')
|
112
|
-
# Remove trailing = if it exists in a Q encoding
|
113
|
-
string = string.sub(/\=$/, '')
|
114
|
-
str = Encodings::QuotedPrintable.decode(string)
|
115
|
-
str = transcode_charset(str, encoding)
|
116
|
-
end
|
117
|
-
str
|
118
|
-
end
|
119
|
-
|
120
|
-
def Ruby18.param_decode(str, encoding)
|
121
|
-
str = URI.unescape(str)
|
122
|
-
if encoding
|
123
|
-
transcode_charset(str, encoding)
|
124
|
-
else
|
125
|
-
str
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
def Ruby18.param_encode(str)
|
130
|
-
encoding = $KCODE.to_s.downcase
|
131
|
-
language = Configuration.instance.param_encode_language
|
132
|
-
"#{encoding}'#{language}'#{URI.escape(str)}"
|
133
|
-
end
|
134
|
-
|
135
|
-
def Ruby18.string_byteslice(str, *args)
|
136
|
-
str.slice(*args)
|
137
|
-
end
|
138
|
-
|
139
|
-
private
|
140
|
-
|
141
|
-
def Ruby18.normalize_iconv_charset_encoding(encoding)
|
142
|
-
case encoding.upcase
|
143
|
-
when 'UTF8', 'UTF_8'
|
144
|
-
'UTF-8'
|
145
|
-
when 'UTF16', 'UTF-16'
|
146
|
-
'UTF-16BE'
|
147
|
-
when 'UTF32', 'UTF-32'
|
148
|
-
'UTF-32BE'
|
149
|
-
when 'KS_C_5601-1987'
|
150
|
-
'CP949'
|
151
|
-
else
|
152
|
-
# Fall back to ASCII for charsets that Iconv doesn't recognize
|
153
|
-
begin
|
154
|
-
Iconv.new('UTF-8', encoding)
|
155
|
-
rescue Iconv::InvalidEncoding => e
|
156
|
-
'ASCII'
|
157
|
-
else
|
158
|
-
encoding
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|