mail 2.6.6 → 2.7.1

Sign up to get free protection for your applications and to get access to all the features.
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