mail 2.6.4 → 2.9.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 (180) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +208 -156
  3. data/lib/mail/attachments_list.rb +13 -10
  4. data/lib/mail/body.rb +96 -107
  5. data/lib/mail/configuration.rb +2 -0
  6. data/lib/mail/constants.rb +27 -5
  7. data/lib/mail/elements/address.rb +61 -50
  8. data/lib/mail/elements/address_list.rb +11 -19
  9. data/lib/mail/elements/content_disposition_element.rb +9 -16
  10. data/lib/mail/elements/content_location_element.rb +6 -11
  11. data/lib/mail/elements/content_transfer_encoding_element.rb +6 -11
  12. data/lib/mail/elements/content_type_element.rb +16 -23
  13. data/lib/mail/elements/date_time_element.rb +7 -15
  14. data/lib/mail/elements/envelope_from_element.rb +22 -23
  15. data/lib/mail/elements/message_ids_element.rb +18 -13
  16. data/lib/mail/elements/mime_version_element.rb +7 -15
  17. data/lib/mail/elements/phrase_list.rb +12 -10
  18. data/lib/mail/elements/received_element.rb +27 -19
  19. data/lib/mail/encodings/7bit.rb +9 -14
  20. data/lib/mail/encodings/8bit.rb +2 -21
  21. data/lib/mail/encodings/base64.rb +11 -12
  22. data/lib/mail/encodings/binary.rb +3 -22
  23. data/lib/mail/encodings/identity.rb +24 -0
  24. data/lib/mail/encodings/quoted_printable.rb +6 -6
  25. data/lib/mail/encodings/transfer_encoding.rb +38 -29
  26. data/lib/mail/encodings/unix_to_unix.rb +4 -2
  27. data/lib/mail/encodings.rb +83 -56
  28. data/lib/mail/envelope.rb +11 -14
  29. data/lib/mail/field.rb +181 -130
  30. data/lib/mail/field_list.rb +61 -8
  31. data/lib/mail/fields/bcc_field.rb +33 -52
  32. data/lib/mail/fields/cc_field.rb +27 -49
  33. data/lib/mail/fields/comments_field.rb +26 -37
  34. data/lib/mail/fields/common_address_field.rb +162 -0
  35. data/lib/mail/fields/common_date_field.rb +56 -0
  36. data/lib/mail/fields/common_field.rb +77 -0
  37. data/lib/mail/fields/common_message_id_field.rb +41 -0
  38. data/lib/mail/fields/content_description_field.rb +6 -14
  39. data/lib/mail/fields/content_disposition_field.rb +11 -38
  40. data/lib/mail/fields/content_id_field.rb +23 -51
  41. data/lib/mail/fields/content_location_field.rb +10 -25
  42. data/lib/mail/fields/content_transfer_encoding_field.rb +30 -31
  43. data/lib/mail/fields/content_type_field.rb +53 -84
  44. data/lib/mail/fields/date_field.rb +22 -52
  45. data/lib/mail/fields/from_field.rb +27 -49
  46. data/lib/mail/fields/in_reply_to_field.rb +37 -49
  47. data/lib/mail/fields/keywords_field.rb +17 -31
  48. data/lib/mail/fields/message_id_field.rb +24 -71
  49. data/lib/mail/fields/mime_version_field.rb +18 -30
  50. data/lib/mail/fields/named_structured_field.rb +10 -0
  51. data/lib/mail/fields/named_unstructured_field.rb +10 -0
  52. data/lib/mail/fields/optional_field.rb +9 -8
  53. data/lib/mail/fields/{common/parameter_hash.rb → parameter_hash.rb} +13 -11
  54. data/lib/mail/fields/received_field.rb +42 -57
  55. data/lib/mail/fields/references_field.rb +34 -49
  56. data/lib/mail/fields/reply_to_field.rb +27 -49
  57. data/lib/mail/fields/resent_bcc_field.rb +27 -49
  58. data/lib/mail/fields/resent_cc_field.rb +27 -49
  59. data/lib/mail/fields/resent_date_field.rb +4 -30
  60. data/lib/mail/fields/resent_from_field.rb +27 -49
  61. data/lib/mail/fields/resent_message_id_field.rb +4 -29
  62. data/lib/mail/fields/resent_sender_field.rb +26 -56
  63. data/lib/mail/fields/resent_to_field.rb +27 -49
  64. data/lib/mail/fields/return_path_field.rb +49 -54
  65. data/lib/mail/fields/sender_field.rb +33 -55
  66. data/lib/mail/fields/structured_field.rb +2 -30
  67. data/lib/mail/fields/subject_field.rb +8 -11
  68. data/lib/mail/fields/to_field.rb +27 -49
  69. data/lib/mail/fields/unstructured_field.rb +31 -47
  70. data/lib/mail/fields.rb +9 -0
  71. data/lib/mail/header.rb +71 -110
  72. data/lib/mail/mail.rb +34 -37
  73. data/lib/mail/matchers/attachment_matchers.rb +15 -0
  74. data/lib/mail/matchers/has_sent_mail.rb +21 -1
  75. data/lib/mail/message.rb +126 -127
  76. data/lib/mail/multibyte/chars.rb +24 -181
  77. data/lib/mail/multibyte/unicode.rb +11 -11
  78. data/lib/mail/multibyte/utils.rb +26 -43
  79. data/lib/mail/multibyte.rb +55 -16
  80. data/lib/mail/network/delivery_methods/exim.rb +8 -11
  81. data/lib/mail/network/delivery_methods/file_delivery.rb +15 -18
  82. data/lib/mail/network/delivery_methods/logger_delivery.rb +34 -0
  83. data/lib/mail/network/delivery_methods/sendmail.rb +32 -35
  84. data/lib/mail/network/delivery_methods/smtp.rb +125 -68
  85. data/lib/mail/network/delivery_methods/smtp_connection.rb +11 -16
  86. data/lib/mail/network/delivery_methods/test_mailer.rb +12 -13
  87. data/lib/mail/network/retriever_methods/base.rb +13 -13
  88. data/lib/mail/network/retriever_methods/imap.rb +25 -9
  89. data/lib/mail/network/retriever_methods/pop3.rb +25 -23
  90. data/lib/mail/network/retriever_methods/test_retriever.rb +3 -2
  91. data/lib/mail/network.rb +1 -0
  92. data/lib/mail/parser_tools.rb +15 -0
  93. data/lib/mail/parsers/address_lists_parser.rb +33228 -116
  94. data/lib/mail/parsers/address_lists_parser.rl +183 -0
  95. data/lib/mail/parsers/content_disposition_parser.rb +885 -49
  96. data/lib/mail/parsers/content_disposition_parser.rl +93 -0
  97. data/lib/mail/parsers/content_location_parser.rb +812 -23
  98. data/lib/mail/parsers/content_location_parser.rl +82 -0
  99. data/lib/mail/parsers/content_transfer_encoding_parser.rb +512 -21
  100. data/lib/mail/parsers/content_transfer_encoding_parser.rl +75 -0
  101. data/lib/mail/parsers/content_type_parser.rb +1039 -55
  102. data/lib/mail/parsers/content_type_parser.rl +94 -0
  103. data/lib/mail/parsers/date_time_parser.rb +880 -25
  104. data/lib/mail/parsers/date_time_parser.rl +73 -0
  105. data/lib/mail/parsers/envelope_from_parser.rb +3672 -40
  106. data/lib/mail/parsers/envelope_from_parser.rl +93 -0
  107. data/lib/mail/parsers/message_ids_parser.rb +5149 -25
  108. data/lib/mail/parsers/message_ids_parser.rl +97 -0
  109. data/lib/mail/parsers/mime_version_parser.rb +500 -26
  110. data/lib/mail/parsers/mime_version_parser.rl +72 -0
  111. data/lib/mail/parsers/phrase_lists_parser.rb +873 -22
  112. data/lib/mail/parsers/phrase_lists_parser.rl +94 -0
  113. data/lib/mail/parsers/received_parser.rb +8779 -43
  114. data/lib/mail/parsers/received_parser.rl +95 -0
  115. data/lib/mail/parsers/rfc2045_content_transfer_encoding.rl +13 -0
  116. data/lib/mail/parsers/rfc2045_content_type.rl +25 -0
  117. data/lib/mail/parsers/rfc2045_mime.rl +16 -0
  118. data/lib/mail/parsers/rfc2183_content_disposition.rl +15 -0
  119. data/lib/mail/parsers/rfc3629_utf8.rl +19 -0
  120. data/lib/mail/parsers/rfc5234_abnf_core_rules.rl +22 -0
  121. data/lib/mail/parsers/rfc5322.rl +74 -0
  122. data/lib/mail/parsers/rfc5322_address.rl +72 -0
  123. data/lib/mail/parsers/{ragel/date_time.rl → rfc5322_date_time.rl} +8 -1
  124. data/lib/mail/parsers/rfc5322_lexical_tokens.rl +60 -0
  125. data/lib/mail/parsers.rb +11 -25
  126. data/lib/mail/part.rb +25 -29
  127. data/lib/mail/parts_list.rb +62 -6
  128. data/lib/mail/smtp_envelope.rb +57 -0
  129. data/lib/mail/utilities.rb +361 -74
  130. data/lib/mail/version.rb +2 -2
  131. data/lib/mail/yaml.rb +30 -0
  132. data/lib/mail.rb +4 -37
  133. metadata +125 -67
  134. data/CHANGELOG.rdoc +0 -787
  135. data/CONTRIBUTING.md +0 -60
  136. data/Dependencies.txt +0 -2
  137. data/Gemfile +0 -11
  138. data/Rakefile +0 -29
  139. data/TODO.rdoc +0 -9
  140. data/lib/mail/check_delivery_params.rb +0 -21
  141. data/lib/mail/core_extensions/smtp.rb +0 -25
  142. data/lib/mail/core_extensions/string/access.rb +0 -146
  143. data/lib/mail/core_extensions/string/multibyte.rb +0 -79
  144. data/lib/mail/core_extensions/string.rb +0 -21
  145. data/lib/mail/fields/common/address_container.rb +0 -17
  146. data/lib/mail/fields/common/common_address.rb +0 -136
  147. data/lib/mail/fields/common/common_date.rb +0 -36
  148. data/lib/mail/fields/common/common_field.rb +0 -61
  149. data/lib/mail/fields/common/common_message_id.rb +0 -49
  150. data/lib/mail/multibyte/exceptions.rb +0 -9
  151. data/lib/mail/parsers/ragel/common.rl +0 -185
  152. data/lib/mail/parsers/ragel/parser_info.rb +0 -61
  153. data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb +0 -14864
  154. data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb.rl +0 -37
  155. data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb +0 -751
  156. data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb.rl +0 -37
  157. data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb +0 -614
  158. data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb.rl +0 -37
  159. data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb +0 -447
  160. data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb.rl +0 -37
  161. data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb +0 -825
  162. data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb.rl +0 -37
  163. data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb +0 -817
  164. data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb.rl +0 -37
  165. data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb +0 -2149
  166. data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb.rl +0 -37
  167. data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb +0 -1570
  168. data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb.rl +0 -37
  169. data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb +0 -440
  170. data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb.rl +0 -37
  171. data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb +0 -564
  172. data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb.rl +0 -37
  173. data/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl +0 -51
  174. data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb +0 -5144
  175. data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb.rl +0 -37
  176. data/lib/mail/parsers/ragel/ruby/parser.rb.rl.erb +0 -37
  177. data/lib/mail/parsers/ragel/ruby.rb +0 -40
  178. data/lib/mail/parsers/ragel.rb +0 -18
  179. data/lib/mail/version_specific/ruby_1_8.rb +0 -126
  180. data/lib/mail/version_specific/ruby_1_9.rb +0 -223
@@ -6,9 +6,9 @@ module Mail
6
6
  # Each email retrieved (RFC2822) is given as an instance of +Message+.
7
7
  #
8
8
  # While being retrieved, emails can be yielded if a block is given.
9
- #
9
+ #
10
10
  # === Example of retrieving Emails from GMail:
11
- #
11
+ #
12
12
  # Mail.defaults do
13
13
  # retriever_method :pop3, { :address => "pop.gmail.com",
14
14
  # :port => 995,
@@ -16,22 +16,22 @@ module Mail
16
16
  # :password => '<password>',
17
17
  # :enable_ssl => true }
18
18
  # end
19
- #
19
+ #
20
20
  # Mail.all #=> Returns an array of all emails
21
21
  # Mail.first #=> Returns the first unread email
22
22
  # Mail.last #=> Returns the last unread email
23
- #
23
+ #
24
24
  # You can also pass options into Mail.find to locate an email in your pop mailbox
25
25
  # with the following options:
26
- #
26
+ #
27
27
  # what: last or first emails. The default is :first.
28
28
  # order: order of emails returned. Possible values are :asc or :desc. Default value is :asc.
29
29
  # count: number of emails to retrieve. The default value is 10. A value of 1 returns an
30
30
  # instance of Message, not an array of Message instances.
31
- #
31
+ #
32
32
  # Mail.find(:what => :first, :count => 10, :order => :asc)
33
33
  # #=> Returns the first 10 emails in ascending order
34
- #
34
+ #
35
35
  class POP3 < Retriever
36
36
  require 'net/pop' unless defined?(Net::POP)
37
37
 
@@ -41,11 +41,12 @@ module Mail
41
41
  :user_name => nil,
42
42
  :password => nil,
43
43
  :authentication => nil,
44
- :enable_ssl => false }.merge!(values)
44
+ :enable_ssl => false,
45
+ :read_timeout => nil }.merge!(values)
45
46
  end
46
-
47
+
47
48
  attr_accessor :settings
48
-
49
+
49
50
  # Find emails in a POP3 mailbox. Without any options, the 5 last received emails are returned.
50
51
  #
51
52
  # Possible options:
@@ -56,20 +57,20 @@ module Mail
56
57
  # delete_after_find: flag for whether to delete each retreived email after find. Default
57
58
  # is false. Use #find_and_delete if you would like this to default to true.
58
59
  #
59
- def find(options = {}, &block)
60
+ def find(options = nil, &block)
60
61
  options = validate_options(options)
61
-
62
+
62
63
  start do |pop3|
63
64
  mails = pop3.mails
64
65
  pop3.reset # Clears all "deleted" marks. This prevents non-explicit/accidental deletions due to server settings.
65
66
  mails.sort! { |m1, m2| m2.number <=> m1.number } if options[:what] == :last
66
67
  mails = mails.first(options[:count]) if options[:count].is_a? Integer
67
-
68
+
68
69
  if options[:what].to_sym == :last && options[:order].to_sym == :desc ||
69
70
  options[:what].to_sym == :first && options[:order].to_sym == :asc ||
70
71
  mails.reverse!
71
72
  end
72
-
73
+
73
74
  if block_given?
74
75
  mails.each do |mail|
75
76
  new_message = Mail.new(mail.pop)
@@ -85,11 +86,11 @@ module Mail
85
86
  end
86
87
  emails.size == 1 && options[:count] == 1 ? emails.first : emails
87
88
  end
88
-
89
+
89
90
  end
90
91
  end
91
-
92
- # Delete all emails from a POP3 server
92
+
93
+ # Delete all emails from a POP3 server
93
94
  def delete_all
94
95
  start do |pop3|
95
96
  unless pop3.mails.empty?
@@ -107,29 +108,30 @@ module Mail
107
108
  yield pop3
108
109
  end
109
110
  end
110
-
111
+
111
112
  private
112
-
113
+
113
114
  # Set default options
114
115
  def validate_options(options)
115
- options ||= {}
116
+ options = options ? Hash[options] : {}
116
117
  options[:count] ||= 10
117
118
  options[:order] ||= :asc
118
119
  options[:what] ||= :first
119
120
  options[:delete_after_find] ||= false
120
121
  options
121
122
  end
122
-
123
+
123
124
  # Start a POP3 session and ensure that it will be closed in any case. Any messages
124
125
  # marked for deletion via #find_and_delete or with the :delete_after_find option
125
126
  # will be deleted when the session is closed.
126
127
  def start(config = Configuration.instance, &block)
127
128
  raise ArgumentError.new("Mail::Retrievable#pop3_start takes a block") unless block_given?
128
-
129
+
129
130
  pop3 = Net::POP3.new(settings[:address], settings[:port], false)
130
131
  pop3.enable_ssl(OpenSSL::SSL::VERIFY_NONE) if settings[:enable_ssl]
132
+ pop3.read_timeout = settings[:read_timeout] if settings[:read_timeout]
131
133
  pop3.start(settings[:user_name], settings[:password])
132
-
134
+
133
135
  yield pop3
134
136
  ensure
135
137
  if defined?(pop3) && pop3 && pop3.started?
@@ -17,7 +17,8 @@ module Mail
17
17
  @@emails = []
18
18
  end
19
19
 
20
- def find(options = {}, &block)
20
+ def find(options = nil, &block)
21
+ options = options ? Hash[options] : {}
21
22
  options[:count] ||= :all
22
23
  options[:order] ||= :asc
23
24
  options[:what] ||= :first
@@ -25,7 +26,7 @@ module Mail
25
26
  emails_index.reverse! if options[:what] == :last
26
27
  emails_index = case count = options[:count]
27
28
  when :all then emails_index
28
- when Fixnum then emails_index[0, count]
29
+ when Integer then emails_index[0, count]
29
30
  else
30
31
  raise 'Invalid count option value: ' + count.inspect
31
32
  end
data/lib/mail/network.rb CHANGED
@@ -4,6 +4,7 @@ require 'mail/network/retriever_methods/base'
4
4
  module Mail
5
5
  register_autoload :SMTP, 'mail/network/delivery_methods/smtp'
6
6
  register_autoload :FileDelivery, 'mail/network/delivery_methods/file_delivery'
7
+ register_autoload :LoggerDelivery, 'mail/network/delivery_methods/logger_delivery'
7
8
  register_autoload :Sendmail, 'mail/network/delivery_methods/sendmail'
8
9
  register_autoload :Exim, 'mail/network/delivery_methods/exim'
9
10
  register_autoload :SMTPConnection, 'mail/network/delivery_methods/smtp_connection'
@@ -0,0 +1,15 @@
1
+ module Mail
2
+ # Extends each field parser with utility methods.
3
+ module ParserTools #:nodoc:
4
+ # Slice bytes from ASCII-8BIT data and mark as UTF-8.
5
+ if 'string'.respond_to?(:force_encoding)
6
+ def chars(data, from_bytes, to_bytes)
7
+ data.slice(from_bytes..to_bytes).force_encoding(Encoding::UTF_8)
8
+ end
9
+ else
10
+ def chars(data, from_bytes, to_bytes)
11
+ data.slice(from_bytes..to_bytes)
12
+ end
13
+ end
14
+ end
15
+ end