mail 2.7.1 → 2.8.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +45 -28
- data/lib/mail/attachments_list.rb +2 -5
- data/lib/mail/body.rb +24 -47
- data/lib/mail/constants.rb +27 -5
- data/lib/mail/elements/address.rb +27 -27
- data/lib/mail/elements/address_list.rb +1 -1
- data/lib/mail/elements/content_disposition_element.rb +1 -1
- data/lib/mail/elements/content_location_element.rb +1 -1
- data/lib/mail/elements/content_transfer_encoding_element.rb +1 -1
- data/lib/mail/elements/content_type_element.rb +8 -4
- data/lib/mail/elements/date_time_element.rb +1 -1
- data/lib/mail/elements/envelope_from_element.rb +13 -7
- data/lib/mail/elements/message_ids_element.rb +14 -5
- data/lib/mail/elements/mime_version_element.rb +1 -1
- data/lib/mail/elements/phrase_list.rb +7 -2
- data/lib/mail/elements/received_element.rb +20 -6
- data/lib/mail/encodings/7bit.rb +5 -0
- data/lib/mail/encodings/base64.rb +2 -2
- data/lib/mail/encodings/quoted_printable.rb +2 -2
- data/lib/mail/encodings.rb +30 -59
- data/lib/mail/envelope.rb +11 -14
- data/lib/mail/field.rb +37 -53
- data/lib/mail/field_list.rb +60 -7
- data/lib/mail/fields/bcc_field.rb +34 -52
- data/lib/mail/fields/cc_field.rb +28 -49
- data/lib/mail/fields/comments_field.rb +27 -37
- data/lib/mail/fields/common_address_field.rb +170 -0
- data/lib/mail/fields/common_date_field.rb +58 -0
- data/lib/mail/fields/common_field.rb +77 -0
- data/lib/mail/fields/common_message_id_field.rb +42 -0
- data/lib/mail/fields/content_description_field.rb +7 -14
- data/lib/mail/fields/content_disposition_field.rb +13 -38
- data/lib/mail/fields/content_id_field.rb +24 -51
- data/lib/mail/fields/content_location_field.rb +11 -25
- data/lib/mail/fields/content_transfer_encoding_field.rb +31 -31
- data/lib/mail/fields/content_type_field.rb +46 -71
- data/lib/mail/fields/date_field.rb +23 -51
- data/lib/mail/fields/from_field.rb +28 -49
- data/lib/mail/fields/in_reply_to_field.rb +38 -49
- data/lib/mail/fields/keywords_field.rb +18 -31
- data/lib/mail/fields/message_id_field.rb +25 -71
- data/lib/mail/fields/mime_version_field.rb +19 -30
- data/lib/mail/fields/named_structured_field.rb +11 -0
- data/lib/mail/fields/named_unstructured_field.rb +11 -0
- data/lib/mail/fields/optional_field.rb +5 -6
- data/lib/mail/fields/{common/parameter_hash.rb → parameter_hash.rb} +12 -10
- data/lib/mail/fields/received_field.rb +43 -57
- data/lib/mail/fields/references_field.rb +35 -49
- data/lib/mail/fields/reply_to_field.rb +28 -49
- data/lib/mail/fields/resent_bcc_field.rb +28 -49
- data/lib/mail/fields/resent_cc_field.rb +28 -49
- data/lib/mail/fields/resent_date_field.rb +5 -29
- data/lib/mail/fields/resent_from_field.rb +28 -49
- data/lib/mail/fields/resent_message_id_field.rb +5 -29
- data/lib/mail/fields/resent_sender_field.rb +27 -56
- data/lib/mail/fields/resent_to_field.rb +28 -49
- data/lib/mail/fields/return_path_field.rb +50 -54
- data/lib/mail/fields/sender_field.rb +34 -55
- data/lib/mail/fields/structured_field.rb +3 -30
- data/lib/mail/fields/subject_field.rb +9 -11
- data/lib/mail/fields/to_field.rb +28 -49
- data/lib/mail/fields/unstructured_field.rb +16 -48
- data/lib/mail/header.rb +69 -110
- data/lib/mail/matchers/attachment_matchers.rb +15 -0
- data/lib/mail/message.rb +46 -64
- data/lib/mail/multibyte/chars.rb +8 -166
- data/lib/mail/multibyte/utils.rb +26 -43
- data/lib/mail/multibyte.rb +1 -11
- data/lib/mail/network/delivery_methods/exim.rb +5 -4
- data/lib/mail/network/delivery_methods/file_delivery.rb +11 -10
- data/lib/mail/network/delivery_methods/logger_delivery.rb +2 -5
- data/lib/mail/network/delivery_methods/sendmail.rb +27 -35
- data/lib/mail/network/delivery_methods/smtp.rb +3 -3
- data/lib/mail/network/delivery_methods/smtp_connection.rb +3 -12
- data/lib/mail/network/delivery_methods/test_mailer.rb +4 -2
- data/lib/mail/network/retriever_methods/base.rb +8 -8
- data/lib/mail/network/retriever_methods/imap.rb +2 -2
- data/lib/mail/network/retriever_methods/pop3.rb +2 -2
- data/lib/mail/network/retriever_methods/test_retriever.rb +2 -1
- data/lib/mail/parsers/address_lists_parser.rb +33070 -33064
- data/lib/mail/parsers/address_lists_parser.rl +7 -0
- data/lib/mail/parsers/content_disposition_parser.rb +833 -827
- data/lib/mail/parsers/content_disposition_parser.rl +7 -0
- data/lib/mail/parsers/content_location_parser.rb +770 -764
- data/lib/mail/parsers/content_location_parser.rl +7 -0
- data/lib/mail/parsers/content_transfer_encoding_parser.rb +474 -468
- data/lib/mail/parsers/content_transfer_encoding_parser.rl +7 -0
- data/lib/mail/parsers/content_type_parser.rb +971 -965
- data/lib/mail/parsers/content_type_parser.rl +7 -0
- data/lib/mail/parsers/date_time_parser.rb +838 -832
- data/lib/mail/parsers/date_time_parser.rl +7 -0
- data/lib/mail/parsers/envelope_from_parser.rb +3623 -3529
- data/lib/mail/parsers/envelope_from_parser.rl +7 -0
- data/lib/mail/parsers/message_ids_parser.rb +5107 -2800
- data/lib/mail/parsers/message_ids_parser.rl +12 -1
- data/lib/mail/parsers/mime_version_parser.rb +463 -457
- data/lib/mail/parsers/mime_version_parser.rl +7 -0
- data/lib/mail/parsers/phrase_lists_parser.rb +836 -830
- data/lib/mail/parsers/phrase_lists_parser.rl +8 -1
- data/lib/mail/parsers/received_parser.rb +8688 -8682
- data/lib/mail/parsers/received_parser.rl +7 -0
- data/lib/mail/parsers/rfc5322.rl +28 -13
- data/lib/mail/parsers.rb +11 -17
- data/lib/mail/part.rb +5 -9
- data/lib/mail/parts_list.rb +57 -0
- data/lib/mail/smtp_envelope.rb +57 -0
- data/lib/mail/utilities.rb +307 -69
- data/lib/mail/version.rb +3 -3
- data/lib/mail/yaml.rb +30 -0
- data/lib/mail.rb +0 -20
- metadata +74 -21
- data/lib/mail/check_delivery_params.rb +0 -60
- data/lib/mail/core_extensions/smtp.rb +0 -28
- data/lib/mail/core_extensions/string.rb +0 -17
- data/lib/mail/fields/common/address_container.rb +0 -17
- data/lib/mail/fields/common/common_address.rb +0 -161
- data/lib/mail/fields/common/common_date.rb +0 -36
- data/lib/mail/fields/common/common_field.rb +0 -52
- data/lib/mail/fields/common/common_message_id.rb +0 -49
- data/lib/mail/version_specific/ruby_1_8.rb +0 -163
- data/lib/mail/version_specific/ruby_1_9.rb +0 -278
@@ -1,9 +1,7 @@
|
|
1
|
-
require 'mail/
|
1
|
+
require 'mail/smtp_envelope'
|
2
2
|
|
3
3
|
module Mail
|
4
4
|
class LoggerDelivery
|
5
|
-
include Mail::CheckDeliveryParams
|
6
|
-
|
7
5
|
attr_reader :logger, :severity, :settings
|
8
6
|
|
9
7
|
def initialize(settings)
|
@@ -13,8 +11,7 @@ module Mail
|
|
13
11
|
end
|
14
12
|
|
15
13
|
def deliver!(mail)
|
16
|
-
Mail::
|
17
|
-
logger.log(severity) { mail.encoded }
|
14
|
+
logger.log(severity) { Mail::SmtpEnvelope.new(mail).message }
|
18
15
|
end
|
19
16
|
|
20
17
|
private
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
require 'mail/
|
2
|
+
require 'mail/smtp_envelope'
|
3
3
|
|
4
4
|
module Mail
|
5
5
|
# A delivery method implementation which sends via sendmail.
|
@@ -40,56 +40,48 @@ module Mail
|
|
40
40
|
class Sendmail
|
41
41
|
DEFAULTS = {
|
42
42
|
:location => '/usr/sbin/sendmail',
|
43
|
-
:arguments =>
|
43
|
+
:arguments => %w[ -i ]
|
44
44
|
}
|
45
45
|
|
46
46
|
attr_accessor :settings
|
47
47
|
|
48
|
+
class DeliveryError < StandardError
|
49
|
+
end
|
50
|
+
|
48
51
|
def initialize(values)
|
49
52
|
self.settings = self.class::DEFAULTS.merge(values)
|
53
|
+
raise ArgumentError, ":arguments expected to be an Array of individual string args" if settings[:arguments].is_a?(String)
|
54
|
+
end
|
55
|
+
|
56
|
+
def destinations_for(envelope)
|
57
|
+
envelope.to
|
50
58
|
end
|
51
59
|
|
52
60
|
def deliver!(mail)
|
53
|
-
|
61
|
+
envelope = Mail::SmtpEnvelope.new(mail)
|
54
62
|
|
55
|
-
|
56
|
-
|
63
|
+
command = [settings[:location]]
|
64
|
+
command.concat Array(settings[:arguments])
|
65
|
+
command.concat [ '-f', envelope.from ] if envelope.from
|
57
66
|
|
58
|
-
|
59
|
-
|
60
|
-
|
67
|
+
if destinations = destinations_for(envelope)
|
68
|
+
command.push '--'
|
69
|
+
command.concat destinations
|
70
|
+
end
|
61
71
|
|
62
|
-
|
63
|
-
|
64
|
-
io.puts ::Mail::Utilities.binary_unsafe_to_lf(encoded_message)
|
72
|
+
popen(command) do |io|
|
73
|
+
io.puts ::Mail::Utilities.binary_unsafe_to_lf(envelope.message)
|
65
74
|
io.flush
|
66
75
|
end
|
67
76
|
end
|
68
77
|
|
69
|
-
|
70
|
-
def
|
71
|
-
IO.popen
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
78
|
+
private
|
79
|
+
def popen(command, &block)
|
80
|
+
IO.popen(command, 'w+', :err => :out, &block).tap do
|
81
|
+
if $?.exitstatus != 0
|
82
|
+
raise DeliveryError, "Delivery failed with exitstatus #{$?.exitstatus}: #{command.inspect}"
|
83
|
+
end
|
84
|
+
end
|
76
85
|
end
|
77
|
-
end
|
78
|
-
|
79
|
-
# The following is an adaptation of ruby 1.9.2's shellwords.rb file,
|
80
|
-
# with the following modifications:
|
81
|
-
#
|
82
|
-
# - Wraps in double quotes
|
83
|
-
# - Allows '+' to accept email addresses with them
|
84
|
-
# - Allows '~' as it is not unescaped in double quotes
|
85
|
-
def self.shellquote(address)
|
86
|
-
# Process as a single byte sequence because not all shell
|
87
|
-
# implementations are multibyte aware.
|
88
|
-
#
|
89
|
-
# A LF cannot be escaped with a backslash because a backslash + LF
|
90
|
-
# combo is regarded as line continuation and simply ignored. Strip it.
|
91
|
-
escaped = address.gsub(/([^A-Za-z0-9_\s\+\-.,:\/@~])/n, "\\\\\\1").gsub("\n", '')
|
92
|
-
%("#{escaped}")
|
93
|
-
end
|
94
86
|
end
|
95
87
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
require 'mail/
|
2
|
+
require 'mail/smtp_envelope'
|
3
3
|
|
4
4
|
module Mail
|
5
5
|
# == Sending Email with SMTP
|
@@ -88,8 +88,8 @@ module Mail
|
|
88
88
|
:openssl_verify_mode => nil,
|
89
89
|
:ssl => nil,
|
90
90
|
:tls => nil,
|
91
|
-
:open_timeout =>
|
92
|
-
:read_timeout =>
|
91
|
+
:open_timeout => 5,
|
92
|
+
:read_timeout => 5
|
93
93
|
}
|
94
94
|
|
95
95
|
def initialize(values)
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
require 'mail/
|
2
|
+
require 'mail/smtp_envelope'
|
3
3
|
|
4
4
|
module Mail
|
5
5
|
# == Sending Email with SMTP
|
@@ -49,18 +49,9 @@ module Mail
|
|
49
49
|
# Send the message via SMTP.
|
50
50
|
# The from and to attributes are optional. If not set, they are retrieve from the Message.
|
51
51
|
def deliver!(mail)
|
52
|
-
|
53
|
-
|
54
|
-
response = smtp.sendmail(dot_stuff(message), smtp_from, smtp_to)
|
55
|
-
|
52
|
+
envelope = Mail::SmtpEnvelope.new(mail)
|
53
|
+
response = smtp.sendmail(envelope.message, envelope.from, envelope.to)
|
56
54
|
settings[:return_response] ? response : self
|
57
55
|
end
|
58
|
-
|
59
|
-
private
|
60
|
-
# This is Net::SMTP's job, but before Ruby 2.x it does not dot-stuff
|
61
|
-
# an unterminated last line: https://bugs.ruby-lang.org/issues/9627
|
62
|
-
def dot_stuff(message)
|
63
|
-
message.gsub(/(\r\n\.)(\r\n|$)/, '\1.\2')
|
64
|
-
end
|
65
56
|
end
|
66
57
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
require 'mail/
|
2
|
+
require 'mail/smtp_envelope'
|
3
3
|
|
4
4
|
module Mail
|
5
5
|
# The TestMailer is a bare bones mailer that does nothing. It is useful
|
@@ -35,7 +35,9 @@ module Mail
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def deliver!(mail)
|
38
|
-
|
38
|
+
# Create the envelope to validate it
|
39
|
+
Mail::SmtpEnvelope.new(mail)
|
40
|
+
|
39
41
|
Mail::TestMailer.deliveries << mail
|
40
42
|
end
|
41
43
|
end
|
@@ -11,8 +11,8 @@ module Mail
|
|
11
11
|
# count: number of emails to retrieve. The default value is 1.
|
12
12
|
# order: order of emails returned. Possible values are :asc or :desc. Default value is :asc.
|
13
13
|
#
|
14
|
-
def first(options =
|
15
|
-
options
|
14
|
+
def first(options = nil, &block)
|
15
|
+
options = options ? Hash[options] : {}
|
16
16
|
options[:what] = :first
|
17
17
|
options[:count] ||= 1
|
18
18
|
find(options, &block)
|
@@ -24,8 +24,8 @@ module Mail
|
|
24
24
|
# count: number of emails to retrieve. The default value is 1.
|
25
25
|
# order: order of emails returned. Possible values are :asc or :desc. Default value is :asc.
|
26
26
|
#
|
27
|
-
def last(options =
|
28
|
-
options
|
27
|
+
def last(options = nil, &block)
|
28
|
+
options = options ? Hash[options] : {}
|
29
29
|
options[:what] = :last
|
30
30
|
options[:count] ||= 1
|
31
31
|
find(options, &block)
|
@@ -36,8 +36,8 @@ module Mail
|
|
36
36
|
# Possible options:
|
37
37
|
# order: order of emails returned. Possible values are :asc or :desc. Default value is :asc.
|
38
38
|
#
|
39
|
-
def all(options =
|
40
|
-
options
|
39
|
+
def all(options = nil, &block)
|
40
|
+
options = options ? Hash[options] : {}
|
41
41
|
options[:count] = :all
|
42
42
|
find(options, &block)
|
43
43
|
end
|
@@ -53,8 +53,8 @@ module Mail
|
|
53
53
|
# delete_after_find: flag for whether to delete each retreived email after find. Default
|
54
54
|
# is true. Call #find if you would like this to default to false.
|
55
55
|
#
|
56
|
-
def find_and_delete(options =
|
57
|
-
options
|
56
|
+
def find_and_delete(options = nil, &block)
|
57
|
+
options = options ? Hash[options] : {}
|
58
58
|
options[:delete_after_find] ||= true
|
59
59
|
find(options, &block)
|
60
60
|
end
|
@@ -70,7 +70,7 @@ module Mail
|
|
70
70
|
# The default is 'ALL'
|
71
71
|
# search_charset: charset to pass to IMAP server search. Omitted by default. Example: 'UTF-8' or 'ASCII'.
|
72
72
|
#
|
73
|
-
def find(options=
|
73
|
+
def find(options=nil, &block)
|
74
74
|
options = validate_options(options)
|
75
75
|
|
76
76
|
start do |imap|
|
@@ -142,7 +142,7 @@ module Mail
|
|
142
142
|
|
143
143
|
# Set default options
|
144
144
|
def validate_options(options)
|
145
|
-
options
|
145
|
+
options = options ? Hash[options] : {}
|
146
146
|
options[:mailbox] ||= 'INBOX'
|
147
147
|
options[:count] ||= 10
|
148
148
|
options[:order] ||= :asc
|
@@ -57,7 +57,7 @@ module Mail
|
|
57
57
|
# delete_after_find: flag for whether to delete each retreived email after find. Default
|
58
58
|
# is false. Use #find_and_delete if you would like this to default to true.
|
59
59
|
#
|
60
|
-
def find(options =
|
60
|
+
def find(options = nil, &block)
|
61
61
|
options = validate_options(options)
|
62
62
|
|
63
63
|
start do |pop3|
|
@@ -113,7 +113,7 @@ module Mail
|
|
113
113
|
|
114
114
|
# Set default options
|
115
115
|
def validate_options(options)
|
116
|
-
options
|
116
|
+
options = options ? Hash[options] : {}
|
117
117
|
options[:count] ||= 10
|
118
118
|
options[:order] ||= :asc
|
119
119
|
options[:what] ||= :first
|