mail-portertech 2.6.2.edge

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 (153) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.rdoc +753 -0
  3. data/CONTRIBUTING.md +60 -0
  4. data/Dependencies.txt +2 -0
  5. data/Gemfile +15 -0
  6. data/MIT-LICENSE +20 -0
  7. data/README.md +683 -0
  8. data/Rakefile +29 -0
  9. data/TODO.rdoc +9 -0
  10. data/lib/mail.rb +91 -0
  11. data/lib/mail/attachments_list.rb +104 -0
  12. data/lib/mail/body.rb +291 -0
  13. data/lib/mail/check_delivery_params.rb +20 -0
  14. data/lib/mail/configuration.rb +75 -0
  15. data/lib/mail/core_extensions/nil.rb +19 -0
  16. data/lib/mail/core_extensions/object.rb +13 -0
  17. data/lib/mail/core_extensions/smtp.rb +24 -0
  18. data/lib/mail/core_extensions/string.rb +43 -0
  19. data/lib/mail/core_extensions/string/access.rb +145 -0
  20. data/lib/mail/core_extensions/string/multibyte.rb +78 -0
  21. data/lib/mail/elements.rb +14 -0
  22. data/lib/mail/elements/address.rb +270 -0
  23. data/lib/mail/elements/address_list.rb +51 -0
  24. data/lib/mail/elements/content_disposition_element.rb +26 -0
  25. data/lib/mail/elements/content_location_element.rb +21 -0
  26. data/lib/mail/elements/content_transfer_encoding_element.rb +17 -0
  27. data/lib/mail/elements/content_type_element.rb +31 -0
  28. data/lib/mail/elements/date_time_element.rb +22 -0
  29. data/lib/mail/elements/envelope_from_element.rb +39 -0
  30. data/lib/mail/elements/message_ids_element.rb +24 -0
  31. data/lib/mail/elements/mime_version_element.rb +22 -0
  32. data/lib/mail/elements/phrase_list.rb +16 -0
  33. data/lib/mail/elements/received_element.rb +26 -0
  34. data/lib/mail/encodings.rb +304 -0
  35. data/lib/mail/encodings/7bit.rb +31 -0
  36. data/lib/mail/encodings/8bit.rb +31 -0
  37. data/lib/mail/encodings/base64.rb +33 -0
  38. data/lib/mail/encodings/binary.rb +31 -0
  39. data/lib/mail/encodings/quoted_printable.rb +39 -0
  40. data/lib/mail/encodings/transfer_encoding.rb +58 -0
  41. data/lib/mail/envelope.rb +30 -0
  42. data/lib/mail/field.rb +247 -0
  43. data/lib/mail/field_list.rb +33 -0
  44. data/lib/mail/fields.rb +35 -0
  45. data/lib/mail/fields/bcc_field.rb +56 -0
  46. data/lib/mail/fields/cc_field.rb +55 -0
  47. data/lib/mail/fields/comments_field.rb +41 -0
  48. data/lib/mail/fields/common/address_container.rb +16 -0
  49. data/lib/mail/fields/common/common_address.rb +135 -0
  50. data/lib/mail/fields/common/common_date.rb +35 -0
  51. data/lib/mail/fields/common/common_field.rb +57 -0
  52. data/lib/mail/fields/common/common_message_id.rb +48 -0
  53. data/lib/mail/fields/common/parameter_hash.rb +58 -0
  54. data/lib/mail/fields/content_description_field.rb +19 -0
  55. data/lib/mail/fields/content_disposition_field.rb +70 -0
  56. data/lib/mail/fields/content_id_field.rb +62 -0
  57. data/lib/mail/fields/content_location_field.rb +42 -0
  58. data/lib/mail/fields/content_transfer_encoding_field.rb +44 -0
  59. data/lib/mail/fields/content_type_field.rb +201 -0
  60. data/lib/mail/fields/date_field.rb +57 -0
  61. data/lib/mail/fields/from_field.rb +55 -0
  62. data/lib/mail/fields/in_reply_to_field.rb +56 -0
  63. data/lib/mail/fields/keywords_field.rb +44 -0
  64. data/lib/mail/fields/message_id_field.rb +82 -0
  65. data/lib/mail/fields/mime_version_field.rb +53 -0
  66. data/lib/mail/fields/optional_field.rb +13 -0
  67. data/lib/mail/fields/received_field.rb +75 -0
  68. data/lib/mail/fields/references_field.rb +56 -0
  69. data/lib/mail/fields/reply_to_field.rb +55 -0
  70. data/lib/mail/fields/resent_bcc_field.rb +55 -0
  71. data/lib/mail/fields/resent_cc_field.rb +55 -0
  72. data/lib/mail/fields/resent_date_field.rb +35 -0
  73. data/lib/mail/fields/resent_from_field.rb +55 -0
  74. data/lib/mail/fields/resent_message_id_field.rb +34 -0
  75. data/lib/mail/fields/resent_sender_field.rb +62 -0
  76. data/lib/mail/fields/resent_to_field.rb +55 -0
  77. data/lib/mail/fields/return_path_field.rb +65 -0
  78. data/lib/mail/fields/sender_field.rb +67 -0
  79. data/lib/mail/fields/structured_field.rb +51 -0
  80. data/lib/mail/fields/subject_field.rb +16 -0
  81. data/lib/mail/fields/to_field.rb +55 -0
  82. data/lib/mail/fields/unstructured_field.rb +204 -0
  83. data/lib/mail/header.rb +274 -0
  84. data/lib/mail/indifferent_hash.rb +146 -0
  85. data/lib/mail/mail.rb +267 -0
  86. data/lib/mail/matchers/has_sent_mail.rb +157 -0
  87. data/lib/mail/message.rb +2160 -0
  88. data/lib/mail/multibyte.rb +42 -0
  89. data/lib/mail/multibyte/chars.rb +474 -0
  90. data/lib/mail/multibyte/exceptions.rb +8 -0
  91. data/lib/mail/multibyte/unicode.rb +400 -0
  92. data/lib/mail/multibyte/utils.rb +60 -0
  93. data/lib/mail/network.rb +14 -0
  94. data/lib/mail/network/delivery_methods/exim.rb +52 -0
  95. data/lib/mail/network/delivery_methods/file_delivery.rb +45 -0
  96. data/lib/mail/network/delivery_methods/sendmail.rb +89 -0
  97. data/lib/mail/network/delivery_methods/smtp.rb +142 -0
  98. data/lib/mail/network/delivery_methods/smtp_connection.rb +61 -0
  99. data/lib/mail/network/delivery_methods/test_mailer.rb +44 -0
  100. data/lib/mail/network/retriever_methods/base.rb +63 -0
  101. data/lib/mail/network/retriever_methods/imap.rb +173 -0
  102. data/lib/mail/network/retriever_methods/pop3.rb +140 -0
  103. data/lib/mail/network/retriever_methods/test_retriever.rb +43 -0
  104. data/lib/mail/parsers.rb +26 -0
  105. data/lib/mail/parsers/address_lists_parser.rb +132 -0
  106. data/lib/mail/parsers/content_disposition_parser.rb +67 -0
  107. data/lib/mail/parsers/content_location_parser.rb +35 -0
  108. data/lib/mail/parsers/content_transfer_encoding_parser.rb +33 -0
  109. data/lib/mail/parsers/content_type_parser.rb +64 -0
  110. data/lib/mail/parsers/date_time_parser.rb +36 -0
  111. data/lib/mail/parsers/envelope_from_parser.rb +45 -0
  112. data/lib/mail/parsers/message_ids_parser.rb +39 -0
  113. data/lib/mail/parsers/mime_version_parser.rb +41 -0
  114. data/lib/mail/parsers/phrase_lists_parser.rb +33 -0
  115. data/lib/mail/parsers/ragel.rb +17 -0
  116. data/lib/mail/parsers/ragel/common.rl +184 -0
  117. data/lib/mail/parsers/ragel/date_time.rl +30 -0
  118. data/lib/mail/parsers/ragel/parser_info.rb +61 -0
  119. data/lib/mail/parsers/ragel/ruby.rb +39 -0
  120. data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb +14864 -0
  121. data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb.rl +37 -0
  122. data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb +751 -0
  123. data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb.rl +37 -0
  124. data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb +614 -0
  125. data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb.rl +37 -0
  126. data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb +447 -0
  127. data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb.rl +37 -0
  128. data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb +825 -0
  129. data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb.rl +37 -0
  130. data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb +817 -0
  131. data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb.rl +37 -0
  132. data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb +2129 -0
  133. data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb.rl +37 -0
  134. data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb +1570 -0
  135. data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb.rl +37 -0
  136. data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb +440 -0
  137. data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb.rl +37 -0
  138. data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb +564 -0
  139. data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb.rl +37 -0
  140. data/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl +51 -0
  141. data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb +5144 -0
  142. data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb.rl +37 -0
  143. data/lib/mail/parsers/ragel/ruby/parser.rb.rl.erb +37 -0
  144. data/lib/mail/parsers/received_parser.rb +47 -0
  145. data/lib/mail/part.rb +120 -0
  146. data/lib/mail/parts_list.rb +57 -0
  147. data/lib/mail/patterns.rb +37 -0
  148. data/lib/mail/utilities.rb +225 -0
  149. data/lib/mail/values/unicode_tables.dat +0 -0
  150. data/lib/mail/version.rb +4 -0
  151. data/lib/mail/version_specific/ruby_1_8.rb +119 -0
  152. data/lib/mail/version_specific/ruby_1_9.rb +159 -0
  153. 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