mail 2.6.6 → 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.
Files changed (160) hide show
  1. checksums.yaml +5 -5
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +74 -90
  4. data/lib/mail/attachments_list.rb +8 -4
  5. data/lib/mail/body.rb +50 -38
  6. data/lib/mail/check_delivery_params.rb +8 -6
  7. data/lib/mail/configuration.rb +2 -0
  8. data/lib/mail/constants.rb +1 -1
  9. data/lib/mail/core_extensions/smtp.rb +19 -16
  10. data/lib/mail/core_extensions/string.rb +0 -4
  11. data/lib/mail/elements/address.rb +28 -22
  12. data/lib/mail/elements/address_list.rb +10 -18
  13. data/lib/mail/elements/content_disposition_element.rb +8 -15
  14. data/lib/mail/elements/content_location_element.rb +5 -10
  15. data/lib/mail/elements/content_transfer_encoding_element.rb +5 -10
  16. data/lib/mail/elements/content_type_element.rb +8 -19
  17. data/lib/mail/elements/date_time_element.rb +6 -14
  18. data/lib/mail/elements/envelope_from_element.rb +14 -21
  19. data/lib/mail/elements/message_ids_element.rb +8 -12
  20. data/lib/mail/elements/mime_version_element.rb +6 -14
  21. data/lib/mail/elements/phrase_list.rb +6 -9
  22. data/lib/mail/elements/received_element.rb +9 -15
  23. data/lib/mail/encodings/7bit.rb +5 -15
  24. data/lib/mail/encodings/8bit.rb +2 -21
  25. data/lib/mail/encodings/base64.rb +11 -12
  26. data/lib/mail/encodings/binary.rb +3 -22
  27. data/lib/mail/encodings/identity.rb +24 -0
  28. data/lib/mail/encodings/quoted_printable.rb +6 -6
  29. data/lib/mail/encodings/transfer_encoding.rb +38 -29
  30. data/lib/mail/encodings/unix_to_unix.rb +3 -1
  31. data/lib/mail/encodings.rb +99 -43
  32. data/lib/mail/envelope.rb +1 -1
  33. data/lib/mail/field.rb +96 -59
  34. data/lib/mail/fields/bcc_field.rb +2 -2
  35. data/lib/mail/fields/cc_field.rb +1 -1
  36. data/lib/mail/fields/comments_field.rb +1 -1
  37. data/lib/mail/fields/common/common_address.rb +32 -7
  38. data/lib/mail/fields/common/common_field.rb +1 -10
  39. data/lib/mail/fields/common/parameter_hash.rb +1 -1
  40. data/lib/mail/fields/content_description_field.rb +1 -1
  41. data/lib/mail/fields/content_disposition_field.rb +3 -3
  42. data/lib/mail/fields/content_id_field.rb +2 -2
  43. data/lib/mail/fields/content_location_field.rb +1 -1
  44. data/lib/mail/fields/content_transfer_encoding_field.rb +1 -1
  45. data/lib/mail/fields/content_type_field.rb +4 -9
  46. data/lib/mail/fields/date_field.rb +2 -3
  47. data/lib/mail/fields/from_field.rb +1 -1
  48. data/lib/mail/fields/in_reply_to_field.rb +1 -1
  49. data/lib/mail/fields/keywords_field.rb +1 -1
  50. data/lib/mail/fields/message_id_field.rb +1 -1
  51. data/lib/mail/fields/mime_version_field.rb +1 -1
  52. data/lib/mail/fields/optional_field.rb +4 -1
  53. data/lib/mail/fields/received_field.rb +1 -1
  54. data/lib/mail/fields/references_field.rb +1 -1
  55. data/lib/mail/fields/reply_to_field.rb +1 -1
  56. data/lib/mail/fields/resent_bcc_field.rb +1 -1
  57. data/lib/mail/fields/resent_cc_field.rb +1 -1
  58. data/lib/mail/fields/resent_date_field.rb +0 -1
  59. data/lib/mail/fields/resent_from_field.rb +1 -1
  60. data/lib/mail/fields/resent_message_id_field.rb +1 -1
  61. data/lib/mail/fields/resent_sender_field.rb +1 -1
  62. data/lib/mail/fields/resent_to_field.rb +1 -1
  63. data/lib/mail/fields/return_path_field.rb +1 -1
  64. data/lib/mail/fields/sender_field.rb +1 -1
  65. data/lib/mail/fields/subject_field.rb +1 -1
  66. data/lib/mail/fields/to_field.rb +1 -1
  67. data/lib/mail/fields/unstructured_field.rb +21 -4
  68. data/lib/mail/header.rb +10 -8
  69. data/lib/mail/mail.rb +2 -10
  70. data/lib/mail/matchers/has_sent_mail.rb +21 -1
  71. data/lib/mail/message.rb +78 -68
  72. data/lib/mail/multibyte/chars.rb +29 -28
  73. data/lib/mail/multibyte/unicode.rb +10 -10
  74. data/lib/mail/multibyte.rb +64 -15
  75. data/lib/mail/network/delivery_methods/logger_delivery.rb +37 -0
  76. data/lib/mail/network/delivery_methods/sendmail.rb +8 -5
  77. data/lib/mail/network/delivery_methods/smtp.rb +58 -49
  78. data/lib/mail/network/delivery_methods/smtp_connection.rb +9 -1
  79. data/lib/mail/network/retriever_methods/imap.rb +18 -5
  80. data/lib/mail/network/retriever_methods/pop3.rb +3 -1
  81. data/lib/mail/network.rb +1 -0
  82. data/lib/mail/parser_tools.rb +15 -0
  83. data/lib/mail/parsers/address_lists_parser.rb +33207 -104
  84. data/lib/mail/parsers/address_lists_parser.rl +172 -0
  85. data/lib/mail/parsers/content_disposition_parser.rb +876 -49
  86. data/lib/mail/parsers/content_disposition_parser.rl +82 -0
  87. data/lib/mail/parsers/content_location_parser.rb +803 -23
  88. data/lib/mail/parsers/content_location_parser.rl +71 -0
  89. data/lib/mail/parsers/content_transfer_encoding_parser.rb +501 -19
  90. data/lib/mail/parsers/content_transfer_encoding_parser.rl +64 -0
  91. data/lib/mail/parsers/content_type_parser.rb +1023 -48
  92. data/lib/mail/parsers/content_type_parser.rl +83 -0
  93. data/lib/mail/parsers/date_time_parser.rb +870 -24
  94. data/lib/mail/parsers/date_time_parser.rl +62 -0
  95. data/lib/mail/parsers/envelope_from_parser.rb +3569 -34
  96. data/lib/mail/parsers/envelope_from_parser.rl +82 -0
  97. data/lib/mail/parsers/message_ids_parser.rb +2839 -25
  98. data/lib/mail/parsers/message_ids_parser.rl +82 -0
  99. data/lib/mail/parsers/mime_version_parser.rb +491 -26
  100. data/lib/mail/parsers/mime_version_parser.rl +61 -0
  101. data/lib/mail/parsers/phrase_lists_parser.rb +860 -18
  102. data/lib/mail/parsers/phrase_lists_parser.rl +83 -0
  103. data/lib/mail/parsers/received_parser.rb +8764 -37
  104. data/lib/mail/parsers/received_parser.rl +84 -0
  105. data/lib/mail/parsers/rfc2045_content_transfer_encoding.rl +13 -0
  106. data/lib/mail/parsers/rfc2045_content_type.rl +25 -0
  107. data/lib/mail/parsers/rfc2045_mime.rl +16 -0
  108. data/lib/mail/parsers/rfc2183_content_disposition.rl +15 -0
  109. data/lib/mail/parsers/rfc3629_utf8.rl +19 -0
  110. data/lib/mail/parsers/rfc5234_abnf_core_rules.rl +22 -0
  111. data/lib/mail/parsers/rfc5322.rl +59 -0
  112. data/lib/mail/parsers/rfc5322_address.rl +72 -0
  113. data/lib/mail/parsers/{ragel/date_time.rl → rfc5322_date_time.rl} +8 -1
  114. data/lib/mail/parsers/rfc5322_lexical_tokens.rl +60 -0
  115. data/lib/mail/parsers.rb +16 -24
  116. data/lib/mail/part.rb +3 -3
  117. data/lib/mail/parts_list.rb +5 -6
  118. data/lib/mail/utilities.rb +59 -28
  119. data/lib/mail/version.rb +2 -2
  120. data/lib/mail/version_specific/ruby_1_8.rb +40 -3
  121. data/lib/mail/version_specific/ruby_1_9.rb +61 -9
  122. data/lib/mail.rb +3 -16
  123. metadata +44 -53
  124. data/CHANGELOG.rdoc +0 -803
  125. data/CONTRIBUTING.md +0 -60
  126. data/Dependencies.txt +0 -2
  127. data/Gemfile +0 -14
  128. data/Rakefile +0 -29
  129. data/TODO.rdoc +0 -9
  130. data/lib/mail/core_extensions/string/access.rb +0 -146
  131. data/lib/mail/core_extensions/string/multibyte.rb +0 -79
  132. data/lib/mail/multibyte/exceptions.rb +0 -9
  133. data/lib/mail/parsers/ragel/common.rl +0 -185
  134. data/lib/mail/parsers/ragel/parser_info.rb +0 -61
  135. data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb +0 -14864
  136. data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb.rl +0 -37
  137. data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb +0 -751
  138. data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb.rl +0 -37
  139. data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb +0 -614
  140. data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb.rl +0 -37
  141. data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb +0 -447
  142. data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb.rl +0 -37
  143. data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb +0 -825
  144. data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb.rl +0 -37
  145. data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb +0 -817
  146. data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb.rl +0 -37
  147. data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb +0 -2149
  148. data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb.rl +0 -37
  149. data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb +0 -1570
  150. data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb.rl +0 -37
  151. data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb +0 -440
  152. data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb.rl +0 -37
  153. data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb +0 -564
  154. data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb.rl +0 -37
  155. data/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl +0 -51
  156. data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb +0 -5144
  157. data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb.rl +0 -37
  158. data/lib/mail/parsers/ragel/ruby/parser.rb.rl.erb +0 -37
  159. data/lib/mail/parsers/ragel/ruby.rb +0 -40
  160. data/lib/mail/parsers/ragel.rb +0 -18
@@ -0,0 +1,172 @@
1
+ # frozen_string_literal: true
2
+ require 'mail/utilities'
3
+ require 'mail/parser_tools'
4
+
5
+ %%{
6
+ machine address_lists;
7
+ alphtype int;
8
+
9
+ # Phrase
10
+ action phrase_s { phrase_s = p }
11
+ action phrase_e { phrase_e = p-1 }
12
+
13
+ # Quoted String.
14
+ action qstr_s { qstr_s = p }
15
+ action qstr_e { qstr = chars(data, qstr_s, p-1) }
16
+
17
+ # Comment
18
+ action comment_s { comment_s = p unless comment_s }
19
+ action comment_e {
20
+ if address
21
+ address.comments << chars(data, comment_s, p-2)
22
+ end
23
+ comment_s = nil
24
+ }
25
+
26
+ # Group Name
27
+ action group_name_s { group_name_s = p }
28
+ action group_name_e {
29
+ if qstr
30
+ group = qstr
31
+ qstr = nil
32
+ else
33
+ group = chars(data, group_name_s, p-1)
34
+ group_name_s = nil
35
+ end
36
+ address_list.group_names << group
37
+ group_name = group
38
+
39
+ # Start next address
40
+ address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
41
+ address_s = p
42
+ address.group = group_name
43
+ }
44
+
45
+ # Address
46
+ action address_s { address_s = p }
47
+
48
+ # Ignore address end events without a start event.
49
+ action address_e {
50
+ if address_s
51
+ if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
52
+ if address.domain
53
+ address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
54
+ else
55
+ address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
56
+ end
57
+ end
58
+ address.raw = chars(data, address_s, p-1)
59
+ address_list.addresses << address if address
60
+
61
+ # Start next address
62
+ address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
63
+ address.group = group_name
64
+ address_s = nil
65
+ end
66
+ }
67
+
68
+ # Don't set the display name until the address has actually started. This
69
+ # allows us to choose quoted_s version if it exists and always use the
70
+ # 'full' phrase version.
71
+ action angle_addr_s {
72
+ if qstr
73
+ address.display_name = Mail::Utilities.unescape(qstr)
74
+ qstr = nil
75
+ elsif phrase_e
76
+ address.display_name = chars(data, phrase_s, phrase_e).strip
77
+ phrase_e = phrase_s = nil
78
+ end
79
+ }
80
+
81
+ # Domain
82
+ action domain_s { domain_s = p }
83
+ action domain_e {
84
+ address.domain = chars(data, domain_s, p-1).rstrip if address
85
+ }
86
+
87
+ # Local
88
+ action local_dot_atom_s { local_dot_atom_s = p }
89
+ action local_dot_atom_e { local_dot_atom_e = p-1 }
90
+ action local_dot_atom_pre_comment_e { local_dot_atom_pre_comment_e = p-1 }
91
+ action local_quoted_string_e { address.local = '"' + qstr + '"' if address }
92
+
93
+ # obs_domain_list
94
+ action obs_domain_list_s { obs_domain_list_s = p }
95
+ action obs_domain_list_e { address.obs_domain_list = chars(data, obs_domain_list_s, p-1) }
96
+
97
+ # Junk actions
98
+ action addr_spec { }
99
+ action ctime_date_e { }
100
+ action ctime_date_s { }
101
+ action date_e { }
102
+ action date_s { }
103
+ action disp_type_e { }
104
+ action disp_type_s { }
105
+ action encoding_e { }
106
+ action encoding_s { }
107
+ action main_type_e { }
108
+ action main_type_s { }
109
+ action major_digits_e { }
110
+ action major_digits_s { }
111
+ action minor_digits_e { }
112
+ action minor_digits_s { }
113
+ action msg_id_e { }
114
+ action msg_id_s { }
115
+ action param_attr_e { }
116
+ action param_attr_s { }
117
+ action param_val_e { }
118
+ action param_val_s { }
119
+ action received_tokens_e { }
120
+ action received_tokens_s { }
121
+ action sub_type_e { }
122
+ action sub_type_s { }
123
+ action time_e { }
124
+ action time_s { }
125
+ action token_string_e { }
126
+ action token_string_s { }
127
+
128
+ include rfc5322 "rfc5322.rl";
129
+ main := address_lists;
130
+ }%%
131
+
132
+ module Mail::Parsers
133
+ module AddressListsParser
134
+ extend Mail::ParserTools
135
+
136
+ AddressListStruct = Struct.new(:addresses, :group_names, :error)
137
+ AddressStruct = Struct.new(:raw, :domain, :comments, :local,
138
+ :obs_domain_list, :display_name, :group, :error)
139
+
140
+ %%write data noprefix;
141
+
142
+ def self.parse(data)
143
+ data = data.dup.force_encoding(Encoding::ASCII_8BIT) if data.respond_to?(:force_encoding)
144
+
145
+ address_list = AddressListStruct.new([], [])
146
+ return address_list if Mail::Utilities.blank?(data)
147
+
148
+ phrase_s = phrase_e = qstr_s = qstr = comment_s = nil
149
+ group_name_s = domain_s = group_name = nil
150
+ local_dot_atom_s = local_dot_atom_e = nil
151
+ local_dot_atom_pre_comment_e = nil
152
+ obs_domain_list_s = nil
153
+
154
+ address_s = 0
155
+ address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
156
+
157
+ # 5.1 Variables Used by Ragel
158
+ p = 0
159
+ eof = pe = data.length
160
+ stack = []
161
+
162
+ %%write init;
163
+ %%write exec;
164
+
165
+ if p != eof || cs < %%{ write first_final; }%%
166
+ raise Mail::Field::IncompleteParseError.new(Mail::AddressList, data, p)
167
+ end
168
+
169
+ address_list
170
+ end
171
+ end
172
+ end