mail 2.6.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 +5 -5
- data/MIT-LICENSE +1 -1
- data/README.md +150 -107
- data/lib/mail/attachments_list.rb +13 -10
- data/lib/mail/body.rb +104 -90
- data/lib/mail/check_delivery_params.rb +55 -10
- data/lib/mail/configuration.rb +3 -0
- data/lib/mail/constants.rb +79 -0
- data/lib/mail/elements/address.rb +96 -108
- data/lib/mail/elements/address_list.rb +13 -30
- data/lib/mail/elements/content_disposition_element.rb +10 -16
- data/lib/mail/elements/content_location_element.rb +9 -13
- data/lib/mail/elements/content_transfer_encoding_element.rb +7 -11
- data/lib/mail/elements/content_type_element.rb +17 -23
- data/lib/mail/elements/date_time_element.rb +8 -15
- data/lib/mail/elements/envelope_from_element.rb +23 -23
- data/lib/mail/elements/message_ids_element.rb +22 -15
- data/lib/mail/elements/mime_version_element.rb +8 -15
- data/lib/mail/elements/phrase_list.rb +13 -10
- data/lib/mail/elements/received_element.rb +28 -19
- data/lib/mail/elements.rb +1 -0
- data/lib/mail/encodings/7bit.rb +10 -14
- 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 +102 -92
- data/lib/mail/envelope.rb +12 -14
- data/lib/mail/field.rb +121 -85
- data/lib/mail/field_list.rb +62 -8
- data/lib/mail/fields/bcc_field.rb +42 -48
- data/lib/mail/fields/cc_field.rb +29 -50
- data/lib/mail/fields/comments_field.rb +28 -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 +8 -14
- data/lib/mail/fields/content_disposition_field.rb +20 -44
- data/lib/mail/fields/content_id_field.rb +25 -51
- data/lib/mail/fields/content_location_field.rb +12 -25
- data/lib/mail/fields/content_transfer_encoding_field.rb +32 -31
- data/lib/mail/fields/content_type_field.rb +51 -80
- data/lib/mail/fields/date_field.rb +24 -52
- data/lib/mail/fields/from_field.rb +29 -50
- data/lib/mail/fields/in_reply_to_field.rb +39 -49
- data/lib/mail/fields/keywords_field.rb +19 -32
- data/lib/mail/fields/message_id_field.rb +26 -71
- data/lib/mail/fields/mime_version_field.rb +20 -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 +10 -7
- data/lib/mail/fields/{common/parameter_hash.rb → parameter_hash.rb} +16 -13
- data/lib/mail/fields/received_field.rb +44 -57
- data/lib/mail/fields/references_field.rb +36 -49
- data/lib/mail/fields/reply_to_field.rb +29 -50
- data/lib/mail/fields/resent_bcc_field.rb +29 -50
- data/lib/mail/fields/resent_cc_field.rb +29 -50
- data/lib/mail/fields/resent_date_field.rb +6 -30
- data/lib/mail/fields/resent_from_field.rb +29 -50
- data/lib/mail/fields/resent_message_id_field.rb +6 -29
- data/lib/mail/fields/resent_sender_field.rb +28 -57
- data/lib/mail/fields/resent_to_field.rb +29 -50
- data/lib/mail/fields/return_path_field.rb +51 -55
- data/lib/mail/fields/sender_field.rb +35 -56
- data/lib/mail/fields/structured_field.rb +4 -30
- data/lib/mail/fields/subject_field.rb +10 -11
- data/lib/mail/fields/to_field.rb +29 -50
- data/lib/mail/fields/unstructured_field.rb +36 -50
- data/lib/mail/fields.rb +1 -0
- data/lib/mail/header.rb +73 -110
- data/lib/mail/indifferent_hash.rb +1 -0
- data/lib/mail/mail.rb +6 -11
- data/lib/mail/matchers/attachment_matchers.rb +44 -0
- data/lib/mail/matchers/has_sent_mail.rb +53 -9
- data/lib/mail/message.rb +132 -136
- data/lib/mail/multibyte/chars.rb +24 -180
- data/lib/mail/multibyte/unicode.rb +31 -26
- data/lib/mail/multibyte/utils.rb +27 -43
- data/lib/mail/multibyte.rb +56 -16
- data/lib/mail/network/delivery_methods/exim.rb +9 -11
- data/lib/mail/network/delivery_methods/file_delivery.rb +14 -16
- data/lib/mail/network/delivery_methods/logger_delivery.rb +34 -0
- data/lib/mail/network/delivery_methods/sendmail.rb +68 -24
- data/lib/mail/network/delivery_methods/smtp.rb +77 -54
- data/lib/mail/network/delivery_methods/smtp_connection.rb +5 -9
- data/lib/mail/network/delivery_methods/test_mailer.rb +9 -9
- data/lib/mail/network/retriever_methods/base.rb +9 -8
- data/lib/mail/network/retriever_methods/imap.rb +21 -7
- data/lib/mail/network/retriever_methods/pop3.rb +6 -3
- data/lib/mail/network/retriever_methods/test_retriever.rb +4 -2
- data/lib/mail/network.rb +2 -0
- data/lib/mail/parser_tools.rb +15 -0
- data/lib/mail/parsers/address_lists_parser.rb +33226 -116
- data/lib/mail/parsers/address_lists_parser.rl +179 -0
- data/lib/mail/parsers/content_disposition_parser.rb +883 -49
- data/lib/mail/parsers/content_disposition_parser.rl +89 -0
- data/lib/mail/parsers/content_location_parser.rb +810 -23
- data/lib/mail/parsers/content_location_parser.rl +78 -0
- data/lib/mail/parsers/content_transfer_encoding_parser.rb +510 -21
- data/lib/mail/parsers/content_transfer_encoding_parser.rl +71 -0
- data/lib/mail/parsers/content_type_parser.rb +1031 -47
- data/lib/mail/parsers/content_type_parser.rl +90 -0
- data/lib/mail/parsers/date_time_parser.rb +879 -24
- data/lib/mail/parsers/date_time_parser.rl +69 -0
- data/lib/mail/parsers/envelope_from_parser.rb +3670 -40
- data/lib/mail/parsers/envelope_from_parser.rl +89 -0
- data/lib/mail/parsers/message_ids_parser.rb +5147 -25
- data/lib/mail/parsers/message_ids_parser.rl +93 -0
- data/lib/mail/parsers/mime_version_parser.rb +498 -26
- data/lib/mail/parsers/mime_version_parser.rl +68 -0
- data/lib/mail/parsers/phrase_lists_parser.rb +872 -21
- data/lib/mail/parsers/phrase_lists_parser.rl +90 -0
- data/lib/mail/parsers/received_parser.rb +8777 -42
- data/lib/mail/parsers/received_parser.rl +91 -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 +74 -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 +12 -25
- data/lib/mail/part.rb +11 -12
- data/lib/mail/parts_list.rb +88 -14
- data/lib/mail/smtp_envelope.rb +57 -0
- data/lib/mail/utilities.rb +377 -40
- data/lib/mail/values/unicode_tables.dat +0 -0
- data/lib/mail/version.rb +8 -15
- data/lib/mail/yaml.rb +30 -0
- data/lib/mail.rb +9 -32
- metadata +138 -94
- 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/smtp.rb +0 -24
- data/lib/mail/core_extensions/string/access.rb +0 -145
- data/lib/mail/core_extensions/string/multibyte.rb +0 -78
- data/lib/mail/core_extensions/string.rb +0 -43
- data/lib/mail/fields/common/address_container.rb +0 -16
- data/lib/mail/fields/common/common_address.rb +0 -135
- data/lib/mail/fields/common/common_date.rb +0 -35
- data/lib/mail/fields/common/common_field.rb +0 -57
- data/lib/mail/fields/common/common_message_id.rb +0 -48
- 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
- data/lib/mail/patterns.rb +0 -37
- data/lib/mail/version_specific/ruby_1_8.rb +0 -119
- data/lib/mail/version_specific/ruby_1_9.rb +0 -159
@@ -1,36 +1,36 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
require 'mail/parsers/address_lists_parser'
|
4
|
+
require 'mail/constants'
|
5
|
+
require 'mail/utilities'
|
6
|
+
|
2
7
|
module Mail
|
8
|
+
# Mail::Address handles all email addresses in Mail. It takes an email address string
|
9
|
+
# and parses it, breaking it down into its component parts and allowing you to get the
|
10
|
+
# address, comments, display name, name, local part, domain part and fully formatted
|
11
|
+
# address.
|
12
|
+
#
|
13
|
+
# Mail::Address requires a correctly formatted email address per RFC2822 or RFC822. It
|
14
|
+
# handles all obsolete versions including obsolete domain routing on the local part.
|
15
|
+
#
|
16
|
+
# a = Address.new('Mikel Lindsaar (My email address) <mikel@test.lindsaar.net>')
|
17
|
+
# a.format #=> 'Mikel Lindsaar <mikel@test.lindsaar.net> (My email address)'
|
18
|
+
# a.address #=> 'mikel@test.lindsaar.net'
|
19
|
+
# a.display_name #=> 'Mikel Lindsaar'
|
20
|
+
# a.local #=> 'mikel'
|
21
|
+
# a.domain #=> 'test.lindsaar.net'
|
22
|
+
# a.comments #=> ['My email address']
|
23
|
+
# a.to_s #=> 'Mikel Lindsaar <mikel@test.lindsaar.net> (My email address)'
|
3
24
|
class Address
|
4
|
-
|
5
|
-
include Mail::Utilities
|
6
|
-
|
7
|
-
# Mail::Address handles all email addresses in Mail. It takes an email address string
|
8
|
-
# and parses it, breaking it down into its component parts and allowing you to get the
|
9
|
-
# address, comments, display name, name, local part, domain part and fully formatted
|
10
|
-
# address.
|
11
|
-
#
|
12
|
-
# Mail::Address requires a correctly formatted email address per RFC2822 or RFC822. It
|
13
|
-
# handles all obsolete versions including obsolete domain routing on the local part.
|
14
|
-
#
|
15
|
-
# a = Address.new('Mikel Lindsaar (My email address) <mikel@test.lindsaar.net>')
|
16
|
-
# a.format #=> 'Mikel Lindsaar <mikel@test.lindsaar.net> (My email address)'
|
17
|
-
# a.address #=> 'mikel@test.lindsaar.net'
|
18
|
-
# a.display_name #=> 'Mikel Lindsaar'
|
19
|
-
# a.local #=> 'mikel'
|
20
|
-
# a.domain #=> 'test.lindsaar.net'
|
21
|
-
# a.comments #=> ['My email address']
|
22
|
-
# a.to_s #=> 'Mikel Lindsaar <mikel@test.lindsaar.net> (My email address)'
|
23
25
|
def initialize(value = nil)
|
24
|
-
@output_type = :decode
|
25
26
|
if value.nil?
|
26
27
|
@parsed = false
|
27
28
|
@data = nil
|
28
|
-
return
|
29
29
|
else
|
30
30
|
parse(value)
|
31
31
|
end
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
# Returns the raw input of the passed in string, this is before it is passed
|
35
35
|
# by the parser.
|
36
36
|
def raw
|
@@ -44,111 +44,120 @@ module Mail
|
|
44
44
|
#
|
45
45
|
# a = Address.new('Mikel Lindsaar (My email address) <mikel@test.lindsaar.net>')
|
46
46
|
# a.format #=> 'Mikel Lindsaar <mikel@test.lindsaar.net> (My email address)'
|
47
|
-
def format
|
47
|
+
def format(output_type = :decode)
|
48
48
|
parse unless @parsed
|
49
49
|
if @data.nil?
|
50
|
-
|
51
|
-
elsif display_name
|
52
|
-
[quote_phrase(
|
53
|
-
elsif address
|
54
|
-
[
|
50
|
+
Constants::EMPTY
|
51
|
+
elsif name = display_name(output_type)
|
52
|
+
[Utilities.quote_phrase(name), "<#{address(output_type)}>", format_comments].compact.join(Constants::SPACE)
|
53
|
+
elsif a = address(output_type)
|
54
|
+
[a, format_comments].compact.join(Constants::SPACE)
|
55
55
|
else
|
56
56
|
raw
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
-
# Returns the address that is in the address itself. That is, the
|
60
|
+
# Returns the address that is in the address itself. That is, the
|
61
61
|
# local@domain string, without any angle brackets or the like.
|
62
|
-
#
|
62
|
+
#
|
63
63
|
# a = Address.new('Mikel Lindsaar (My email address) <mikel@test.lindsaar.net>')
|
64
64
|
# a.address #=> 'mikel@test.lindsaar.net'
|
65
|
-
def address
|
65
|
+
def address(output_type = :decode)
|
66
66
|
parse unless @parsed
|
67
|
-
|
67
|
+
if d = domain(output_type)
|
68
|
+
"#{local(output_type)}@#{d}"
|
69
|
+
else
|
70
|
+
local(output_type)
|
71
|
+
end
|
68
72
|
end
|
69
|
-
|
73
|
+
|
70
74
|
# Provides a way to assign an address to an already made Mail::Address object.
|
71
|
-
#
|
75
|
+
#
|
72
76
|
# a = Address.new
|
73
77
|
# a.address = 'Mikel Lindsaar (My email address) <mikel@test.lindsaar.net>'
|
74
78
|
# a.address #=> 'mikel@test.lindsaar.net'
|
75
79
|
def address=(value)
|
76
80
|
parse(value)
|
77
81
|
end
|
78
|
-
|
82
|
+
|
79
83
|
# Returns the display name of the email address passed in.
|
80
|
-
#
|
84
|
+
#
|
81
85
|
# a = Address.new('Mikel Lindsaar (My email address) <mikel@test.lindsaar.net>')
|
82
86
|
# a.display_name #=> 'Mikel Lindsaar'
|
83
|
-
def display_name
|
87
|
+
def display_name(output_type = :decode)
|
84
88
|
parse unless @parsed
|
85
89
|
@display_name ||= get_display_name
|
86
|
-
Encodings.decode_encode(@display_name.to_s,
|
90
|
+
Encodings.decode_encode(@display_name.to_s, output_type) if @display_name
|
87
91
|
end
|
88
|
-
|
92
|
+
|
89
93
|
# Provides a way to assign a display name to an already made Mail::Address object.
|
90
|
-
#
|
94
|
+
#
|
91
95
|
# a = Address.new
|
92
96
|
# a.address = 'mikel@test.lindsaar.net'
|
93
97
|
# a.display_name = 'Mikel Lindsaar'
|
94
98
|
# a.format #=> 'Mikel Lindsaar <mikel@test.lindsaar.net>'
|
95
99
|
def display_name=( str )
|
96
|
-
@display_name = str
|
100
|
+
@display_name = str.nil? ? nil : str.dup # in case frozen
|
97
101
|
end
|
98
102
|
|
99
103
|
# Returns the local part (the left hand side of the @ sign in the email address) of
|
100
104
|
# the address
|
101
|
-
#
|
105
|
+
#
|
102
106
|
# a = Address.new('Mikel Lindsaar (My email address) <mikel@test.lindsaar.net>')
|
103
107
|
# a.local #=> 'mikel'
|
104
|
-
def local
|
108
|
+
def local(output_type = :decode)
|
105
109
|
parse unless @parsed
|
106
|
-
"#{@data.obs_domain_list}#{get_local.strip}" if get_local
|
110
|
+
Encodings.decode_encode("#{@data.obs_domain_list}#{get_local.strip}", output_type) if get_local
|
107
111
|
end
|
108
112
|
|
109
113
|
# Returns the domain part (the right hand side of the @ sign in the email address) of
|
110
114
|
# the address
|
111
|
-
#
|
115
|
+
#
|
112
116
|
# a = Address.new('Mikel Lindsaar (My email address) <mikel@test.lindsaar.net>')
|
113
117
|
# a.domain #=> 'test.lindsaar.net'
|
114
|
-
def domain
|
118
|
+
def domain(output_type = :decode)
|
115
119
|
parse unless @parsed
|
116
|
-
strip_all_comments(get_domain) if get_domain
|
120
|
+
Encodings.decode_encode(strip_all_comments(get_domain), output_type) if get_domain
|
117
121
|
end
|
118
|
-
|
119
|
-
# Returns an array of comments that are in the email, or
|
122
|
+
|
123
|
+
# Returns an array of comments that are in the email, or nil if there
|
120
124
|
# are no comments
|
121
|
-
#
|
125
|
+
#
|
122
126
|
# a = Address.new('Mikel Lindsaar (My email address) <mikel@test.lindsaar.net>')
|
123
127
|
# a.comments #=> ['My email address']
|
128
|
+
#
|
129
|
+
# b = Address.new('Mikel Lindsaar <mikel@test.lindsaar.net>')
|
130
|
+
# b.comments #=> nil
|
131
|
+
|
124
132
|
def comments
|
125
133
|
parse unless @parsed
|
126
|
-
|
134
|
+
comments = get_comments
|
135
|
+
if comments.nil? || comments.none?
|
127
136
|
nil
|
128
137
|
else
|
129
|
-
|
138
|
+
comments.map { |c| c.squeeze(Constants::SPACE) }
|
130
139
|
end
|
131
140
|
end
|
132
|
-
|
141
|
+
|
133
142
|
# Sometimes an address will not have a display name, but might have the name
|
134
143
|
# as a comment field after the address. This returns that name if it exists.
|
135
|
-
#
|
144
|
+
#
|
136
145
|
# a = Address.new('mikel@test.lindsaar.net (Mikel Lindsaar)')
|
137
146
|
# a.name #=> 'Mikel Lindsaar'
|
138
147
|
def name
|
139
148
|
parse unless @parsed
|
140
149
|
get_name
|
141
150
|
end
|
142
|
-
|
151
|
+
|
143
152
|
# Returns the format of the address, or returns nothing
|
144
|
-
#
|
153
|
+
#
|
145
154
|
# a = Address.new('Mikel Lindsaar (My email address) <mikel@test.lindsaar.net>')
|
146
155
|
# a.format #=> 'Mikel Lindsaar <mikel@test.lindsaar.net> (My email address)'
|
147
156
|
def to_s
|
148
157
|
parse unless @parsed
|
149
158
|
format
|
150
159
|
end
|
151
|
-
|
160
|
+
|
152
161
|
# Shows the Address object basic details, including the Address
|
153
162
|
# a = Address.new('Mikel (My email) <mikel@test.lindsaar.net>')
|
154
163
|
# a.inspect #=> "#<Mail::Address:14184910 Address: |Mikel <mikel@test.lindsaar.net> (My email)| >"
|
@@ -156,99 +165,78 @@ module Mail
|
|
156
165
|
parse unless @parsed
|
157
166
|
"#<#{self.class}:#{self.object_id} Address: |#{to_s}| >"
|
158
167
|
end
|
159
|
-
|
168
|
+
|
160
169
|
def encoded
|
161
|
-
|
162
|
-
format
|
170
|
+
format :encode
|
163
171
|
end
|
164
|
-
|
172
|
+
|
165
173
|
def decoded
|
166
|
-
|
167
|
-
|
174
|
+
format :decode
|
175
|
+
end
|
176
|
+
|
177
|
+
def group
|
178
|
+
@data && @data.group
|
168
179
|
end
|
169
180
|
|
170
181
|
private
|
171
|
-
|
182
|
+
|
172
183
|
def parse(value = nil)
|
173
184
|
@parsed = true
|
185
|
+
@data = nil
|
174
186
|
|
175
187
|
case value
|
176
|
-
when
|
177
|
-
@data = nil
|
178
|
-
nil
|
179
|
-
when Mail::Parsers::AddressStruct
|
188
|
+
when Mail::Parsers::AddressListsParser::AddressStruct
|
180
189
|
@data = value
|
181
190
|
when String
|
182
|
-
|
183
|
-
|
184
|
-
@data = nil
|
185
|
-
else
|
186
|
-
address_list = Mail::Parsers::AddressListsParser.new.parse(value)
|
191
|
+
unless Utilities.blank?(value)
|
192
|
+
address_list = Mail::Parsers::AddressListsParser.parse(value)
|
187
193
|
@data = address_list.addresses.first
|
188
194
|
end
|
189
195
|
end
|
190
196
|
end
|
191
|
-
|
197
|
+
|
192
198
|
def strip_all_comments(string)
|
193
|
-
unless
|
199
|
+
unless Utilities.blank?(comments)
|
194
200
|
comments.each do |comment|
|
195
|
-
string = string.gsub("(#{comment})",
|
201
|
+
string = string.gsub("(#{comment})", Constants::EMPTY)
|
196
202
|
end
|
197
203
|
end
|
198
204
|
string.strip
|
199
205
|
end
|
200
206
|
|
201
207
|
def strip_domain_comments(value)
|
202
|
-
unless
|
208
|
+
unless Utilities.blank?(comments)
|
203
209
|
comments.each do |comment|
|
204
210
|
if @data.domain && @data.domain.include?("(#{comment})")
|
205
|
-
value = value.gsub("(#{comment})",
|
211
|
+
value = value.gsub("(#{comment})", Constants::EMPTY)
|
206
212
|
end
|
207
213
|
end
|
208
214
|
end
|
209
215
|
value.to_s.strip
|
210
216
|
end
|
211
|
-
|
217
|
+
|
212
218
|
def get_display_name
|
213
|
-
if @data.display_name
|
219
|
+
if @data && @data.display_name
|
214
220
|
str = strip_all_comments(@data.display_name.to_s)
|
215
|
-
elsif @data.comments
|
216
|
-
|
217
|
-
str = strip_domain_comments(format_comments)
|
218
|
-
else
|
219
|
-
str = nil
|
220
|
-
end
|
221
|
-
else
|
222
|
-
nil
|
223
|
-
end
|
224
|
-
|
225
|
-
if str.blank?
|
226
|
-
nil
|
227
|
-
else
|
228
|
-
str
|
221
|
+
elsif @data && @data.comments && @data.domain
|
222
|
+
str = strip_domain_comments(format_comments)
|
229
223
|
end
|
224
|
+
str unless Utilities.blank?(str)
|
230
225
|
end
|
231
|
-
|
226
|
+
|
232
227
|
def get_name
|
233
228
|
if display_name
|
234
229
|
str = display_name
|
235
|
-
|
236
|
-
|
237
|
-
comment_text = comments.join(' ').squeeze(" ")
|
238
|
-
str = "(#{comment_text})"
|
239
|
-
end
|
230
|
+
elsif comments
|
231
|
+
str = "(#{comments.join(Constants::SPACE).squeeze(Constants::SPACE)})"
|
240
232
|
end
|
241
233
|
|
242
|
-
|
243
|
-
nil
|
244
|
-
else
|
245
|
-
unparen(str)
|
246
|
-
end
|
234
|
+
Utilities.unparen(str) unless Utilities.blank?(str)
|
247
235
|
end
|
248
|
-
|
236
|
+
|
249
237
|
def format_comments
|
250
238
|
if comments
|
251
|
-
comment_text = comments.map {|c| escape_paren(c) }.join(
|
239
|
+
comment_text = comments.map {|c| Utilities.escape_paren(c) }.join(Constants::SPACE).squeeze(Constants::SPACE)
|
252
240
|
@format_comments ||= "(#{comment_text})"
|
253
241
|
else
|
254
242
|
nil
|
@@ -262,7 +250,7 @@ module Mail
|
|
262
250
|
def get_domain
|
263
251
|
@data && @data.domain
|
264
252
|
end
|
265
|
-
|
253
|
+
|
266
254
|
def get_comments
|
267
255
|
@data && @data.comments
|
268
256
|
end
|
@@ -1,51 +1,34 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
require 'mail/parsers/address_lists_parser'
|
4
|
+
|
2
5
|
module Mail
|
3
|
-
class AddressList
|
6
|
+
class AddressList #:nodoc:
|
7
|
+
attr_reader :addresses, :group_names
|
4
8
|
|
5
9
|
# Mail::AddressList is the class that parses To, From and other address fields from
|
6
10
|
# emails passed into Mail.
|
7
|
-
#
|
11
|
+
#
|
8
12
|
# AddressList provides a way to query the groups and mailbox lists of the passed in
|
9
13
|
# string.
|
10
|
-
#
|
14
|
+
#
|
11
15
|
# It can supply all addresses in an array, or return each address as an address object.
|
12
|
-
#
|
16
|
+
#
|
13
17
|
# Mail::AddressList requires a correctly formatted group or mailbox list per RFC2822 or
|
14
18
|
# RFC822. It also handles all obsolete versions in those RFCs.
|
15
|
-
#
|
19
|
+
#
|
16
20
|
# list = 'ada@test.lindsaar.net, My Group: mikel@test.lindsaar.net, Bob <bob@test.lindsaar.net>;'
|
17
21
|
# a = AddressList.new(list)
|
18
22
|
# a.addresses #=> [#<Mail::Address:14943130 Address: |ada@test.lindsaar.net...
|
19
23
|
# a.group_names #=> ["My Group"]
|
20
24
|
def initialize(string)
|
21
|
-
|
22
|
-
@
|
23
|
-
|
24
|
-
|
25
|
-
# Returns a list of address objects from the parsed line
|
26
|
-
def addresses
|
27
|
-
@addresses ||= @address_list.addresses.map do |address_data|
|
28
|
-
Mail::Address.new(address_data)
|
29
|
-
end
|
25
|
+
address_list = Parsers::AddressListsParser.parse(string)
|
26
|
+
@addresses = address_list.addresses.map { |a| Address.new(a) }
|
27
|
+
@group_names = address_list.group_names
|
30
28
|
end
|
31
29
|
|
32
30
|
def addresses_grouped_by_group
|
33
|
-
|
34
|
-
|
35
|
-
@addresses_grouped_by_group = {}
|
36
|
-
|
37
|
-
@address_list.addresses.each do |address_data|
|
38
|
-
if group = address_data.group
|
39
|
-
@addresses_grouped_by_group[group] ||= []
|
40
|
-
@addresses_grouped_by_group[group] << Mail::Address.new(address_data)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
@addresses_grouped_by_group
|
44
|
-
end
|
45
|
-
|
46
|
-
# Returns the names as an array of strings of all groups
|
47
|
-
def group_names # :nodoc:
|
48
|
-
@address_list.group_names
|
31
|
+
addresses.select(&:group).group_by(&:group)
|
49
32
|
end
|
50
33
|
end
|
51
34
|
end
|
@@ -1,26 +1,20 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
require 'mail/parsers/content_disposition_parser'
|
4
|
+
|
2
5
|
module Mail
|
3
|
-
class ContentDispositionElement
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
content_disposition = Mail::Parsers::ContentDispositionParser.new.parse(cleaned(string))
|
6
|
+
class ContentDispositionElement #:nodoc:
|
7
|
+
attr_reader :disposition_type, :parameters
|
8
|
+
|
9
|
+
def initialize(string)
|
10
|
+
content_disposition = Mail::Parsers::ContentDispositionParser.parse(cleaned(string))
|
9
11
|
@disposition_type = content_disposition.disposition_type
|
10
12
|
@parameters = content_disposition.parameters
|
11
13
|
end
|
12
|
-
|
13
|
-
|
14
|
-
@disposition_type
|
15
|
-
end
|
16
|
-
|
17
|
-
def parameters
|
18
|
-
@parameters
|
19
|
-
end
|
20
|
-
|
14
|
+
|
15
|
+
private
|
21
16
|
def cleaned(string)
|
22
17
|
string =~ /(.+);\s*$/ ? $1 : string
|
23
18
|
end
|
24
|
-
|
25
19
|
end
|
26
20
|
end
|
@@ -1,21 +1,17 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
require 'mail/parsers/content_location_parser'
|
4
|
+
|
2
5
|
module Mail
|
3
|
-
class ContentLocationElement
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
content_location = Mail::Parsers::ContentLocationParser.new.parse(string)
|
9
|
-
@location = content_location.location
|
6
|
+
class ContentLocationElement #:nodoc:
|
7
|
+
attr_reader :location
|
8
|
+
|
9
|
+
def initialize(string)
|
10
|
+
@location = Mail::Parsers::ContentLocationParser.parse(string).location
|
10
11
|
end
|
11
|
-
|
12
|
-
def location
|
13
|
-
@location
|
14
|
-
end
|
15
|
-
|
12
|
+
|
16
13
|
def to_s(*args)
|
17
14
|
location.to_s
|
18
15
|
end
|
19
|
-
|
20
16
|
end
|
21
17
|
end
|
@@ -1,17 +1,13 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
require 'mail/parsers/content_transfer_encoding_parser'
|
4
|
+
|
2
5
|
module Mail
|
3
|
-
class ContentTransferEncodingElement
|
4
|
-
|
5
|
-
|
6
|
-
|
6
|
+
class ContentTransferEncodingElement #:nodoc:
|
7
|
+
attr_reader :encoding
|
8
|
+
|
7
9
|
def initialize(string)
|
8
|
-
|
9
|
-
@encoding = content_transfer_encoding.encoding
|
10
|
+
@encoding = Mail::Parsers::ContentTransferEncodingParser.parse(string).encoding
|
10
11
|
end
|
11
|
-
|
12
|
-
def encoding
|
13
|
-
@encoding
|
14
|
-
end
|
15
|
-
|
16
12
|
end
|
17
13
|
end
|
@@ -1,31 +1,25 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
require 'mail/parsers/content_type_parser'
|
4
|
+
|
2
5
|
module Mail
|
3
|
-
class ContentTypeElement
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
content_type = Mail::Parsers::ContentTypeParser.new.parse(cleaned(string))
|
6
|
+
class ContentTypeElement #:nodoc:
|
7
|
+
attr_reader :main_type, :sub_type, :parameters
|
8
|
+
|
9
|
+
def initialize(string)
|
10
|
+
content_type = Mail::Parsers::ContentTypeParser.parse(cleaned(string))
|
9
11
|
@main_type = content_type.main_type
|
10
12
|
@sub_type = content_type.sub_type
|
11
13
|
@parameters = content_type.parameters
|
12
14
|
end
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
def parameters
|
23
|
-
@parameters
|
24
|
-
end
|
25
|
-
|
26
|
-
def cleaned(string)
|
27
|
-
string =~ /(.+);\s*$/ ? $1 : string
|
28
|
-
end
|
29
|
-
|
15
|
+
|
16
|
+
private
|
17
|
+
def cleaned(string)
|
18
|
+
if string =~ /;\s*$/
|
19
|
+
$`
|
20
|
+
else
|
21
|
+
string
|
22
|
+
end
|
23
|
+
end
|
30
24
|
end
|
31
25
|
end
|
@@ -1,22 +1,15 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
require 'mail/parsers/date_time_parser'
|
4
|
+
|
2
5
|
module Mail
|
3
|
-
class DateTimeElement
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
date_time = Mail::Parsers::DateTimeParser.new.parse(string)
|
6
|
+
class DateTimeElement #:nodoc:
|
7
|
+
attr_reader :date_string, :time_string
|
8
|
+
|
9
|
+
def initialize(string)
|
10
|
+
date_time = Mail::Parsers::DateTimeParser.parse(string)
|
9
11
|
@date_string = date_time.date_string
|
10
12
|
@time_string = date_time.time_string
|
11
13
|
end
|
12
|
-
|
13
|
-
def date_string
|
14
|
-
@date_string
|
15
|
-
end
|
16
|
-
|
17
|
-
def time_string
|
18
|
-
@time_string
|
19
|
-
end
|
20
|
-
|
21
14
|
end
|
22
15
|
end
|
@@ -1,39 +1,39 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
require 'mail/parsers/envelope_from_parser'
|
4
|
+
require 'date'
|
5
|
+
|
2
6
|
module Mail
|
3
|
-
class EnvelopeFromElement
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
@
|
9
|
-
@
|
10
|
-
@date_time = ::DateTime.parse(@envelope_from.ctime_date)
|
11
|
-
end
|
12
|
-
|
13
|
-
def date_time
|
14
|
-
@date_time
|
15
|
-
end
|
16
|
-
|
17
|
-
def address
|
18
|
-
@address
|
7
|
+
class EnvelopeFromElement #:nodoc:
|
8
|
+
attr_reader :date_time, :address
|
9
|
+
|
10
|
+
def initialize(string)
|
11
|
+
envelope_from = Mail::Parsers::EnvelopeFromParser.parse(string)
|
12
|
+
@address = envelope_from.address
|
13
|
+
@date_time = ::DateTime.parse(envelope_from.ctime_date) if envelope_from.ctime_date
|
19
14
|
end
|
20
|
-
|
15
|
+
|
21
16
|
# RFC 4155:
|
22
17
|
# a timestamp indicating the UTC date and time when the message
|
23
18
|
# was originally received, conformant with the syntax of the
|
24
19
|
# traditional UNIX 'ctime' output sans timezone (note that the
|
25
20
|
# use of UTC precludes the need for a timezone indicator);
|
26
21
|
def formatted_date_time
|
27
|
-
if
|
28
|
-
|
29
|
-
|
30
|
-
|
22
|
+
if date_time
|
23
|
+
if date_time.respond_to?(:ctime)
|
24
|
+
date_time.ctime
|
25
|
+
else
|
26
|
+
date_time.strftime '%a %b %e %T %Y'
|
27
|
+
end
|
31
28
|
end
|
32
29
|
end
|
33
30
|
|
34
31
|
def to_s
|
35
|
-
|
32
|
+
if date_time
|
33
|
+
"#{address} #{formatted_date_time}"
|
34
|
+
else
|
35
|
+
address
|
36
|
+
end
|
36
37
|
end
|
37
|
-
|
38
38
|
end
|
39
39
|
end
|