mail 2.6.5 → 2.7.0.rc1

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