mail 2.7.0.rc1 → 2.7.0

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 (112) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +71 -98
  3. data/lib/mail/attachments_list.rb +5 -2
  4. data/lib/mail/body.rb +39 -33
  5. data/lib/mail/check_delivery_params.rb +8 -6
  6. data/lib/mail/configuration.rb +2 -0
  7. data/lib/mail/elements/address.rb +19 -18
  8. data/lib/mail/encodings/7bit.rb +5 -15
  9. data/lib/mail/encodings/8bit.rb +2 -21
  10. data/lib/mail/encodings/base64.rb +11 -12
  11. data/lib/mail/encodings/binary.rb +3 -22
  12. data/lib/mail/encodings/identity.rb +24 -0
  13. data/lib/mail/encodings/quoted_printable.rb +6 -6
  14. data/lib/mail/encodings/transfer_encoding.rb +38 -29
  15. data/lib/mail/encodings/unix_to_unix.rb +2 -1
  16. data/lib/mail/encodings.rb +89 -31
  17. data/lib/mail/envelope.rb +1 -1
  18. data/lib/mail/field.rb +93 -61
  19. data/lib/mail/fields/bcc_field.rb +2 -2
  20. data/lib/mail/fields/cc_field.rb +1 -1
  21. data/lib/mail/fields/comments_field.rb +1 -1
  22. data/lib/mail/fields/common/common_address.rb +32 -7
  23. data/lib/mail/fields/common/common_field.rb +1 -10
  24. data/lib/mail/fields/content_description_field.rb +1 -1
  25. data/lib/mail/fields/content_disposition_field.rb +3 -3
  26. data/lib/mail/fields/content_id_field.rb +2 -2
  27. data/lib/mail/fields/content_location_field.rb +1 -1
  28. data/lib/mail/fields/content_transfer_encoding_field.rb +1 -1
  29. data/lib/mail/fields/content_type_field.rb +1 -1
  30. data/lib/mail/fields/date_field.rb +2 -3
  31. data/lib/mail/fields/from_field.rb +1 -1
  32. data/lib/mail/fields/in_reply_to_field.rb +1 -1
  33. data/lib/mail/fields/keywords_field.rb +1 -1
  34. data/lib/mail/fields/message_id_field.rb +1 -1
  35. data/lib/mail/fields/mime_version_field.rb +1 -1
  36. data/lib/mail/fields/optional_field.rb +4 -1
  37. data/lib/mail/fields/received_field.rb +1 -1
  38. data/lib/mail/fields/references_field.rb +1 -1
  39. data/lib/mail/fields/reply_to_field.rb +1 -1
  40. data/lib/mail/fields/resent_bcc_field.rb +1 -1
  41. data/lib/mail/fields/resent_cc_field.rb +1 -1
  42. data/lib/mail/fields/resent_date_field.rb +0 -1
  43. data/lib/mail/fields/resent_from_field.rb +1 -1
  44. data/lib/mail/fields/resent_message_id_field.rb +1 -1
  45. data/lib/mail/fields/resent_sender_field.rb +1 -1
  46. data/lib/mail/fields/resent_to_field.rb +1 -1
  47. data/lib/mail/fields/return_path_field.rb +1 -1
  48. data/lib/mail/fields/sender_field.rb +1 -1
  49. data/lib/mail/fields/subject_field.rb +1 -1
  50. data/lib/mail/fields/to_field.rb +1 -1
  51. data/lib/mail/fields/unstructured_field.rb +19 -2
  52. data/lib/mail/header.rb +9 -8
  53. data/lib/mail/mail.rb +2 -10
  54. data/lib/mail/matchers/has_sent_mail.rb +21 -1
  55. data/lib/mail/message.rb +63 -50
  56. data/lib/mail/multibyte/chars.rb +2 -1
  57. data/lib/mail/multibyte.rb +14 -16
  58. data/lib/mail/network/delivery_methods/exim.rb +6 -10
  59. data/lib/mail/network/delivery_methods/logger_delivery.rb +37 -0
  60. data/lib/mail/network/delivery_methods/sendmail.rb +14 -7
  61. data/lib/mail/network/delivery_methods/smtp.rb +56 -55
  62. data/lib/mail/network/delivery_methods/smtp_connection.rb +9 -1
  63. data/lib/mail/network/retriever_methods/imap.rb +18 -5
  64. data/lib/mail/network/retriever_methods/pop3.rb +3 -1
  65. data/lib/mail/network.rb +1 -0
  66. data/lib/mail/parser_tools.rb +15 -0
  67. data/lib/mail/parsers/address_lists_parser.rb +30462 -12597
  68. data/lib/mail/parsers/address_lists_parser.rl +18 -12
  69. data/lib/mail/parsers/content_disposition_parser.rb +405 -215
  70. data/lib/mail/parsers/content_disposition_parser.rl +11 -5
  71. data/lib/mail/parsers/content_location_parser.rb +443 -208
  72. data/lib/mail/parsers/content_location_parser.rl +9 -3
  73. data/lib/mail/parsers/content_transfer_encoding_parser.rb +180 -80
  74. data/lib/mail/parsers/content_transfer_encoding_parser.rl +8 -2
  75. data/lib/mail/parsers/content_type_parser.rb +436 -245
  76. data/lib/mail/parsers/content_type_parser.rl +12 -6
  77. data/lib/mail/parsers/date_time_parser.rb +172 -72
  78. data/lib/mail/parsers/date_time_parser.rl +10 -4
  79. data/lib/mail/parsers/envelope_from_parser.rb +2833 -1320
  80. data/lib/mail/parsers/envelope_from_parser.rl +9 -3
  81. data/lib/mail/parsers/message_ids_parser.rb +2325 -976
  82. data/lib/mail/parsers/message_ids_parser.rl +9 -3
  83. data/lib/mail/parsers/mime_version_parser.rb +164 -64
  84. data/lib/mail/parsers/mime_version_parser.rl +9 -3
  85. data/lib/mail/parsers/phrase_lists_parser.rb +582 -237
  86. data/lib/mail/parsers/phrase_lists_parser.rl +9 -3
  87. data/lib/mail/parsers/received_parser.rb +7036 -3004
  88. data/lib/mail/parsers/received_parser.rl +11 -5
  89. data/lib/mail/parsers/rfc2045_content_transfer_encoding.rl +1 -0
  90. data/lib/mail/parsers/rfc2045_content_type.rl +1 -0
  91. data/lib/mail/parsers/rfc2045_mime.rl +1 -0
  92. data/lib/mail/parsers/rfc2183_content_disposition.rl +1 -0
  93. data/lib/mail/parsers/rfc3629_utf8.rl +19 -0
  94. data/lib/mail/parsers/rfc5234_abnf_core_rules.rl +7 -1
  95. data/lib/mail/parsers/rfc5322.rl +3 -1
  96. data/lib/mail/parsers/rfc5322_address.rl +3 -1
  97. data/lib/mail/parsers/rfc5322_date_time.rl +1 -0
  98. data/lib/mail/parsers/rfc5322_lexical_tokens.rl +9 -5
  99. data/lib/mail/part.rb +1 -1
  100. data/lib/mail/utilities.rb +44 -15
  101. data/lib/mail/version.rb +1 -1
  102. data/lib/mail/version_specific/ruby_1_8.rb +12 -1
  103. data/lib/mail/version_specific/ruby_1_9.rb +13 -1
  104. data/lib/mail.rb +1 -6
  105. metadata +9 -15
  106. data/CHANGELOG.rdoc +0 -822
  107. data/CONTRIBUTING.md +0 -60
  108. data/Dependencies.txt +0 -1
  109. data/Gemfile +0 -11
  110. data/Rakefile +0 -23
  111. data/TODO.rdoc +0 -9
  112. data/lib/mail/multibyte/exceptions.rb +0 -9
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
  require 'mail/utilities'
3
+ require 'mail/parser_tools'
3
4
 
4
5
  %%{
5
6
  machine address_lists;
7
+ alphtype int;
6
8
 
7
9
  # Phrase
8
10
  action phrase_s { phrase_s = p }
@@ -10,13 +12,13 @@ require 'mail/utilities'
10
12
 
11
13
  # Quoted String.
12
14
  action qstr_s { qstr_s = p }
13
- action qstr_e { qstr = data[qstr_s..(p-1)] }
15
+ action qstr_e { qstr = chars(data, qstr_s, p-1) }
14
16
 
15
17
  # Comment
16
18
  action comment_s { comment_s = p unless comment_s }
17
19
  action comment_e {
18
20
  if address
19
- address.comments << data[comment_s..(p-2)]
21
+ address.comments << chars(data, comment_s, p-2)
20
22
  end
21
23
  comment_s = nil
22
24
  }
@@ -28,7 +30,7 @@ require 'mail/utilities'
28
30
  group = qstr
29
31
  qstr = nil
30
32
  else
31
- group = data[group_name_s..(p-1)]
33
+ group = chars(data, group_name_s, p-1)
32
34
  group_name_s = nil
33
35
  end
34
36
  address_list.group_names << group
@@ -42,18 +44,18 @@ require 'mail/utilities'
42
44
 
43
45
  # Address
44
46
  action address_s { address_s = p }
47
+
48
+ # Ignore address end events without a start event.
45
49
  action address_e {
46
- # Ignore address end events if they don't have
47
- # a matching address start event.
48
50
  if address_s
49
51
  if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
50
52
  if address.domain
51
- address.local = data[local_dot_atom_s..local_dot_atom_e] if address
53
+ address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
52
54
  else
53
- address.local = data[local_dot_atom_s..local_dot_atom_pre_comment_e] if address
55
+ address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
54
56
  end
55
57
  end
56
- address.raw = data[address_s..(p-1)]
58
+ address.raw = chars(data, address_s, p-1)
57
59
  address_list.addresses << address if address
58
60
 
59
61
  # Start next address
@@ -71,7 +73,7 @@ require 'mail/utilities'
71
73
  address.display_name = Mail::Utilities.unescape(qstr)
72
74
  qstr = nil
73
75
  elsif phrase_e
74
- address.display_name = data[phrase_s..phrase_e].strip
76
+ address.display_name = chars(data, phrase_s, phrase_e).strip
75
77
  phrase_e = phrase_s = nil
76
78
  end
77
79
  }
@@ -79,7 +81,7 @@ require 'mail/utilities'
79
81
  # Domain
80
82
  action domain_s { domain_s = p }
81
83
  action domain_e {
82
- address.domain = data[domain_s..(p-1)].rstrip if address
84
+ address.domain = chars(data, domain_s, p-1).rstrip if address
83
85
  }
84
86
 
85
87
  # Local
@@ -90,7 +92,7 @@ require 'mail/utilities'
90
92
 
91
93
  # obs_domain_list
92
94
  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)] }
95
+ action obs_domain_list_e { address.obs_domain_list = chars(data, obs_domain_list_s, p-1) }
94
96
 
95
97
  # Junk actions
96
98
  action addr_spec { }
@@ -129,6 +131,8 @@ require 'mail/utilities'
129
131
 
130
132
  module Mail::Parsers
131
133
  module AddressListsParser
134
+ extend Mail::ParserTools
135
+
132
136
  AddressListStruct = Struct.new(:addresses, :group_names, :error)
133
137
  AddressStruct = Struct.new(:raw, :domain, :comments, :local,
134
138
  :obs_domain_list, :display_name, :group, :error)
@@ -136,6 +140,8 @@ module Mail::Parsers
136
140
  %%write data noprefix;
137
141
 
138
142
  def self.parse(data)
143
+ data = data.dup.force_encoding(Encoding::ASCII_8BIT) if data.respond_to?(:force_encoding)
144
+
139
145
  address_list = AddressListStruct.new([], [])
140
146
  return address_list if Mail::Utilities.blank?(data)
141
147
 
@@ -157,7 +163,7 @@ module Mail::Parsers
157
163
  %%write exec;
158
164
 
159
165
  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]}")
166
+ raise Mail::Field::IncompleteParseError.new(Mail::AddressList, data, p)
161
167
  end
162
168
 
163
169
  address_list