mail-portertech 2.6.2.edge
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.rdoc +753 -0
- data/CONTRIBUTING.md +60 -0
- data/Dependencies.txt +2 -0
- data/Gemfile +15 -0
- data/MIT-LICENSE +20 -0
- data/README.md +683 -0
- data/Rakefile +29 -0
- data/TODO.rdoc +9 -0
- data/lib/mail.rb +91 -0
- data/lib/mail/attachments_list.rb +104 -0
- data/lib/mail/body.rb +291 -0
- data/lib/mail/check_delivery_params.rb +20 -0
- data/lib/mail/configuration.rb +75 -0
- data/lib/mail/core_extensions/nil.rb +19 -0
- data/lib/mail/core_extensions/object.rb +13 -0
- data/lib/mail/core_extensions/smtp.rb +24 -0
- data/lib/mail/core_extensions/string.rb +43 -0
- data/lib/mail/core_extensions/string/access.rb +145 -0
- data/lib/mail/core_extensions/string/multibyte.rb +78 -0
- data/lib/mail/elements.rb +14 -0
- data/lib/mail/elements/address.rb +270 -0
- data/lib/mail/elements/address_list.rb +51 -0
- data/lib/mail/elements/content_disposition_element.rb +26 -0
- data/lib/mail/elements/content_location_element.rb +21 -0
- data/lib/mail/elements/content_transfer_encoding_element.rb +17 -0
- data/lib/mail/elements/content_type_element.rb +31 -0
- data/lib/mail/elements/date_time_element.rb +22 -0
- data/lib/mail/elements/envelope_from_element.rb +39 -0
- data/lib/mail/elements/message_ids_element.rb +24 -0
- data/lib/mail/elements/mime_version_element.rb +22 -0
- data/lib/mail/elements/phrase_list.rb +16 -0
- data/lib/mail/elements/received_element.rb +26 -0
- data/lib/mail/encodings.rb +304 -0
- data/lib/mail/encodings/7bit.rb +31 -0
- data/lib/mail/encodings/8bit.rb +31 -0
- data/lib/mail/encodings/base64.rb +33 -0
- data/lib/mail/encodings/binary.rb +31 -0
- data/lib/mail/encodings/quoted_printable.rb +39 -0
- data/lib/mail/encodings/transfer_encoding.rb +58 -0
- data/lib/mail/envelope.rb +30 -0
- data/lib/mail/field.rb +247 -0
- data/lib/mail/field_list.rb +33 -0
- data/lib/mail/fields.rb +35 -0
- data/lib/mail/fields/bcc_field.rb +56 -0
- data/lib/mail/fields/cc_field.rb +55 -0
- data/lib/mail/fields/comments_field.rb +41 -0
- data/lib/mail/fields/common/address_container.rb +16 -0
- data/lib/mail/fields/common/common_address.rb +135 -0
- data/lib/mail/fields/common/common_date.rb +35 -0
- data/lib/mail/fields/common/common_field.rb +57 -0
- data/lib/mail/fields/common/common_message_id.rb +48 -0
- data/lib/mail/fields/common/parameter_hash.rb +58 -0
- data/lib/mail/fields/content_description_field.rb +19 -0
- data/lib/mail/fields/content_disposition_field.rb +70 -0
- data/lib/mail/fields/content_id_field.rb +62 -0
- data/lib/mail/fields/content_location_field.rb +42 -0
- data/lib/mail/fields/content_transfer_encoding_field.rb +44 -0
- data/lib/mail/fields/content_type_field.rb +201 -0
- data/lib/mail/fields/date_field.rb +57 -0
- data/lib/mail/fields/from_field.rb +55 -0
- data/lib/mail/fields/in_reply_to_field.rb +56 -0
- data/lib/mail/fields/keywords_field.rb +44 -0
- data/lib/mail/fields/message_id_field.rb +82 -0
- data/lib/mail/fields/mime_version_field.rb +53 -0
- data/lib/mail/fields/optional_field.rb +13 -0
- data/lib/mail/fields/received_field.rb +75 -0
- data/lib/mail/fields/references_field.rb +56 -0
- data/lib/mail/fields/reply_to_field.rb +55 -0
- data/lib/mail/fields/resent_bcc_field.rb +55 -0
- data/lib/mail/fields/resent_cc_field.rb +55 -0
- data/lib/mail/fields/resent_date_field.rb +35 -0
- data/lib/mail/fields/resent_from_field.rb +55 -0
- data/lib/mail/fields/resent_message_id_field.rb +34 -0
- data/lib/mail/fields/resent_sender_field.rb +62 -0
- data/lib/mail/fields/resent_to_field.rb +55 -0
- data/lib/mail/fields/return_path_field.rb +65 -0
- data/lib/mail/fields/sender_field.rb +67 -0
- data/lib/mail/fields/structured_field.rb +51 -0
- data/lib/mail/fields/subject_field.rb +16 -0
- data/lib/mail/fields/to_field.rb +55 -0
- data/lib/mail/fields/unstructured_field.rb +204 -0
- data/lib/mail/header.rb +274 -0
- data/lib/mail/indifferent_hash.rb +146 -0
- data/lib/mail/mail.rb +267 -0
- data/lib/mail/matchers/has_sent_mail.rb +157 -0
- data/lib/mail/message.rb +2160 -0
- data/lib/mail/multibyte.rb +42 -0
- data/lib/mail/multibyte/chars.rb +474 -0
- data/lib/mail/multibyte/exceptions.rb +8 -0
- data/lib/mail/multibyte/unicode.rb +400 -0
- data/lib/mail/multibyte/utils.rb +60 -0
- data/lib/mail/network.rb +14 -0
- data/lib/mail/network/delivery_methods/exim.rb +52 -0
- data/lib/mail/network/delivery_methods/file_delivery.rb +45 -0
- data/lib/mail/network/delivery_methods/sendmail.rb +89 -0
- data/lib/mail/network/delivery_methods/smtp.rb +142 -0
- data/lib/mail/network/delivery_methods/smtp_connection.rb +61 -0
- data/lib/mail/network/delivery_methods/test_mailer.rb +44 -0
- data/lib/mail/network/retriever_methods/base.rb +63 -0
- data/lib/mail/network/retriever_methods/imap.rb +173 -0
- data/lib/mail/network/retriever_methods/pop3.rb +140 -0
- data/lib/mail/network/retriever_methods/test_retriever.rb +43 -0
- data/lib/mail/parsers.rb +26 -0
- data/lib/mail/parsers/address_lists_parser.rb +132 -0
- data/lib/mail/parsers/content_disposition_parser.rb +67 -0
- data/lib/mail/parsers/content_location_parser.rb +35 -0
- data/lib/mail/parsers/content_transfer_encoding_parser.rb +33 -0
- data/lib/mail/parsers/content_type_parser.rb +64 -0
- data/lib/mail/parsers/date_time_parser.rb +36 -0
- data/lib/mail/parsers/envelope_from_parser.rb +45 -0
- data/lib/mail/parsers/message_ids_parser.rb +39 -0
- data/lib/mail/parsers/mime_version_parser.rb +41 -0
- data/lib/mail/parsers/phrase_lists_parser.rb +33 -0
- data/lib/mail/parsers/ragel.rb +17 -0
- data/lib/mail/parsers/ragel/common.rl +184 -0
- data/lib/mail/parsers/ragel/date_time.rl +30 -0
- data/lib/mail/parsers/ragel/parser_info.rb +61 -0
- data/lib/mail/parsers/ragel/ruby.rb +39 -0
- data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb +14864 -0
- data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb.rl +37 -0
- data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb +751 -0
- data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb.rl +37 -0
- data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb +614 -0
- data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb.rl +37 -0
- data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb +447 -0
- data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb.rl +37 -0
- data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb +825 -0
- data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb.rl +37 -0
- data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb +817 -0
- data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb.rl +37 -0
- data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb +2129 -0
- data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb.rl +37 -0
- data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb +1570 -0
- data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb.rl +37 -0
- data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb +440 -0
- data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb.rl +37 -0
- data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb +564 -0
- data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb.rl +37 -0
- data/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl +51 -0
- data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb +5144 -0
- data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb.rl +37 -0
- data/lib/mail/parsers/ragel/ruby/parser.rb.rl.erb +37 -0
- data/lib/mail/parsers/received_parser.rb +47 -0
- data/lib/mail/part.rb +120 -0
- data/lib/mail/parts_list.rb +57 -0
- data/lib/mail/patterns.rb +37 -0
- data/lib/mail/utilities.rb +225 -0
- data/lib/mail/values/unicode_tables.dat +0 -0
- data/lib/mail/version.rb +4 -0
- data/lib/mail/version_specific/ruby_1_8.rb +119 -0
- data/lib/mail/version_specific/ruby_1_9.rb +159 -0
- metadata +276 -0
@@ -0,0 +1,132 @@
|
|
1
|
+
module Mail::Parsers
|
2
|
+
class AddressListsParser
|
3
|
+
include Mail::Utilities
|
4
|
+
|
5
|
+
def parse(s)
|
6
|
+
address_list = AddressListStruct.new([],[])
|
7
|
+
|
8
|
+
if s.blank?
|
9
|
+
return address_list
|
10
|
+
end
|
11
|
+
|
12
|
+
actions, error = Ragel.parse(:address_lists, s)
|
13
|
+
if error
|
14
|
+
raise Mail::Field::ParseError.new(Mail::AddressList, s, error)
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
phrase_s = phrase_e = qstr_s = qstr = comment_s = nil
|
19
|
+
group_name_s = domain_s = group_name = nil
|
20
|
+
local_dot_atom_s = local_dot_atom_e = nil
|
21
|
+
local_dot_atom_pre_comment_e = nil
|
22
|
+
obs_domain_list_s = nil
|
23
|
+
|
24
|
+
address_s = 0
|
25
|
+
address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
|
26
|
+
actions.each_slice(2) do |action_id, p|
|
27
|
+
action = Mail::Parsers::Ragel::ACTIONS[action_id]
|
28
|
+
case action
|
29
|
+
|
30
|
+
# Phrase
|
31
|
+
when :phrase_s then phrase_s = p
|
32
|
+
when :phrase_e then phrase_e = p-1
|
33
|
+
|
34
|
+
# Quoted String.
|
35
|
+
when :qstr_s then qstr_s = p
|
36
|
+
when :qstr_e then qstr = s[qstr_s..(p-1)]
|
37
|
+
|
38
|
+
# Comment
|
39
|
+
when :comment_s
|
40
|
+
comment_s = p unless comment_s
|
41
|
+
when :comment_e
|
42
|
+
if address
|
43
|
+
address.comments << s[comment_s..(p-2)]
|
44
|
+
end
|
45
|
+
comment_s = nil
|
46
|
+
|
47
|
+
# Group Name
|
48
|
+
when :group_name_s then group_name_s = p
|
49
|
+
when :group_name_e
|
50
|
+
if qstr
|
51
|
+
group = qstr
|
52
|
+
qstr = nil
|
53
|
+
else
|
54
|
+
group = s[group_name_s..(p-1)]
|
55
|
+
group_name_s = nil
|
56
|
+
end
|
57
|
+
address_list.group_names << group
|
58
|
+
group_name = group
|
59
|
+
|
60
|
+
# Start next address
|
61
|
+
address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
|
62
|
+
address_s = p
|
63
|
+
address.group = group_name
|
64
|
+
|
65
|
+
# Address
|
66
|
+
when :address_s
|
67
|
+
address_s = p
|
68
|
+
when :address_e
|
69
|
+
# Ignore address end events if they don't have
|
70
|
+
# a matching address start event.
|
71
|
+
next if address_s.nil?
|
72
|
+
if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
|
73
|
+
if address.domain
|
74
|
+
address.local = s[local_dot_atom_s..local_dot_atom_e] if address
|
75
|
+
else
|
76
|
+
address.local = s[local_dot_atom_s..local_dot_atom_pre_comment_e] if address
|
77
|
+
end
|
78
|
+
end
|
79
|
+
address.raw = s[address_s..(p-1)]
|
80
|
+
address_list.addresses << address if address
|
81
|
+
|
82
|
+
# Start next address
|
83
|
+
address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
|
84
|
+
address.group = group_name
|
85
|
+
address_s = nil
|
86
|
+
|
87
|
+
# Don't set the display name until the
|
88
|
+
# address has actually started. This allows
|
89
|
+
# us to choose quoted_s version if it
|
90
|
+
# exists and always use the 'full' phrase
|
91
|
+
# version.
|
92
|
+
when :angle_addr_s
|
93
|
+
if qstr
|
94
|
+
address.display_name = qstr
|
95
|
+
qstr = nil
|
96
|
+
elsif phrase_e
|
97
|
+
address.display_name = s[phrase_s..phrase_e].strip
|
98
|
+
phrase_e = phrase_s = nil
|
99
|
+
end
|
100
|
+
|
101
|
+
# Domain
|
102
|
+
when :domain_s
|
103
|
+
domain_s = p
|
104
|
+
when :domain_e
|
105
|
+
address.domain = s[domain_s..(p-1)].rstrip if address
|
106
|
+
|
107
|
+
# Local
|
108
|
+
when :local_dot_atom_s then local_dot_atom_s = p
|
109
|
+
when :local_dot_atom_e then local_dot_atom_e = p-1
|
110
|
+
when :local_dot_atom_pre_comment_e
|
111
|
+
local_dot_atom_pre_comment_e = p-1
|
112
|
+
when :local_quoted_string_e
|
113
|
+
address.local = '"' + qstr + '"' if address
|
114
|
+
|
115
|
+
# obs_domain_list
|
116
|
+
when :obs_domain_list_s then obs_domain_list_s = p
|
117
|
+
when :obs_domain_list_e
|
118
|
+
address.obs_domain_list = s[obs_domain_list_s..(p-1)]
|
119
|
+
|
120
|
+
else
|
121
|
+
raise Mail::Field::ParseError.new(Mail::AddressList, s, "Failed to process unknown action: #{action}")
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
if address_list.addresses.empty? && address_list.group_names.empty?
|
126
|
+
raise Mail::Field::ParseError.new(Mail::AddressList, s, "Didn't find any addresses or groups")
|
127
|
+
end
|
128
|
+
|
129
|
+
address_list
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Mail::Parsers
|
2
|
+
class ContentDispositionParser
|
3
|
+
include Mail::Utilities
|
4
|
+
|
5
|
+
def parse(s)
|
6
|
+
content_disposition = ContentDispositionStruct.new("", nil)
|
7
|
+
if s.blank?
|
8
|
+
return content_disposition
|
9
|
+
end
|
10
|
+
|
11
|
+
actions, error = Ragel.parse(:content_disposition, s)
|
12
|
+
if error
|
13
|
+
raise Mail::Field::ParseError.new(Mail::ContentDispositionElement, s, error)
|
14
|
+
end
|
15
|
+
|
16
|
+
content_disposition.parameters = []
|
17
|
+
|
18
|
+
disp_type_s = param_attr_s = param_attr = qstr_s = qstr = param_val_s = nil
|
19
|
+
actions.each_slice(2) do |action_id, p|
|
20
|
+
action = Mail::Parsers::Ragel::ACTIONS[action_id]
|
21
|
+
case action
|
22
|
+
|
23
|
+
# Disposition Type
|
24
|
+
when :disp_type_s then disp_type_s = p
|
25
|
+
when :disp_type_e
|
26
|
+
content_disposition.disposition_type = s[disp_type_s..(p-1)].downcase
|
27
|
+
|
28
|
+
# Parameter Attribute
|
29
|
+
when :param_attr_s then param_attr_s = p
|
30
|
+
when :param_attr_e then param_attr = s[param_attr_s..(p-1)]
|
31
|
+
|
32
|
+
# Quoted String.
|
33
|
+
when :qstr_s then qstr_s = p
|
34
|
+
when :qstr_e then qstr = s[qstr_s..(p-1)]
|
35
|
+
|
36
|
+
# Parameter Value
|
37
|
+
when :param_val_s then param_val_s = p
|
38
|
+
when :param_val_e
|
39
|
+
if param_attr.nil?
|
40
|
+
raise Mail::Field::ParseError.new(Mail::ContentDispositionElement, s, "no attribute for value")
|
41
|
+
end
|
42
|
+
|
43
|
+
# Use quoted string value if one exists, otherwise use parameter value
|
44
|
+
if qstr
|
45
|
+
value = qstr
|
46
|
+
else
|
47
|
+
value = s[param_val_s..(p-1)]
|
48
|
+
end
|
49
|
+
|
50
|
+
content_disposition.parameters << { param_attr => value }
|
51
|
+
param_attr = nil
|
52
|
+
qstr = nil
|
53
|
+
|
54
|
+
else
|
55
|
+
raise Mail::Field::ParseError.new(Mail::ContentDispositionElement, s, "Failed to process unknown action: #{action}")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
content_disposition
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
def cleaned(string)
|
64
|
+
string =~ /(.+);\s*$/ ? $1 : string
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Mail::Parsers
|
2
|
+
class ContentLocationParser
|
3
|
+
def parse(s)
|
4
|
+
content_location = ContentLocationStruct.new(nil)
|
5
|
+
if s.blank?
|
6
|
+
return content_location
|
7
|
+
end
|
8
|
+
|
9
|
+
actions, error = Ragel.parse(:content_location, s)
|
10
|
+
if error
|
11
|
+
raise Mail::Field::ParseError.new(Mail::ContentLocationElement, s, error)
|
12
|
+
end
|
13
|
+
|
14
|
+
qstr_s = token_string_s = nil
|
15
|
+
actions.each_slice(2) do |action_id, p|
|
16
|
+
action = Mail::Parsers::Ragel::ACTIONS[action_id]
|
17
|
+
case action
|
18
|
+
|
19
|
+
# Quoted String.
|
20
|
+
when :qstr_s then qstr_s = p
|
21
|
+
when :qstr_e then content_location.location = s[qstr_s..(p-1)]
|
22
|
+
|
23
|
+
# Token String
|
24
|
+
when :token_string_s then token_string_s = p
|
25
|
+
when :token_string_e
|
26
|
+
content_location.location = s[token_string_s..(p-1)]
|
27
|
+
|
28
|
+
else
|
29
|
+
raise Mail::Field::ParseError.new(Mail::ContentLocationElement, s, "Failed to process unknown action: #{action}")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
content_location
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Mail::Parsers
|
2
|
+
class ContentTransferEncodingParser
|
3
|
+
|
4
|
+
def parse(s)
|
5
|
+
content_transfer_encoding = ContentTransferEncodingStruct.new("")
|
6
|
+
if s.blank?
|
7
|
+
return content_transfer_encoding
|
8
|
+
end
|
9
|
+
|
10
|
+
actions, error = Ragel.parse(:content_transfer_encoding, s)
|
11
|
+
if error
|
12
|
+
raise Mail::Field::ParseError.new(Mail::ContentTransferEncodingElement, s, error)
|
13
|
+
end
|
14
|
+
|
15
|
+
encoding_s = nil
|
16
|
+
actions.each_slice(2) do |action_id, p|
|
17
|
+
action = Mail::Parsers::Ragel::ACTIONS[action_id]
|
18
|
+
case action
|
19
|
+
|
20
|
+
# Encoding
|
21
|
+
when :encoding_s then encoding_s = p
|
22
|
+
when :encoding_e
|
23
|
+
content_transfer_encoding.encoding = s[encoding_s..(p-1)].downcase
|
24
|
+
|
25
|
+
else
|
26
|
+
raise Mail::Field::ParseError.new(Mail::ContentTransferEncodingElement, s, "Failed to process unknown action: #{action}")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
content_transfer_encoding
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Mail::Parsers
|
2
|
+
class ContentTypeParser
|
3
|
+
include Mail::Utilities
|
4
|
+
|
5
|
+
def parse(s)
|
6
|
+
actions, error = Ragel.parse(:content_type, s)
|
7
|
+
if error
|
8
|
+
raise Mail::Field::ParseError.new(Mail::ContentTypeElement, s, error)
|
9
|
+
end
|
10
|
+
|
11
|
+
content_type = ContentTypeStruct.new(nil,nil,[])
|
12
|
+
|
13
|
+
content_type.parameters = []
|
14
|
+
|
15
|
+
main_type_s = sub_type_s = param_attr_s = param_attr = nil
|
16
|
+
qstr_s = qstr = param_val_s = nil
|
17
|
+
actions.each_slice(2) do |action_id, p|
|
18
|
+
action = Mail::Parsers::Ragel::ACTIONS[action_id]
|
19
|
+
case action
|
20
|
+
|
21
|
+
# Main Type
|
22
|
+
when :main_type_s then main_type_s = p
|
23
|
+
when :main_type_e then
|
24
|
+
content_type.main_type = s[main_type_s..(p-1)].downcase
|
25
|
+
|
26
|
+
# Sub Type
|
27
|
+
when :sub_type_s then sub_type_s = p
|
28
|
+
when :sub_type_e
|
29
|
+
content_type.sub_type = s[sub_type_s..(p-1)].downcase
|
30
|
+
|
31
|
+
# Parameter Attribute
|
32
|
+
when :param_attr_s then param_attr_s = p
|
33
|
+
when :param_attr_e then param_attr = s[param_attr_s..(p-1)]
|
34
|
+
|
35
|
+
# Quoted String.
|
36
|
+
when :qstr_s then qstr_s = p
|
37
|
+
when :qstr_e then qstr = s[qstr_s..(p-1)]
|
38
|
+
|
39
|
+
# Parameter Value
|
40
|
+
when :param_val_s then param_val_s = p
|
41
|
+
when :param_val_e
|
42
|
+
if param_attr.nil?
|
43
|
+
raise Mail::Field::ParseError.new(Mail::ContentTypeElement, s, "no attribute for value")
|
44
|
+
end
|
45
|
+
|
46
|
+
# Use quoted s value if one exists, otherwise use parameter value
|
47
|
+
if qstr
|
48
|
+
value = qstr
|
49
|
+
else
|
50
|
+
value = s[param_val_s..(p-1)]
|
51
|
+
end
|
52
|
+
|
53
|
+
content_type.parameters << { param_attr => value }
|
54
|
+
param_attr = nil
|
55
|
+
qstr = nil
|
56
|
+
|
57
|
+
else
|
58
|
+
raise Mail::Field::ParseError.new(Mail::ContentTypeElement, s, "Failed to process unknown action: #{action}")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
content_type
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Mail::Parsers
|
2
|
+
class DateTimeParser
|
3
|
+
include Mail::Utilities
|
4
|
+
|
5
|
+
def parse(s)
|
6
|
+
date_time = DateTimeStruct.new([])
|
7
|
+
|
8
|
+
actions, error = Ragel.parse(:date_time, s)
|
9
|
+
if error
|
10
|
+
raise Mail::Field::ParseError.new(Mail::DateTimeElement, s, error)
|
11
|
+
end
|
12
|
+
|
13
|
+
date_s = time_s = nil
|
14
|
+
actions.each_slice(2) do |action_id, p|
|
15
|
+
action = Mail::Parsers::Ragel::ACTIONS[action_id]
|
16
|
+
case action
|
17
|
+
|
18
|
+
# Date
|
19
|
+
when :date_s then date_s = p
|
20
|
+
when :date_e
|
21
|
+
date_time.date_string = s[date_s..(p-1)]
|
22
|
+
|
23
|
+
# Time
|
24
|
+
when :time_s then time_s = p
|
25
|
+
when :time_e
|
26
|
+
date_time.time_string = s[time_s..(p-1)]
|
27
|
+
|
28
|
+
else
|
29
|
+
raise Mail::Field::ParseError.new(Mail::DateTimeElement, s, "Failed to process unknown action: #{action}")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
date_time
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Mail::Parsers
|
2
|
+
class EnvelopeFromParser
|
3
|
+
def parse(s)
|
4
|
+
envelope_from = EnvelopeFromStruct.new
|
5
|
+
if s.blank?
|
6
|
+
return envelope_from
|
7
|
+
end
|
8
|
+
|
9
|
+
actions, error = Ragel.parse(:envelope_from, s)
|
10
|
+
if error
|
11
|
+
raise Mail::Field::ParseError.new(Mail::EnvelopeFromElement, s, error)
|
12
|
+
end
|
13
|
+
|
14
|
+
address_s = ctime_date_s = nil
|
15
|
+
envelope_from = EnvelopeFromStruct.new
|
16
|
+
actions.each_slice(2) do |action_id, p|
|
17
|
+
action = Mail::Parsers::Ragel::ACTIONS[action_id]
|
18
|
+
case action
|
19
|
+
|
20
|
+
# Address
|
21
|
+
when :address_s then address_s = p
|
22
|
+
when :address_e
|
23
|
+
envelope_from.address = s[address_s..(p-1)].rstrip
|
24
|
+
|
25
|
+
# ctime_date
|
26
|
+
when :ctime_date_s then ctime_date_s = p
|
27
|
+
when :ctime_date_e
|
28
|
+
envelope_from.ctime_date = s[ctime_date_s..(p-1)]
|
29
|
+
|
30
|
+
# ignored actions
|
31
|
+
when :angle_addr_s, :comment_e, :comment_s,
|
32
|
+
:domain_e, :domain_s, :local_dot_atom_e,
|
33
|
+
:local_dot_atom_pre_comment_e,
|
34
|
+
:local_dot_atom_pre_comment_s,
|
35
|
+
:local_dot_atom_s, :qstr_e, :qstr_s
|
36
|
+
nil
|
37
|
+
|
38
|
+
else
|
39
|
+
raise Mail::Field::ParseError.new(Mail::EnvelopeFromElement, s, "Failed to process unknown action: #{action}")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
envelope_from
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Mail::Parsers
|
2
|
+
class MessageIdsParser
|
3
|
+
def parse(s)
|
4
|
+
if s.blank?
|
5
|
+
return MessageIdsStruct.new
|
6
|
+
end
|
7
|
+
|
8
|
+
message_ids = MessageIdsStruct.new([])
|
9
|
+
|
10
|
+
actions, error = Ragel.parse(:message_ids, s)
|
11
|
+
if error
|
12
|
+
raise Mail::Field::ParseError.new(Mail::MessageIdsElement, s, error)
|
13
|
+
end
|
14
|
+
|
15
|
+
msg_id_s = nil
|
16
|
+
actions.each_slice(2) do |action_id, p|
|
17
|
+
action = Mail::Parsers::Ragel::ACTIONS[action_id]
|
18
|
+
case action
|
19
|
+
|
20
|
+
# Message Ids
|
21
|
+
when :msg_id_s then msg_id_s = p
|
22
|
+
when :msg_id_e
|
23
|
+
message_ids.message_ids << s[msg_id_s..(p-1)].rstrip
|
24
|
+
|
25
|
+
when :domain_e, :domain_s, :local_dot_atom_e,
|
26
|
+
:local_dot_atom_pre_comment_e,
|
27
|
+
:local_dot_atom_pre_comment_s,
|
28
|
+
:local_dot_atom_s
|
29
|
+
|
30
|
+
# ignored actions
|
31
|
+
|
32
|
+
else
|
33
|
+
raise Mail::Field::ParseError.new(Mail::MessageIdsElement, s, "Failed to process unknown action: #{action}")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
message_ids
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|