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.
Files changed (188) hide show
  1. checksums.yaml +5 -5
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +150 -107
  4. data/lib/mail/attachments_list.rb +13 -10
  5. data/lib/mail/body.rb +104 -90
  6. data/lib/mail/check_delivery_params.rb +55 -10
  7. data/lib/mail/configuration.rb +3 -0
  8. data/lib/mail/constants.rb +79 -0
  9. data/lib/mail/elements/address.rb +96 -108
  10. data/lib/mail/elements/address_list.rb +13 -30
  11. data/lib/mail/elements/content_disposition_element.rb +10 -16
  12. data/lib/mail/elements/content_location_element.rb +9 -13
  13. data/lib/mail/elements/content_transfer_encoding_element.rb +7 -11
  14. data/lib/mail/elements/content_type_element.rb +17 -23
  15. data/lib/mail/elements/date_time_element.rb +8 -15
  16. data/lib/mail/elements/envelope_from_element.rb +23 -23
  17. data/lib/mail/elements/message_ids_element.rb +22 -15
  18. data/lib/mail/elements/mime_version_element.rb +8 -15
  19. data/lib/mail/elements/phrase_list.rb +13 -10
  20. data/lib/mail/elements/received_element.rb +28 -19
  21. data/lib/mail/elements.rb +1 -0
  22. data/lib/mail/encodings/7bit.rb +10 -14
  23. data/lib/mail/encodings/8bit.rb +5 -18
  24. data/lib/mail/encodings/base64.rb +15 -10
  25. data/lib/mail/encodings/binary.rb +4 -22
  26. data/lib/mail/encodings/identity.rb +24 -0
  27. data/lib/mail/encodings/quoted_printable.rb +13 -7
  28. data/lib/mail/encodings/transfer_encoding.rb +47 -28
  29. data/lib/mail/encodings/unix_to_unix.rb +20 -0
  30. data/lib/mail/encodings.rb +102 -92
  31. data/lib/mail/envelope.rb +12 -14
  32. data/lib/mail/field.rb +121 -85
  33. data/lib/mail/field_list.rb +62 -8
  34. data/lib/mail/fields/bcc_field.rb +42 -48
  35. data/lib/mail/fields/cc_field.rb +29 -50
  36. data/lib/mail/fields/comments_field.rb +28 -37
  37. data/lib/mail/fields/common_address_field.rb +170 -0
  38. data/lib/mail/fields/common_date_field.rb +58 -0
  39. data/lib/mail/fields/common_field.rb +77 -0
  40. data/lib/mail/fields/common_message_id_field.rb +42 -0
  41. data/lib/mail/fields/content_description_field.rb +8 -14
  42. data/lib/mail/fields/content_disposition_field.rb +20 -44
  43. data/lib/mail/fields/content_id_field.rb +25 -51
  44. data/lib/mail/fields/content_location_field.rb +12 -25
  45. data/lib/mail/fields/content_transfer_encoding_field.rb +32 -31
  46. data/lib/mail/fields/content_type_field.rb +51 -80
  47. data/lib/mail/fields/date_field.rb +24 -52
  48. data/lib/mail/fields/from_field.rb +29 -50
  49. data/lib/mail/fields/in_reply_to_field.rb +39 -49
  50. data/lib/mail/fields/keywords_field.rb +19 -32
  51. data/lib/mail/fields/message_id_field.rb +26 -71
  52. data/lib/mail/fields/mime_version_field.rb +20 -30
  53. data/lib/mail/fields/named_structured_field.rb +11 -0
  54. data/lib/mail/fields/named_unstructured_field.rb +11 -0
  55. data/lib/mail/fields/optional_field.rb +10 -7
  56. data/lib/mail/fields/{common/parameter_hash.rb → parameter_hash.rb} +16 -13
  57. data/lib/mail/fields/received_field.rb +44 -57
  58. data/lib/mail/fields/references_field.rb +36 -49
  59. data/lib/mail/fields/reply_to_field.rb +29 -50
  60. data/lib/mail/fields/resent_bcc_field.rb +29 -50
  61. data/lib/mail/fields/resent_cc_field.rb +29 -50
  62. data/lib/mail/fields/resent_date_field.rb +6 -30
  63. data/lib/mail/fields/resent_from_field.rb +29 -50
  64. data/lib/mail/fields/resent_message_id_field.rb +6 -29
  65. data/lib/mail/fields/resent_sender_field.rb +28 -57
  66. data/lib/mail/fields/resent_to_field.rb +29 -50
  67. data/lib/mail/fields/return_path_field.rb +51 -55
  68. data/lib/mail/fields/sender_field.rb +35 -56
  69. data/lib/mail/fields/structured_field.rb +4 -30
  70. data/lib/mail/fields/subject_field.rb +10 -11
  71. data/lib/mail/fields/to_field.rb +29 -50
  72. data/lib/mail/fields/unstructured_field.rb +36 -50
  73. data/lib/mail/fields.rb +1 -0
  74. data/lib/mail/header.rb +73 -110
  75. data/lib/mail/indifferent_hash.rb +1 -0
  76. data/lib/mail/mail.rb +6 -11
  77. data/lib/mail/matchers/attachment_matchers.rb +44 -0
  78. data/lib/mail/matchers/has_sent_mail.rb +53 -9
  79. data/lib/mail/message.rb +132 -136
  80. data/lib/mail/multibyte/chars.rb +24 -180
  81. data/lib/mail/multibyte/unicode.rb +31 -26
  82. data/lib/mail/multibyte/utils.rb +27 -43
  83. data/lib/mail/multibyte.rb +56 -16
  84. data/lib/mail/network/delivery_methods/exim.rb +9 -11
  85. data/lib/mail/network/delivery_methods/file_delivery.rb +14 -16
  86. data/lib/mail/network/delivery_methods/logger_delivery.rb +34 -0
  87. data/lib/mail/network/delivery_methods/sendmail.rb +68 -24
  88. data/lib/mail/network/delivery_methods/smtp.rb +77 -54
  89. data/lib/mail/network/delivery_methods/smtp_connection.rb +5 -9
  90. data/lib/mail/network/delivery_methods/test_mailer.rb +9 -9
  91. data/lib/mail/network/retriever_methods/base.rb +9 -8
  92. data/lib/mail/network/retriever_methods/imap.rb +21 -7
  93. data/lib/mail/network/retriever_methods/pop3.rb +6 -3
  94. data/lib/mail/network/retriever_methods/test_retriever.rb +4 -2
  95. data/lib/mail/network.rb +2 -0
  96. data/lib/mail/parser_tools.rb +15 -0
  97. data/lib/mail/parsers/address_lists_parser.rb +33226 -116
  98. data/lib/mail/parsers/address_lists_parser.rl +179 -0
  99. data/lib/mail/parsers/content_disposition_parser.rb +883 -49
  100. data/lib/mail/parsers/content_disposition_parser.rl +89 -0
  101. data/lib/mail/parsers/content_location_parser.rb +810 -23
  102. data/lib/mail/parsers/content_location_parser.rl +78 -0
  103. data/lib/mail/parsers/content_transfer_encoding_parser.rb +510 -21
  104. data/lib/mail/parsers/content_transfer_encoding_parser.rl +71 -0
  105. data/lib/mail/parsers/content_type_parser.rb +1031 -47
  106. data/lib/mail/parsers/content_type_parser.rl +90 -0
  107. data/lib/mail/parsers/date_time_parser.rb +879 -24
  108. data/lib/mail/parsers/date_time_parser.rl +69 -0
  109. data/lib/mail/parsers/envelope_from_parser.rb +3670 -40
  110. data/lib/mail/parsers/envelope_from_parser.rl +89 -0
  111. data/lib/mail/parsers/message_ids_parser.rb +5147 -25
  112. data/lib/mail/parsers/message_ids_parser.rl +93 -0
  113. data/lib/mail/parsers/mime_version_parser.rb +498 -26
  114. data/lib/mail/parsers/mime_version_parser.rl +68 -0
  115. data/lib/mail/parsers/phrase_lists_parser.rb +872 -21
  116. data/lib/mail/parsers/phrase_lists_parser.rl +90 -0
  117. data/lib/mail/parsers/received_parser.rb +8777 -42
  118. data/lib/mail/parsers/received_parser.rl +91 -0
  119. data/lib/mail/parsers/rfc2045_content_transfer_encoding.rl +13 -0
  120. data/lib/mail/parsers/rfc2045_content_type.rl +25 -0
  121. data/lib/mail/parsers/rfc2045_mime.rl +16 -0
  122. data/lib/mail/parsers/rfc2183_content_disposition.rl +15 -0
  123. data/lib/mail/parsers/rfc3629_utf8.rl +19 -0
  124. data/lib/mail/parsers/rfc5234_abnf_core_rules.rl +22 -0
  125. data/lib/mail/parsers/rfc5322.rl +74 -0
  126. data/lib/mail/parsers/rfc5322_address.rl +72 -0
  127. data/lib/mail/parsers/{ragel/date_time.rl → rfc5322_date_time.rl} +8 -1
  128. data/lib/mail/parsers/rfc5322_lexical_tokens.rl +60 -0
  129. data/lib/mail/parsers.rb +12 -25
  130. data/lib/mail/part.rb +11 -12
  131. data/lib/mail/parts_list.rb +88 -14
  132. data/lib/mail/smtp_envelope.rb +57 -0
  133. data/lib/mail/utilities.rb +377 -40
  134. data/lib/mail/values/unicode_tables.dat +0 -0
  135. data/lib/mail/version.rb +8 -15
  136. data/lib/mail/yaml.rb +30 -0
  137. data/lib/mail.rb +9 -32
  138. metadata +138 -94
  139. data/CHANGELOG.rdoc +0 -752
  140. data/CONTRIBUTING.md +0 -60
  141. data/Dependencies.txt +0 -2
  142. data/Gemfile +0 -15
  143. data/Rakefile +0 -29
  144. data/TODO.rdoc +0 -9
  145. data/VERSION +0 -4
  146. data/lib/mail/core_extensions/nil.rb +0 -19
  147. data/lib/mail/core_extensions/object.rb +0 -13
  148. data/lib/mail/core_extensions/smtp.rb +0 -24
  149. data/lib/mail/core_extensions/string/access.rb +0 -145
  150. data/lib/mail/core_extensions/string/multibyte.rb +0 -78
  151. data/lib/mail/core_extensions/string.rb +0 -43
  152. data/lib/mail/fields/common/address_container.rb +0 -16
  153. data/lib/mail/fields/common/common_address.rb +0 -135
  154. data/lib/mail/fields/common/common_date.rb +0 -35
  155. data/lib/mail/fields/common/common_field.rb +0 -57
  156. data/lib/mail/fields/common/common_message_id.rb +0 -48
  157. data/lib/mail/multibyte/exceptions.rb +0 -8
  158. data/lib/mail/parsers/ragel/common.rl +0 -184
  159. data/lib/mail/parsers/ragel/parser_info.rb +0 -61
  160. data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb +0 -14864
  161. data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb.rl +0 -37
  162. data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb +0 -751
  163. data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb.rl +0 -37
  164. data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb +0 -614
  165. data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb.rl +0 -37
  166. data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb +0 -447
  167. data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb.rl +0 -37
  168. data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb +0 -825
  169. data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb.rl +0 -37
  170. data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb +0 -817
  171. data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb.rl +0 -37
  172. data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb +0 -2129
  173. data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb.rl +0 -37
  174. data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb +0 -1570
  175. data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb.rl +0 -37
  176. data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb +0 -440
  177. data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb.rl +0 -37
  178. data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb +0 -564
  179. data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb.rl +0 -37
  180. data/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl +0 -51
  181. data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb +0 -5144
  182. data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb.rl +0 -37
  183. data/lib/mail/parsers/ragel/ruby/parser.rb.rl.erb +0 -37
  184. data/lib/mail/parsers/ragel/ruby.rb +0 -39
  185. data/lib/mail/parsers/ragel.rb +0 -17
  186. data/lib/mail/patterns.rb +0 -37
  187. data/lib/mail/version_specific/ruby_1_8.rb +0 -119
  188. 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(display_name), "<#{address}>", format_comments].compact.join(" ")
53
- elsif address
54
- [address, format_comments].compact.join(" ")
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
- domain ? "#{local}@#{domain}" : local
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, @output_type) if @display_name
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 an empty array if there
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
- if get_comments.empty?
134
+ comments = get_comments
135
+ if comments.nil? || comments.none?
127
136
  nil
128
137
  else
129
- get_comments.map { |c| c.squeeze(" ") }
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
- @output_type = :encode
162
- format
170
+ format :encode
163
171
  end
164
-
172
+
165
173
  def decoded
166
- @output_type = :decode
167
- format
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 NilClass
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
- @raw_text = value
183
- if value.blank?
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 comments.blank?
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 comments.blank?
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
- if @data.domain
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
- else
236
- if comments
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
- if str.blank?
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(' ').squeeze(" ")
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 # :nodoc:
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
- @addresses_grouped_by_group = nil
22
- @address_list = Parsers::AddressListsParser.new.parse(string)
23
- end
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
- return @addresses_grouped_by_group if @addresses_grouped_by_group
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 # :nodoc:
4
-
5
- include Mail::Utilities
6
-
7
- def initialize( string )
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
- def disposition_type
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 # :nodoc:
4
-
5
- include Mail::Utilities
6
-
7
- def initialize( string )
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
- include Mail::Utilities
6
-
6
+ class ContentTransferEncodingElement #:nodoc:
7
+ attr_reader :encoding
8
+
7
9
  def initialize(string)
8
- content_transfer_encoding = Mail::Parsers::ContentTransferEncodingParser.new.parse(string)
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 # :nodoc:
4
-
5
- include Mail::Utilities
6
-
7
- def initialize( string )
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
- def main_type
15
- @main_type
16
- end
17
-
18
- def sub_type
19
- @sub_type
20
- end
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 # :nodoc:
4
-
5
- include Mail::Utilities
6
-
7
- def initialize( string )
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
- include Mail::Utilities
6
-
7
- def initialize( string )
8
- @envelope_from = Mail::Parsers::EnvelopeFromParser.new.parse(string)
9
- @address = @envelope_from.address
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 @date_time.respond_to?(:ctime)
28
- @date_time.ctime
29
- else
30
- @date_time.strftime '%a %b %e %T %Y'
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
- "#{@address} #{formatted_date_time}"
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