mail 2.7.1 → 2.9.1

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 (126) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +135 -59
  3. data/lib/mail/attachments_list.rb +5 -6
  4. data/lib/mail/body.rb +51 -74
  5. data/lib/mail/constants.rb +27 -5
  6. data/lib/mail/elements/address.rb +27 -27
  7. data/lib/mail/elements/address_list.rb +1 -1
  8. data/lib/mail/elements/content_disposition_element.rb +1 -1
  9. data/lib/mail/elements/content_location_element.rb +1 -1
  10. data/lib/mail/elements/content_transfer_encoding_element.rb +1 -1
  11. data/lib/mail/elements/content_type_element.rb +8 -4
  12. data/lib/mail/elements/date_time_element.rb +1 -1
  13. data/lib/mail/elements/envelope_from_element.rb +13 -7
  14. data/lib/mail/elements/message_ids_element.rb +14 -5
  15. data/lib/mail/elements/mime_version_element.rb +1 -1
  16. data/lib/mail/elements/phrase_list.rb +7 -2
  17. data/lib/mail/elements/received_element.rb +20 -6
  18. data/lib/mail/encodings/7bit.rb +5 -0
  19. data/lib/mail/encodings/base64.rb +2 -2
  20. data/lib/mail/encodings/quoted_printable.rb +2 -2
  21. data/lib/mail/encodings/unix_to_unix.rb +1 -1
  22. data/lib/mail/encodings.rb +32 -61
  23. data/lib/mail/envelope.rb +11 -14
  24. data/lib/mail/field.rb +100 -86
  25. data/lib/mail/field_list.rb +61 -8
  26. data/lib/mail/fields/bcc_field.rb +33 -52
  27. data/lib/mail/fields/cc_field.rb +27 -49
  28. data/lib/mail/fields/comments_field.rb +26 -37
  29. data/lib/mail/fields/common_address_field.rb +162 -0
  30. data/lib/mail/fields/common_date_field.rb +56 -0
  31. data/lib/mail/fields/common_field.rb +77 -0
  32. data/lib/mail/fields/common_message_id_field.rb +41 -0
  33. data/lib/mail/fields/content_description_field.rb +6 -14
  34. data/lib/mail/fields/content_disposition_field.rb +11 -38
  35. data/lib/mail/fields/content_id_field.rb +23 -51
  36. data/lib/mail/fields/content_location_field.rb +10 -25
  37. data/lib/mail/fields/content_transfer_encoding_field.rb +30 -31
  38. data/lib/mail/fields/content_type_field.rb +49 -75
  39. data/lib/mail/fields/date_field.rb +22 -51
  40. data/lib/mail/fields/from_field.rb +27 -49
  41. data/lib/mail/fields/in_reply_to_field.rb +37 -49
  42. data/lib/mail/fields/keywords_field.rb +17 -31
  43. data/lib/mail/fields/message_id_field.rb +24 -71
  44. data/lib/mail/fields/mime_version_field.rb +18 -30
  45. data/lib/mail/fields/named_structured_field.rb +10 -0
  46. data/lib/mail/fields/named_unstructured_field.rb +10 -0
  47. data/lib/mail/fields/optional_field.rb +5 -7
  48. data/lib/mail/fields/{common/parameter_hash.rb → parameter_hash.rb} +12 -10
  49. data/lib/mail/fields/received_field.rb +42 -57
  50. data/lib/mail/fields/references_field.rb +34 -49
  51. data/lib/mail/fields/reply_to_field.rb +27 -49
  52. data/lib/mail/fields/resent_bcc_field.rb +27 -49
  53. data/lib/mail/fields/resent_cc_field.rb +27 -49
  54. data/lib/mail/fields/resent_date_field.rb +4 -29
  55. data/lib/mail/fields/resent_from_field.rb +27 -49
  56. data/lib/mail/fields/resent_message_id_field.rb +4 -29
  57. data/lib/mail/fields/resent_sender_field.rb +26 -56
  58. data/lib/mail/fields/resent_to_field.rb +27 -49
  59. data/lib/mail/fields/return_path_field.rb +49 -54
  60. data/lib/mail/fields/sender_field.rb +33 -55
  61. data/lib/mail/fields/structured_field.rb +2 -30
  62. data/lib/mail/fields/subject_field.rb +8 -11
  63. data/lib/mail/fields/to_field.rb +27 -49
  64. data/lib/mail/fields/unstructured_field.rb +15 -48
  65. data/lib/mail/fields.rb +9 -0
  66. data/lib/mail/header.rb +69 -110
  67. data/lib/mail/mail.rb +32 -27
  68. data/lib/mail/matchers/attachment_matchers.rb +15 -0
  69. data/lib/mail/message.rb +67 -78
  70. data/lib/mail/multibyte/chars.rb +9 -167
  71. data/lib/mail/multibyte/unicode.rb +1 -1
  72. data/lib/mail/multibyte/utils.rb +26 -43
  73. data/lib/mail/multibyte.rb +1 -11
  74. data/lib/mail/network/delivery_methods/exim.rb +5 -4
  75. data/lib/mail/network/delivery_methods/file_delivery.rb +13 -12
  76. data/lib/mail/network/delivery_methods/logger_delivery.rb +2 -5
  77. data/lib/mail/network/delivery_methods/sendmail.rb +27 -35
  78. data/lib/mail/network/delivery_methods/smtp.rb +81 -30
  79. data/lib/mail/network/delivery_methods/smtp_connection.rb +10 -19
  80. data/lib/mail/network/delivery_methods/test_mailer.rb +8 -6
  81. data/lib/mail/network/retriever_methods/base.rb +13 -13
  82. data/lib/mail/network/retriever_methods/imap.rb +8 -5
  83. data/lib/mail/network/retriever_methods/pop3.rb +22 -22
  84. data/lib/mail/network/retriever_methods/test_retriever.rb +2 -1
  85. data/lib/mail/parsers/address_lists_parser.rb +33073 -33064
  86. data/lib/mail/parsers/address_lists_parser.rl +11 -0
  87. data/lib/mail/parsers/content_disposition_parser.rb +837 -828
  88. data/lib/mail/parsers/content_disposition_parser.rl +11 -0
  89. data/lib/mail/parsers/content_location_parser.rb +773 -764
  90. data/lib/mail/parsers/content_location_parser.rl +12 -1
  91. data/lib/mail/parsers/content_transfer_encoding_parser.rb +477 -468
  92. data/lib/mail/parsers/content_transfer_encoding_parser.rl +11 -0
  93. data/lib/mail/parsers/content_type_parser.rb +974 -965
  94. data/lib/mail/parsers/content_type_parser.rl +11 -0
  95. data/lib/mail/parsers/date_time_parser.rb +841 -832
  96. data/lib/mail/parsers/date_time_parser.rl +11 -0
  97. data/lib/mail/parsers/envelope_from_parser.rb +3627 -3530
  98. data/lib/mail/parsers/envelope_from_parser.rl +11 -0
  99. data/lib/mail/parsers/message_ids_parser.rb +5110 -2800
  100. data/lib/mail/parsers/message_ids_parser.rl +16 -1
  101. data/lib/mail/parsers/mime_version_parser.rb +466 -457
  102. data/lib/mail/parsers/mime_version_parser.rl +11 -0
  103. data/lib/mail/parsers/phrase_lists_parser.rb +839 -830
  104. data/lib/mail/parsers/phrase_lists_parser.rl +12 -1
  105. data/lib/mail/parsers/received_parser.rb +8692 -8683
  106. data/lib/mail/parsers/received_parser.rl +11 -0
  107. data/lib/mail/parsers/rfc5322.rl +28 -13
  108. data/lib/mail/parsers.rb +11 -17
  109. data/lib/mail/part.rb +24 -28
  110. data/lib/mail/parts_list.rb +57 -0
  111. data/lib/mail/smtp_envelope.rb +57 -0
  112. data/lib/mail/utilities.rb +321 -69
  113. data/lib/mail/version.rb +1 -1
  114. data/lib/mail/yaml.rb +30 -0
  115. data/lib/mail.rb +2 -22
  116. metadata +83 -19
  117. data/lib/mail/check_delivery_params.rb +0 -60
  118. data/lib/mail/core_extensions/smtp.rb +0 -28
  119. data/lib/mail/core_extensions/string.rb +0 -17
  120. data/lib/mail/fields/common/address_container.rb +0 -17
  121. data/lib/mail/fields/common/common_address.rb +0 -161
  122. data/lib/mail/fields/common/common_date.rb +0 -36
  123. data/lib/mail/fields/common/common_field.rb +0 -52
  124. data/lib/mail/fields/common/common_message_id.rb +0 -49
  125. data/lib/mail/version_specific/ruby_1_8.rb +0 -163
  126. data/lib/mail/version_specific/ruby_1_9.rb +0 -278
@@ -29,7 +29,7 @@ module Mail
29
29
  # order: order of emails returned. Possible values are :asc or :desc. Default value is :asc.
30
30
  # count: number of emails to retrieve. The default value is 10. A value of 1 returns an
31
31
  # instance of Message, not an array of Message instances.
32
- # keys: are passed as criteria to the SEARCH command. They can either be a string holding the entire search string,
32
+ # keys: are passed as criteria to the SEARCH command. They can either be a string holding the entire search string,
33
33
  # or a single-dimension array of search keywords and arguments. Refer to [IMAP] section 6.4.4 for a full list
34
34
  # The default is 'ALL'
35
35
  #
@@ -38,7 +38,7 @@ module Mail
38
38
  #
39
39
  class IMAP < Retriever
40
40
  require 'net/imap' unless defined?(Net::IMAP)
41
-
41
+
42
42
  def initialize(values)
43
43
  self.settings = { :address => "localhost",
44
44
  :port => 143,
@@ -65,17 +65,20 @@ module Mail
65
65
  # This is helpful when you don't want your messages to be set to read automatically. Default is false.
66
66
  # delete_after_find: flag for whether to delete each retreived email after find. Default
67
67
  # is false. Use #find_and_delete if you would like this to default to true.
68
- # keys: are passed as criteria to the SEARCH command. They can either be a string holding the entire search string,
68
+ # keys: are passed as criteria to the SEARCH command. They can either be a string holding the entire search string,
69
69
  # or a single-dimension array of search keywords and arguments. Refer to [IMAP] section 6.4.4 for a full list
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={}, &block)
73
+ def find(options=nil, &block)
74
74
  options = validate_options(options)
75
75
 
76
76
  start do |imap|
77
77
  options[:read_only] ? imap.examine(options[:mailbox]) : imap.select(options[:mailbox])
78
+
78
79
  uids = imap.uid_search(options[:keys], options[:search_charset])
80
+ .to_a # older net-imap may return nil, newer may return ESearchResult struct
81
+ .sort # RFC3501 does _not_ require UIDs to be returned in order
79
82
  uids.reverse! if options[:what].to_sym == :last
80
83
  uids = uids.first(options[:count]) if options[:count].is_a?(Integer)
81
84
  uids.reverse! if (options[:what].to_sym == :last && options[:order].to_sym == :asc) ||
@@ -142,7 +145,7 @@ module Mail
142
145
 
143
146
  # Set default options
144
147
  def validate_options(options)
145
- options ||= {}
148
+ options = options ? Hash[options] : {}
146
149
  options[:mailbox] ||= 'INBOX'
147
150
  options[:count] ||= 10
148
151
  options[:order] ||= :asc
@@ -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
 
@@ -44,9 +44,9 @@ module Mail
44
44
  :enable_ssl => false,
45
45
  :read_timeout => nil }.merge!(values)
46
46
  end
47
-
47
+
48
48
  attr_accessor :settings
49
-
49
+
50
50
  # Find emails in a POP3 mailbox. Without any options, the 5 last received emails are returned.
51
51
  #
52
52
  # Possible options:
@@ -57,20 +57,20 @@ 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 = {}, &block)
60
+ def find(options = nil, &block)
61
61
  options = validate_options(options)
62
-
62
+
63
63
  start do |pop3|
64
64
  mails = pop3.mails
65
65
  pop3.reset # Clears all "deleted" marks. This prevents non-explicit/accidental deletions due to server settings.
66
66
  mails.sort! { |m1, m2| m2.number <=> m1.number } if options[:what] == :last
67
67
  mails = mails.first(options[:count]) if options[:count].is_a? Integer
68
-
68
+
69
69
  if options[:what].to_sym == :last && options[:order].to_sym == :desc ||
70
70
  options[:what].to_sym == :first && options[:order].to_sym == :asc ||
71
71
  mails.reverse!
72
72
  end
73
-
73
+
74
74
  if block_given?
75
75
  mails.each do |mail|
76
76
  new_message = Mail.new(mail.pop)
@@ -86,11 +86,11 @@ module Mail
86
86
  end
87
87
  emails.size == 1 && options[:count] == 1 ? emails.first : emails
88
88
  end
89
-
89
+
90
90
  end
91
91
  end
92
-
93
- # Delete all emails from a POP3 server
92
+
93
+ # Delete all emails from a POP3 server
94
94
  def delete_all
95
95
  start do |pop3|
96
96
  unless pop3.mails.empty?
@@ -108,30 +108,30 @@ module Mail
108
108
  yield pop3
109
109
  end
110
110
  end
111
-
111
+
112
112
  private
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
120
120
  options[:delete_after_find] ||= false
121
121
  options
122
122
  end
123
-
123
+
124
124
  # Start a POP3 session and ensure that it will be closed in any case. Any messages
125
125
  # marked for deletion via #find_and_delete or with the :delete_after_find option
126
126
  # will be deleted when the session is closed.
127
127
  def start(config = Configuration.instance, &block)
128
128
  raise ArgumentError.new("Mail::Retrievable#pop3_start takes a block") unless block_given?
129
-
129
+
130
130
  pop3 = Net::POP3.new(settings[:address], settings[:port], false)
131
131
  pop3.enable_ssl(OpenSSL::SSL::VERIFY_NONE) if settings[:enable_ssl]
132
132
  pop3.read_timeout = settings[:read_timeout] if settings[:read_timeout]
133
133
  pop3.start(settings[:user_name], settings[:password])
134
-
134
+
135
135
  yield pop3
136
136
  ensure
137
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