mail 2.6.1 → 2.7.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 +5 -5
- data/MIT-LICENSE +1 -1
- data/README.md +92 -80
- data/lib/mail/attachments_list.rb +11 -5
- data/lib/mail/body.rb +81 -44
- data/lib/mail/check_delivery_params.rb +50 -10
- data/lib/mail/configuration.rb +3 -0
- data/lib/mail/{patterns.rb → constants.rb} +26 -6
- data/lib/mail/core_extensions/smtp.rb +20 -16
- data/lib/mail/core_extensions/string.rb +1 -27
- data/lib/mail/elements/address.rb +81 -93
- data/lib/mail/elements/address_list.rb +12 -29
- data/lib/mail/elements/content_disposition_element.rb +9 -15
- data/lib/mail/elements/content_location_element.rb +8 -12
- data/lib/mail/elements/content_transfer_encoding_element.rb +6 -10
- data/lib/mail/elements/content_type_element.rb +9 -19
- data/lib/mail/elements/date_time_element.rb +7 -14
- data/lib/mail/elements/envelope_from_element.rb +15 -21
- data/lib/mail/elements/message_ids_element.rb +12 -14
- data/lib/mail/elements/mime_version_element.rb +7 -14
- data/lib/mail/elements/phrase_list.rb +7 -9
- data/lib/mail/elements/received_element.rb +10 -15
- data/lib/mail/elements.rb +1 -0
- data/lib/mail/encodings/7bit.rb +6 -15
- data/lib/mail/encodings/8bit.rb +5 -18
- data/lib/mail/encodings/base64.rb +15 -10
- data/lib/mail/encodings/binary.rb +4 -22
- data/lib/mail/encodings/identity.rb +24 -0
- data/lib/mail/encodings/quoted_printable.rb +13 -7
- data/lib/mail/encodings/transfer_encoding.rb +47 -28
- data/lib/mail/encodings/unix_to_unix.rb +20 -0
- data/lib/mail/encodings.rb +121 -82
- data/lib/mail/envelope.rb +2 -1
- data/lib/mail/field.rb +114 -62
- data/lib/mail/field_list.rb +2 -1
- data/lib/mail/fields/bcc_field.rb +17 -5
- data/lib/mail/fields/cc_field.rb +2 -2
- data/lib/mail/fields/comments_field.rb +2 -1
- data/lib/mail/fields/common/address_container.rb +3 -2
- data/lib/mail/fields/common/common_address.rb +40 -14
- data/lib/mail/fields/common/common_date.rb +2 -1
- data/lib/mail/fields/common/common_field.rb +6 -11
- data/lib/mail/fields/common/common_message_id.rb +3 -2
- data/lib/mail/fields/common/parameter_hash.rb +5 -4
- data/lib/mail/fields/content_description_field.rb +2 -1
- data/lib/mail/fields/content_disposition_field.rb +14 -13
- data/lib/mail/fields/content_id_field.rb +5 -4
- data/lib/mail/fields/content_location_field.rb +3 -2
- data/lib/mail/fields/content_transfer_encoding_field.rb +3 -2
- data/lib/mail/fields/content_type_field.rb +7 -11
- data/lib/mail/fields/date_field.rb +4 -4
- data/lib/mail/fields/from_field.rb +2 -2
- data/lib/mail/fields/in_reply_to_field.rb +2 -1
- data/lib/mail/fields/keywords_field.rb +3 -3
- data/lib/mail/fields/message_id_field.rb +3 -2
- data/lib/mail/fields/mime_version_field.rb +4 -3
- data/lib/mail/fields/optional_field.rb +5 -1
- data/lib/mail/fields/received_field.rb +5 -4
- data/lib/mail/fields/references_field.rb +2 -1
- data/lib/mail/fields/reply_to_field.rb +2 -2
- data/lib/mail/fields/resent_bcc_field.rb +2 -2
- data/lib/mail/fields/resent_cc_field.rb +2 -2
- data/lib/mail/fields/resent_date_field.rb +2 -2
- data/lib/mail/fields/resent_from_field.rb +2 -2
- data/lib/mail/fields/resent_message_id_field.rb +2 -1
- data/lib/mail/fields/resent_sender_field.rb +2 -2
- data/lib/mail/fields/resent_to_field.rb +2 -2
- data/lib/mail/fields/return_path_field.rb +2 -2
- data/lib/mail/fields/sender_field.rb +2 -2
- data/lib/mail/fields/structured_field.rb +1 -0
- data/lib/mail/fields/subject_field.rb +2 -1
- data/lib/mail/fields/to_field.rb +2 -2
- data/lib/mail/fields/unstructured_field.rb +28 -10
- data/lib/mail/fields.rb +1 -0
- data/lib/mail/header.rb +18 -14
- data/lib/mail/indifferent_hash.rb +1 -0
- data/lib/mail/mail.rb +6 -11
- data/lib/mail/matchers/attachment_matchers.rb +29 -0
- data/lib/mail/matchers/has_sent_mail.rb +53 -9
- data/lib/mail/message.rb +99 -89
- data/lib/mail/multibyte/chars.rb +32 -30
- data/lib/mail/multibyte/unicode.rb +31 -26
- data/lib/mail/multibyte/utils.rb +1 -0
- data/lib/mail/multibyte.rb +65 -15
- data/lib/mail/network/delivery_methods/exim.rb +7 -10
- data/lib/mail/network/delivery_methods/file_delivery.rb +5 -8
- data/lib/mail/network/delivery_methods/logger_delivery.rb +37 -0
- data/lib/mail/network/delivery_methods/sendmail.rb +17 -11
- data/lib/mail/network/delivery_methods/smtp.rb +60 -53
- data/lib/mail/network/delivery_methods/smtp_connection.rb +11 -6
- data/lib/mail/network/delivery_methods/test_mailer.rb +6 -8
- data/lib/mail/network/retriever_methods/base.rb +1 -0
- data/lib/mail/network/retriever_methods/imap.rb +19 -5
- data/lib/mail/network/retriever_methods/pop3.rb +4 -1
- data/lib/mail/network/retriever_methods/test_retriever.rb +2 -1
- data/lib/mail/network.rb +2 -0
- data/lib/mail/parser_tools.rb +15 -0
- data/lib/mail/parsers/address_lists_parser.rb +33208 -104
- data/lib/mail/parsers/address_lists_parser.rl +172 -0
- data/lib/mail/parsers/content_disposition_parser.rb +877 -49
- data/lib/mail/parsers/content_disposition_parser.rl +82 -0
- data/lib/mail/parsers/content_location_parser.rb +804 -23
- data/lib/mail/parsers/content_location_parser.rl +71 -0
- data/lib/mail/parsers/content_transfer_encoding_parser.rb +502 -19
- data/lib/mail/parsers/content_transfer_encoding_parser.rl +64 -0
- data/lib/mail/parsers/content_type_parser.rb +1024 -46
- data/lib/mail/parsers/content_type_parser.rl +83 -0
- data/lib/mail/parsers/date_time_parser.rb +872 -23
- data/lib/mail/parsers/date_time_parser.rl +62 -0
- data/lib/mail/parsers/envelope_from_parser.rb +3570 -34
- data/lib/mail/parsers/envelope_from_parser.rl +82 -0
- data/lib/mail/parsers/message_ids_parser.rb +2840 -25
- data/lib/mail/parsers/message_ids_parser.rl +82 -0
- data/lib/mail/parsers/mime_version_parser.rb +492 -26
- data/lib/mail/parsers/mime_version_parser.rl +61 -0
- data/lib/mail/parsers/phrase_lists_parser.rb +862 -17
- data/lib/mail/parsers/phrase_lists_parser.rl +83 -0
- data/lib/mail/parsers/received_parser.rb +8765 -36
- data/lib/mail/parsers/received_parser.rl +84 -0
- data/lib/mail/parsers/rfc2045_content_transfer_encoding.rl +13 -0
- data/lib/mail/parsers/rfc2045_content_type.rl +25 -0
- data/lib/mail/parsers/rfc2045_mime.rl +16 -0
- data/lib/mail/parsers/rfc2183_content_disposition.rl +15 -0
- data/lib/mail/parsers/rfc3629_utf8.rl +19 -0
- data/lib/mail/parsers/rfc5234_abnf_core_rules.rl +22 -0
- data/lib/mail/parsers/rfc5322.rl +59 -0
- data/lib/mail/parsers/rfc5322_address.rl +72 -0
- data/lib/mail/parsers/{ragel/date_time.rl → rfc5322_date_time.rl} +8 -1
- data/lib/mail/parsers/rfc5322_lexical_tokens.rl +60 -0
- data/lib/mail/parsers.rb +17 -24
- data/lib/mail/part.rb +8 -5
- data/lib/mail/parts_list.rb +31 -14
- data/lib/mail/utilities.rb +112 -13
- data/lib/mail/values/unicode_tables.dat +0 -0
- data/lib/mail/version.rb +8 -15
- data/lib/mail/version_specific/ruby_1_8.rb +52 -8
- data/lib/mail/version_specific/ruby_1_9.rb +143 -24
- data/lib/mail.rb +8 -14
- metadata +71 -81
- data/CHANGELOG.rdoc +0 -752
- data/CONTRIBUTING.md +0 -60
- data/Dependencies.txt +0 -2
- data/Gemfile +0 -15
- data/Rakefile +0 -29
- data/TODO.rdoc +0 -9
- data/VERSION +0 -4
- data/lib/mail/core_extensions/nil.rb +0 -19
- data/lib/mail/core_extensions/object.rb +0 -13
- data/lib/mail/core_extensions/string/access.rb +0 -145
- data/lib/mail/core_extensions/string/multibyte.rb +0 -78
- data/lib/mail/multibyte/exceptions.rb +0 -8
- data/lib/mail/parsers/ragel/common.rl +0 -184
- data/lib/mail/parsers/ragel/parser_info.rb +0 -61
- data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb +0 -14864
- data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb.rl +0 -37
- data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb +0 -751
- data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb.rl +0 -37
- data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb +0 -614
- data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb.rl +0 -37
- data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb +0 -447
- data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb.rl +0 -37
- data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb +0 -825
- data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb.rl +0 -37
- data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb +0 -817
- data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb.rl +0 -37
- data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb +0 -2129
- data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb.rl +0 -37
- data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb +0 -1570
- data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb.rl +0 -37
- data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb +0 -440
- data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb.rl +0 -37
- data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb +0 -564
- data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb.rl +0 -37
- data/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl +0 -51
- data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb +0 -5144
- data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb.rl +0 -37
- data/lib/mail/parsers/ragel/ruby/parser.rb.rl.erb +0 -37
- data/lib/mail/parsers/ragel/ruby.rb +0 -39
- data/lib/mail/parsers/ragel.rb +0 -17
@@ -1,25 +1,32 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
require 'mail/fields/common/address_container'
|
3
4
|
|
4
5
|
module Mail
|
5
6
|
module CommonAddress # :nodoc:
|
6
|
-
|
7
7
|
def parse(val = value)
|
8
|
-
unless
|
8
|
+
unless Utilities.blank?(val)
|
9
9
|
@address_list = AddressList.new(encode_if_needed(val))
|
10
10
|
else
|
11
11
|
nil
|
12
12
|
end
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
def charset
|
16
16
|
@charset
|
17
17
|
end
|
18
|
-
|
19
|
-
def encode_if_needed(val)
|
20
|
-
|
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
|
21
28
|
end
|
22
|
-
|
29
|
+
|
23
30
|
# Allows you to iterate through each address object in the address_list
|
24
31
|
def each
|
25
32
|
address_list.addresses.each do |address|
|
@@ -84,10 +91,10 @@ module Mail
|
|
84
91
|
case
|
85
92
|
when val.nil?
|
86
93
|
raise ArgumentError, "Need to pass an address to <<"
|
87
|
-
when
|
94
|
+
when Utilities.blank?(val)
|
88
95
|
parse(encoded)
|
89
96
|
else
|
90
|
-
self.value = [self.value, val].reject {|a|
|
97
|
+
self.value = [self.value, val].reject {|a| Utilities.blank?(a) }.join(", ")
|
91
98
|
end
|
92
99
|
end
|
93
100
|
|
@@ -97,24 +104,43 @@ module Mail
|
|
97
104
|
end
|
98
105
|
|
99
106
|
private
|
100
|
-
|
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
|
+
|
101
127
|
def do_encode(field_name)
|
102
|
-
return '' if
|
128
|
+
return '' if Utilities.blank?(value)
|
103
129
|
address_array = address_list.addresses.reject { |a| encoded_group_addresses.include?(a.encoded) }.compact.map { |a| a.encoded }
|
104
130
|
address_text = address_array.join(", \r\n\s")
|
105
131
|
group_array = groups.map { |k,v| "#{k}: #{v.map { |a| a.encoded }.join(", \r\n\s")};" }
|
106
132
|
group_text = group_array.join(" \r\n\s")
|
107
|
-
return_array = [address_text, group_text].reject { |a|
|
133
|
+
return_array = [address_text, group_text].reject { |a| Utilities.blank?(a) }
|
108
134
|
"#{field_name}: #{return_array.join(", \r\n\s")}\r\n"
|
109
135
|
end
|
110
136
|
|
111
137
|
def do_decode
|
112
|
-
return nil if
|
138
|
+
return nil if Utilities.blank?(value)
|
113
139
|
address_array = address_list.addresses.reject { |a| decoded_group_addresses.include?(a.decoded) }.map { |a| a.decoded }
|
114
140
|
address_text = address_array.join(", ")
|
115
141
|
group_array = groups.map { |k,v| "#{k}: #{v.map { |a| a.decoded }.join(", ")};" }
|
116
142
|
group_text = group_array.join(" ")
|
117
|
-
return_array = [address_text, group_text].reject { |a|
|
143
|
+
return_array = [address_text, group_text].reject { |a| Utilities.blank?(a) }
|
118
144
|
return_array.join(", ")
|
119
145
|
end
|
120
146
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
module Mail
|
3
4
|
module CommonDate # :nodoc:
|
4
5
|
# Returns a date time object of the parsed date
|
@@ -11,7 +12,7 @@ module Mail
|
|
11
12
|
end
|
12
13
|
|
13
14
|
def parse(val = value)
|
14
|
-
unless
|
15
|
+
unless Utilities.blank?(val)
|
15
16
|
@element = Mail::DateTimeElement.new(val)
|
16
17
|
else
|
17
18
|
nil
|
@@ -1,6 +1,8 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
module Mail
|
3
4
|
module CommonField # :nodoc:
|
5
|
+
include Mail::Constants
|
4
6
|
|
5
7
|
def name=(value)
|
6
8
|
@name = value
|
@@ -12,9 +14,8 @@ module Mail
|
|
12
14
|
|
13
15
|
def value=(value)
|
14
16
|
@length = nil
|
15
|
-
@tree = nil
|
16
17
|
@element = nil
|
17
|
-
@value = value
|
18
|
+
@value = value.is_a?(Array) ? value : value.to_s
|
18
19
|
end
|
19
20
|
|
20
21
|
def value
|
@@ -39,18 +40,12 @@ module Mail
|
|
39
40
|
|
40
41
|
private
|
41
42
|
|
42
|
-
def strip_field(field_name, value)
|
43
|
-
if value.is_a?(Array)
|
44
|
-
value
|
45
|
-
else
|
46
|
-
value.to_s.sub(/#{field_name}:\s+/i, '')
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
43
|
FILENAME_RE = /\b(filename|name)=([^;"\r\n]+\s[^;"\r\n]+)/
|
51
44
|
def ensure_filename_quoted(value)
|
52
45
|
if value.is_a?(String)
|
53
|
-
value.sub
|
46
|
+
value.sub FILENAME_RE, '\1="\2"'
|
47
|
+
else
|
48
|
+
value
|
54
49
|
end
|
55
50
|
end
|
56
51
|
end
|
@@ -1,12 +1,13 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
module Mail
|
3
4
|
module CommonMessageId # :nodoc:
|
4
5
|
def element
|
5
|
-
@element ||= Mail::MessageIdsElement.new(value) unless
|
6
|
+
@element ||= Mail::MessageIdsElement.new(value) unless Utilities.blank?(value)
|
6
7
|
end
|
7
8
|
|
8
9
|
def parse(val = value)
|
9
|
-
unless
|
10
|
+
unless Utilities.blank?(val)
|
10
11
|
@element = Mail::MessageIdsElement.new(val)
|
11
12
|
else
|
12
13
|
nil
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
module Mail
|
3
4
|
|
4
5
|
# ParameterHash is an intelligent Hash that allows you to add
|
@@ -18,7 +19,7 @@ module Mail
|
|
18
19
|
exact = nil
|
19
20
|
each do |k,v|
|
20
21
|
if k =~ /^#{key_pattern}(\*|$)/i
|
21
|
-
if $1 ==
|
22
|
+
if $1 == ASTERISK
|
22
23
|
pairs << [k, v]
|
23
24
|
else
|
24
25
|
exact = k
|
@@ -29,7 +30,7 @@ module Mail
|
|
29
30
|
super(exact || key_name)
|
30
31
|
else # Dealing with a multiple value pair or a single encoded value pair
|
31
32
|
string = pairs.sort { |a,b| a.first.to_s <=> b.first.to_s }.map { |v| v.last }.join('')
|
32
|
-
if mt = string.match(/([\w\-]+)'(\w\w)'(.*)/)
|
33
|
+
if mt = string.match(/([\w\-]+)?'(\w\w)?'(.*)/)
|
33
34
|
string = mt[3]
|
34
35
|
encoding = mt[1]
|
35
36
|
else
|
@@ -40,7 +41,7 @@ module Mail
|
|
40
41
|
end
|
41
42
|
|
42
43
|
def encoded
|
43
|
-
map.
|
44
|
+
map.sort_by { |a| a.first.to_s }.map! do |key_name, value|
|
44
45
|
unless value.ascii_only?
|
45
46
|
value = Mail::Encodings.param_encode(value)
|
46
47
|
key_name = "#{key_name}*"
|
@@ -50,7 +51,7 @@ module Mail
|
|
50
51
|
end
|
51
52
|
|
52
53
|
def decoded
|
53
|
-
map.
|
54
|
+
map.sort_by { |a| a.first.to_s }.map! do |key_name, value|
|
54
55
|
%Q{#{key_name}=#{quote_token(value)}}
|
55
56
|
end.join("; ")
|
56
57
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
#
|
3
4
|
#
|
4
5
|
#
|
@@ -10,7 +11,7 @@ module Mail
|
|
10
11
|
|
11
12
|
def initialize(value = nil, charset = 'utf-8')
|
12
13
|
self.charset = charset
|
13
|
-
super(CAPITALIZED_FIELD,
|
14
|
+
super(CAPITALIZED_FIELD, value, charset)
|
14
15
|
self.parse
|
15
16
|
self
|
16
17
|
end
|
@@ -1,26 +1,27 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
require 'mail/fields/common/parameter_hash'
|
3
4
|
|
4
5
|
module Mail
|
5
6
|
class ContentDispositionField < StructuredField
|
6
|
-
|
7
|
+
|
7
8
|
FIELD_NAME = 'content-disposition'
|
8
9
|
CAPITALIZED_FIELD = 'Content-Disposition'
|
9
|
-
|
10
|
+
|
10
11
|
def initialize(value = nil, charset = 'utf-8')
|
11
12
|
self.charset = charset
|
12
|
-
ensure_filename_quoted(value)
|
13
|
-
super(CAPITALIZED_FIELD,
|
13
|
+
value = ensure_filename_quoted(value)
|
14
|
+
super(CAPITALIZED_FIELD, value, charset)
|
14
15
|
self.parse
|
15
16
|
self
|
16
17
|
end
|
17
|
-
|
18
|
+
|
18
19
|
def parse(val = value)
|
19
|
-
unless
|
20
|
+
unless Utilities.blank?(val)
|
20
21
|
@element = Mail::ContentDispositionElement.new(val)
|
21
22
|
end
|
22
23
|
end
|
23
|
-
|
24
|
+
|
24
25
|
def element
|
25
26
|
@element ||= Mail::ContentDispositionElement.new(value)
|
26
27
|
end
|
@@ -28,20 +29,20 @@ module Mail
|
|
28
29
|
def disposition_type
|
29
30
|
element.disposition_type
|
30
31
|
end
|
31
|
-
|
32
|
+
|
32
33
|
def parameters
|
33
34
|
@parameters = ParameterHash.new
|
34
|
-
element.parameters.each { |p| @parameters.merge!(p) }
|
35
|
+
element.parameters.each { |p| @parameters.merge!(p) } unless element.parameters.nil?
|
35
36
|
@parameters
|
36
37
|
end
|
37
38
|
|
38
39
|
def filename
|
39
40
|
case
|
40
|
-
when
|
41
|
+
when parameters['filename']
|
41
42
|
@filename = parameters['filename']
|
42
|
-
when
|
43
|
+
when parameters['name']
|
43
44
|
@filename = parameters['name']
|
44
|
-
else
|
45
|
+
else
|
45
46
|
@filename = nil
|
46
47
|
end
|
47
48
|
@filename
|
@@ -56,7 +57,7 @@ module Mail
|
|
56
57
|
end
|
57
58
|
"#{CAPITALIZED_FIELD}: #{disposition_type}" + p
|
58
59
|
end
|
59
|
-
|
60
|
+
|
60
61
|
def decoded
|
61
62
|
if parameters.length > 0
|
62
63
|
p = "; #{parameters.decoded}"
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
#
|
3
4
|
#
|
4
5
|
#
|
@@ -11,18 +12,18 @@ module Mail
|
|
11
12
|
def initialize(value = nil, charset = 'utf-8')
|
12
13
|
self.charset = charset
|
13
14
|
@uniq = 1
|
14
|
-
if
|
15
|
+
if Utilities.blank?(value)
|
15
16
|
value = generate_content_id
|
16
17
|
else
|
17
|
-
value =
|
18
|
+
value = value.to_s
|
18
19
|
end
|
19
|
-
super(CAPITALIZED_FIELD,
|
20
|
+
super(CAPITALIZED_FIELD, value, charset)
|
20
21
|
self.parse
|
21
22
|
self
|
22
23
|
end
|
23
24
|
|
24
25
|
def parse(val = value)
|
25
|
-
unless
|
26
|
+
unless Utilities.blank?(val)
|
26
27
|
@element = Mail::MessageIdsElement.new(val)
|
27
28
|
end
|
28
29
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
#
|
3
4
|
#
|
4
5
|
#
|
@@ -10,13 +11,13 @@ module Mail
|
|
10
11
|
|
11
12
|
def initialize(value = nil, charset = 'utf-8')
|
12
13
|
self.charset = charset
|
13
|
-
super(CAPITALIZED_FIELD,
|
14
|
+
super(CAPITALIZED_FIELD, value, charset)
|
14
15
|
self.parse
|
15
16
|
self
|
16
17
|
end
|
17
18
|
|
18
19
|
def parse(val = value)
|
19
|
-
unless
|
20
|
+
unless Utilities.blank?(val)
|
20
21
|
@element = Mail::ContentLocationElement.new(val)
|
21
22
|
end
|
22
23
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
#
|
3
4
|
#
|
4
5
|
#
|
@@ -12,13 +13,13 @@ module Mail
|
|
12
13
|
self.charset = charset
|
13
14
|
value = '7bit' if value.to_s =~ /7-?bits?/i
|
14
15
|
value = '8bit' if value.to_s =~ /8-?bits?/i
|
15
|
-
super(CAPITALIZED_FIELD,
|
16
|
+
super(CAPITALIZED_FIELD, value, charset)
|
16
17
|
self.parse
|
17
18
|
self
|
18
19
|
end
|
19
20
|
|
20
21
|
def parse(val = value)
|
21
|
-
unless
|
22
|
+
unless Utilities.blank?(val)
|
22
23
|
@element = Mail::ContentTransferEncodingElement.new(val)
|
23
24
|
end
|
24
25
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
require 'mail/fields/common/parameter_hash'
|
3
4
|
|
4
5
|
module Mail
|
@@ -17,16 +18,16 @@ module Mail
|
|
17
18
|
@main_type = nil
|
18
19
|
@sub_type = nil
|
19
20
|
@parameters = nil
|
20
|
-
value =
|
21
|
+
value = value.to_s
|
21
22
|
end
|
22
|
-
ensure_filename_quoted(value)
|
23
|
+
value = ensure_filename_quoted(value)
|
23
24
|
super(CAPITALIZED_FIELD, value, charset)
|
24
25
|
self.parse
|
25
26
|
self
|
26
27
|
end
|
27
28
|
|
28
29
|
def parse(val = value)
|
29
|
-
unless
|
30
|
+
unless Utilities.blank?(val)
|
30
31
|
self.value = val
|
31
32
|
@element = nil
|
32
33
|
element
|
@@ -144,9 +145,7 @@ module Mail
|
|
144
145
|
# TODO: check if there are cases where whitespace is not a separator
|
145
146
|
val = val.
|
146
147
|
gsub(/\s*=\s*/,'='). # remove whitespaces around equal sign
|
147
|
-
|
148
|
-
squeeze(';').
|
149
|
-
gsub(';', '; '). #use '; ' as a separator (or EOL)
|
148
|
+
gsub(/[; ]+/, '; '). #use '; ' as a separator (or EOL)
|
150
149
|
gsub(/;\s*$/,'') #remove trailing to keep examples below
|
151
150
|
|
152
151
|
if val =~ /(boundary=(\S*))/i
|
@@ -156,9 +155,6 @@ module Mail
|
|
156
155
|
end
|
157
156
|
|
158
157
|
case
|
159
|
-
when val.chomp =~ /^\s*([\w\-]+)\/([\w\-]+)\s*;;+(.*)$/i
|
160
|
-
# Handles 'text/plain;; format="flowed"' (double semi colon)
|
161
|
-
"#{$1}/#{$2}; #{$3}"
|
162
158
|
when val.chomp =~ /^\s*([\w\-]+)\/([\w\-]+)\s*;\s?(ISO[\w\-]+)$/i
|
163
159
|
# Microsoft helper:
|
164
160
|
# Handles 'type/subtype;ISO-8559-1'
|
@@ -179,13 +175,13 @@ module Mail
|
|
179
175
|
# and: audio/x-midi;\r\n\sname=Part .exe
|
180
176
|
params = $2.to_s.split(/\s+/)
|
181
177
|
params = params.map { |i| i.to_s.chomp.strip }
|
182
|
-
params = params.map { |i| i.split(/\s*\=\s
|
178
|
+
params = params.map { |i| i.split(/\s*\=\s*/, 2) }
|
183
179
|
params = params.map { |i| "#{i[0]}=#{dquote(i[1].to_s.gsub(/;$/,""))}" }.join('; ')
|
184
180
|
"#{type}; #{params}"
|
185
181
|
when val =~ /^\s*$/
|
186
182
|
'text/plain'
|
187
183
|
else
|
188
|
-
|
184
|
+
val
|
189
185
|
end
|
190
186
|
end
|
191
187
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
#
|
3
4
|
# = Date Field
|
4
5
|
#
|
@@ -33,12 +34,11 @@ module Mail
|
|
33
34
|
|
34
35
|
def initialize(value = nil, charset = 'utf-8')
|
35
36
|
self.charset = charset
|
36
|
-
if
|
37
|
+
if Utilities.blank?(value)
|
37
38
|
value = ::DateTime.now.strftime('%a, %d %b %Y %H:%M:%S %z')
|
38
39
|
else
|
39
|
-
value =
|
40
|
-
value.
|
41
|
-
value = ::DateTime.parse(value.to_s.squeeze(" ")).strftime('%a, %d %b %Y %H:%M:%S %z')
|
40
|
+
value = value.to_s.gsub(/\(.*?\)/, '').squeeze(' ')
|
41
|
+
value = ::DateTime.parse(value).strftime('%a, %d %b %Y %H:%M:%S %z')
|
42
42
|
end
|
43
43
|
super(CAPITALIZED_FIELD, value, charset)
|
44
44
|
rescue ArgumentError => e
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
#
|
3
4
|
# = From Field
|
4
5
|
#
|
@@ -38,8 +39,7 @@ module Mail
|
|
38
39
|
|
39
40
|
def initialize(value = nil, charset = 'utf-8')
|
40
41
|
self.charset = charset
|
41
|
-
super(CAPITALIZED_FIELD,
|
42
|
-
self.parse
|
42
|
+
super(CAPITALIZED_FIELD, value, charset)
|
43
43
|
self
|
44
44
|
end
|
45
45
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
#
|
3
4
|
# = In-Reply-To Field
|
4
5
|
#
|
@@ -39,7 +40,7 @@ module Mail
|
|
39
40
|
def initialize(value = nil, charset = 'utf-8')
|
40
41
|
self.charset = charset
|
41
42
|
value = value.join("\r\n\s") if value.is_a?(Array)
|
42
|
-
super(CAPITALIZED_FIELD,
|
43
|
+
super(CAPITALIZED_FIELD, value, charset)
|
43
44
|
self.parse
|
44
45
|
self
|
45
46
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
#
|
3
4
|
# keywords = "Keywords:" phrase *("," phrase) CRLF
|
4
5
|
module Mail
|
@@ -9,13 +10,12 @@ module Mail
|
|
9
10
|
|
10
11
|
def initialize(value = nil, charset = 'utf-8')
|
11
12
|
self.charset = charset
|
12
|
-
super(CAPITALIZED_FIELD,
|
13
|
-
self.parse
|
13
|
+
super(CAPITALIZED_FIELD, value, charset)
|
14
14
|
self
|
15
15
|
end
|
16
16
|
|
17
17
|
def parse(val = value)
|
18
|
-
unless
|
18
|
+
unless Utilities.blank?(val)
|
19
19
|
@phrase_list ||= PhraseList.new(value)
|
20
20
|
end
|
21
21
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
#
|
3
4
|
# = Message-ID Field
|
4
5
|
#
|
@@ -41,11 +42,11 @@ module Mail
|
|
41
42
|
def initialize(value = nil, charset = 'utf-8')
|
42
43
|
self.charset = charset
|
43
44
|
@uniq = 1
|
44
|
-
if
|
45
|
+
if Utilities.blank?(value)
|
45
46
|
self.name = CAPITALIZED_FIELD
|
46
47
|
self.value = generate_message_id
|
47
48
|
else
|
48
|
-
super(CAPITALIZED_FIELD,
|
49
|
+
super(CAPITALIZED_FIELD, value, charset)
|
49
50
|
end
|
50
51
|
self.parse
|
51
52
|
self
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
#
|
3
4
|
#
|
4
5
|
#
|
@@ -10,17 +11,17 @@ module Mail
|
|
10
11
|
|
11
12
|
def initialize(value = nil, charset = 'utf-8')
|
12
13
|
self.charset = charset
|
13
|
-
if
|
14
|
+
if Utilities.blank?(value)
|
14
15
|
value = '1.0'
|
15
16
|
end
|
16
|
-
super(CAPITALIZED_FIELD,
|
17
|
+
super(CAPITALIZED_FIELD, value, charset)
|
17
18
|
self.parse
|
18
19
|
self
|
19
20
|
|
20
21
|
end
|
21
22
|
|
22
23
|
def parse(val = value)
|
23
|
-
unless
|
24
|
+
unless Utilities.blank?(val)
|
24
25
|
@element = Mail::MimeVersionElement.new(val)
|
25
26
|
end
|
26
27
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
#
|
3
4
|
# The field names of any optional-field MUST NOT be identical to any
|
4
5
|
# field name specified elsewhere in this standard.
|
@@ -8,6 +9,9 @@ require 'mail/fields/unstructured_field'
|
|
8
9
|
|
9
10
|
module Mail
|
10
11
|
class OptionalField < UnstructuredField
|
11
|
-
|
12
|
+
private
|
13
|
+
def do_encode
|
14
|
+
"#{wrapped_value}\r\n"
|
15
|
+
end
|
12
16
|
end
|
13
17
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
#
|
3
4
|
# trace = [return]
|
4
5
|
# 1*received
|
@@ -27,14 +28,14 @@ module Mail
|
|
27
28
|
|
28
29
|
def initialize(value = nil, charset = 'utf-8')
|
29
30
|
self.charset = charset
|
30
|
-
super(CAPITALIZED_FIELD,
|
31
|
+
super(CAPITALIZED_FIELD, value, charset)
|
31
32
|
self.parse
|
32
33
|
self
|
33
34
|
|
34
35
|
end
|
35
36
|
|
36
37
|
def parse(val = value)
|
37
|
-
unless
|
38
|
+
unless Utilities.blank?(val)
|
38
39
|
@element = Mail::ReceivedElement.new(val)
|
39
40
|
end
|
40
41
|
end
|
@@ -56,7 +57,7 @@ module Mail
|
|
56
57
|
end
|
57
58
|
|
58
59
|
def encoded
|
59
|
-
if
|
60
|
+
if Utilities.blank?(value)
|
60
61
|
"#{CAPITALIZED_FIELD}: \r\n"
|
61
62
|
else
|
62
63
|
"#{CAPITALIZED_FIELD}: #{info}; #{formatted_date}\r\n"
|
@@ -64,7 +65,7 @@ module Mail
|
|
64
65
|
end
|
65
66
|
|
66
67
|
def decoded
|
67
|
-
if
|
68
|
+
if Utilities.blank?(value)
|
68
69
|
""
|
69
70
|
else
|
70
71
|
"#{info}; #{formatted_date}"
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
#
|
3
4
|
# = References Field
|
4
5
|
#
|
@@ -39,7 +40,7 @@ module Mail
|
|
39
40
|
def initialize(value = nil, charset = 'utf-8')
|
40
41
|
self.charset = charset
|
41
42
|
value = value.join("\r\n\s") if value.is_a?(Array)
|
42
|
-
super(CAPITALIZED_FIELD,
|
43
|
+
super(CAPITALIZED_FIELD, value, charset)
|
43
44
|
self.parse
|
44
45
|
self
|
45
46
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
#
|
3
4
|
# = Reply-To Field
|
4
5
|
#
|
@@ -38,8 +39,7 @@ module Mail
|
|
38
39
|
|
39
40
|
def initialize(value = nil, charset = 'utf-8')
|
40
41
|
self.charset = charset
|
41
|
-
super(CAPITALIZED_FIELD,
|
42
|
-
self.parse
|
42
|
+
super(CAPITALIZED_FIELD, value, charset)
|
43
43
|
self
|
44
44
|
end
|
45
45
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
#
|
3
4
|
# = Resent-Bcc Field
|
4
5
|
#
|
@@ -38,8 +39,7 @@ module Mail
|
|
38
39
|
|
39
40
|
def initialize(value = nil, charset = 'utf-8')
|
40
41
|
self.charset = charset
|
41
|
-
super(CAPITALIZED_FIELD,
|
42
|
-
self.parse
|
42
|
+
super(CAPITALIZED_FIELD, value, charset)
|
43
43
|
self
|
44
44
|
end
|
45
45
|
|