mail 2.5.5 → 2.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (191) hide show
  1. checksums.yaml +5 -5
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +170 -108
  4. data/lib/mail/attachments_list.rb +13 -10
  5. data/lib/mail/body.rb +105 -91
  6. data/lib/mail/check_delivery_params.rb +30 -22
  7. data/lib/mail/configuration.rb +3 -0
  8. data/lib/mail/constants.rb +79 -0
  9. data/lib/mail/elements/address.rb +118 -174
  10. data/lib/mail/elements/address_list.rb +16 -56
  11. data/lib/mail/elements/content_disposition_element.rb +12 -22
  12. data/lib/mail/elements/content_location_element.rb +9 -17
  13. data/lib/mail/elements/content_transfer_encoding_element.rb +8 -19
  14. data/lib/mail/elements/content_type_element.rb +20 -30
  15. data/lib/mail/elements/date_time_element.rb +10 -21
  16. data/lib/mail/elements/envelope_from_element.rb +23 -31
  17. data/lib/mail/elements/message_ids_element.rb +22 -20
  18. data/lib/mail/elements/mime_version_element.rb +10 -21
  19. data/lib/mail/elements/phrase_list.rb +13 -15
  20. data/lib/mail/elements/received_element.rb +26 -21
  21. data/lib/mail/elements.rb +1 -0
  22. data/lib/mail/encodings/7bit.rb +10 -14
  23. data/lib/mail/encodings/8bit.rb +5 -18
  24. data/lib/mail/encodings/base64.rb +15 -10
  25. data/lib/mail/encodings/binary.rb +4 -22
  26. data/lib/mail/encodings/identity.rb +24 -0
  27. data/lib/mail/encodings/quoted_printable.rb +13 -7
  28. data/lib/mail/encodings/transfer_encoding.rb +47 -28
  29. data/lib/mail/encodings/unix_to_unix.rb +20 -0
  30. data/lib/mail/encodings.rb +102 -93
  31. data/lib/mail/envelope.rb +12 -19
  32. data/lib/mail/field.rb +143 -71
  33. data/lib/mail/field_list.rb +73 -19
  34. data/lib/mail/fields/bcc_field.rb +42 -48
  35. data/lib/mail/fields/cc_field.rb +29 -50
  36. data/lib/mail/fields/comments_field.rb +28 -37
  37. data/lib/mail/fields/common_address_field.rb +170 -0
  38. data/lib/mail/fields/common_date_field.rb +58 -0
  39. data/lib/mail/fields/common_field.rb +77 -0
  40. data/lib/mail/fields/common_message_id_field.rb +42 -0
  41. data/lib/mail/fields/content_description_field.rb +8 -14
  42. data/lib/mail/fields/content_disposition_field.rb +20 -44
  43. data/lib/mail/fields/content_id_field.rb +25 -51
  44. data/lib/mail/fields/content_location_field.rb +12 -25
  45. data/lib/mail/fields/content_transfer_encoding_field.rb +31 -36
  46. data/lib/mail/fields/content_type_field.rb +51 -80
  47. data/lib/mail/fields/date_field.rb +24 -52
  48. data/lib/mail/fields/from_field.rb +29 -50
  49. data/lib/mail/fields/in_reply_to_field.rb +39 -49
  50. data/lib/mail/fields/keywords_field.rb +19 -32
  51. data/lib/mail/fields/message_id_field.rb +26 -71
  52. data/lib/mail/fields/mime_version_field.rb +20 -30
  53. data/lib/mail/fields/named_structured_field.rb +11 -0
  54. data/lib/mail/fields/named_unstructured_field.rb +11 -0
  55. data/lib/mail/fields/optional_field.rb +10 -7
  56. data/lib/mail/fields/{common/parameter_hash.rb → parameter_hash.rb} +16 -13
  57. data/lib/mail/fields/received_field.rb +44 -57
  58. data/lib/mail/fields/references_field.rb +36 -49
  59. data/lib/mail/fields/reply_to_field.rb +29 -50
  60. data/lib/mail/fields/resent_bcc_field.rb +29 -50
  61. data/lib/mail/fields/resent_cc_field.rb +29 -50
  62. data/lib/mail/fields/resent_date_field.rb +6 -30
  63. data/lib/mail/fields/resent_from_field.rb +29 -50
  64. data/lib/mail/fields/resent_message_id_field.rb +6 -29
  65. data/lib/mail/fields/resent_sender_field.rb +28 -57
  66. data/lib/mail/fields/resent_to_field.rb +29 -50
  67. data/lib/mail/fields/return_path_field.rb +51 -55
  68. data/lib/mail/fields/sender_field.rb +35 -56
  69. data/lib/mail/fields/structured_field.rb +4 -30
  70. data/lib/mail/fields/subject_field.rb +10 -11
  71. data/lib/mail/fields/to_field.rb +29 -50
  72. data/lib/mail/fields/unstructured_field.rb +43 -51
  73. data/lib/mail/fields.rb +1 -0
  74. data/lib/mail/header.rb +78 -129
  75. data/lib/mail/indifferent_hash.rb +1 -0
  76. data/lib/mail/mail.rb +18 -11
  77. data/lib/mail/matchers/attachment_matchers.rb +44 -0
  78. data/lib/mail/matchers/has_sent_mail.rb +81 -4
  79. data/lib/mail/message.rb +142 -139
  80. data/lib/mail/multibyte/chars.rb +24 -180
  81. data/lib/mail/multibyte/unicode.rb +32 -27
  82. data/lib/mail/multibyte/utils.rb +27 -43
  83. data/lib/mail/multibyte.rb +56 -16
  84. data/lib/mail/network/delivery_methods/exim.rb +6 -4
  85. data/lib/mail/network/delivery_methods/file_delivery.rb +12 -10
  86. data/lib/mail/network/delivery_methods/logger_delivery.rb +34 -0
  87. data/lib/mail/network/delivery_methods/sendmail.rb +63 -21
  88. data/lib/mail/network/delivery_methods/smtp.rb +76 -50
  89. data/lib/mail/network/delivery_methods/smtp_connection.rb +4 -4
  90. data/lib/mail/network/delivery_methods/test_mailer.rb +5 -2
  91. data/lib/mail/network/retriever_methods/base.rb +9 -8
  92. data/lib/mail/network/retriever_methods/imap.rb +37 -18
  93. data/lib/mail/network/retriever_methods/pop3.rb +6 -3
  94. data/lib/mail/network/retriever_methods/test_retriever.rb +4 -2
  95. data/lib/mail/network.rb +2 -0
  96. data/lib/mail/parser_tools.rb +15 -0
  97. data/lib/mail/parsers/address_lists_parser.rb +33242 -0
  98. data/lib/mail/parsers/address_lists_parser.rl +179 -0
  99. data/lib/mail/parsers/content_disposition_parser.rb +901 -0
  100. data/lib/mail/parsers/content_disposition_parser.rl +89 -0
  101. data/lib/mail/parsers/content_location_parser.rb +822 -0
  102. data/lib/mail/parsers/content_location_parser.rl +78 -0
  103. data/lib/mail/parsers/content_transfer_encoding_parser.rb +522 -0
  104. data/lib/mail/parsers/content_transfer_encoding_parser.rl +71 -0
  105. data/lib/mail/parsers/content_type_parser.rb +1048 -0
  106. data/lib/mail/parsers/content_type_parser.rl +90 -0
  107. data/lib/mail/parsers/date_time_parser.rb +891 -0
  108. data/lib/mail/parsers/date_time_parser.rl +69 -0
  109. data/lib/mail/parsers/envelope_from_parser.rb +3675 -0
  110. data/lib/mail/parsers/envelope_from_parser.rl +89 -0
  111. data/lib/mail/parsers/message_ids_parser.rb +5161 -0
  112. data/lib/mail/parsers/message_ids_parser.rl +93 -0
  113. data/lib/mail/parsers/mime_version_parser.rb +513 -0
  114. data/lib/mail/parsers/mime_version_parser.rl +68 -0
  115. data/lib/mail/parsers/phrase_lists_parser.rb +884 -0
  116. data/lib/mail/parsers/phrase_lists_parser.rl +90 -0
  117. data/lib/mail/parsers/received_parser.rb +8782 -0
  118. data/lib/mail/parsers/received_parser.rl +91 -0
  119. data/lib/mail/parsers/rfc2045_content_transfer_encoding.rl +13 -0
  120. data/lib/mail/parsers/rfc2045_content_type.rl +25 -0
  121. data/lib/mail/parsers/rfc2045_mime.rl +16 -0
  122. data/lib/mail/parsers/rfc2183_content_disposition.rl +15 -0
  123. data/lib/mail/parsers/rfc3629_utf8.rl +19 -0
  124. data/lib/mail/parsers/rfc5234_abnf_core_rules.rl +22 -0
  125. data/lib/mail/parsers/rfc5322.rl +74 -0
  126. data/lib/mail/parsers/rfc5322_address.rl +72 -0
  127. data/lib/mail/parsers/rfc5322_date_time.rl +37 -0
  128. data/lib/mail/parsers/rfc5322_lexical_tokens.rl +60 -0
  129. data/lib/mail/parsers.rb +13 -0
  130. data/lib/mail/part.rb +11 -12
  131. data/lib/mail/parts_list.rb +90 -14
  132. data/lib/mail/smtp_envelope.rb +57 -0
  133. data/lib/mail/utilities.rb +415 -76
  134. data/lib/mail/values/unicode_tables.dat +0 -0
  135. data/lib/mail/version.rb +8 -15
  136. data/lib/mail/yaml.rb +30 -0
  137. data/lib/mail.rb +9 -32
  138. metadata +127 -79
  139. data/CHANGELOG.rdoc +0 -742
  140. data/CONTRIBUTING.md +0 -45
  141. data/Dependencies.txt +0 -3
  142. data/Gemfile +0 -32
  143. data/Rakefile +0 -21
  144. data/TODO.rdoc +0 -9
  145. data/lib/VERSION +0 -4
  146. data/lib/load_parsers.rb +0 -35
  147. data/lib/mail/core_extensions/nil.rb +0 -19
  148. data/lib/mail/core_extensions/object.rb +0 -13
  149. data/lib/mail/core_extensions/smtp.rb +0 -24
  150. data/lib/mail/core_extensions/string/access.rb +0 -145
  151. data/lib/mail/core_extensions/string/multibyte.rb +0 -78
  152. data/lib/mail/core_extensions/string.rb +0 -33
  153. data/lib/mail/fields/common/address_container.rb +0 -16
  154. data/lib/mail/fields/common/common_address.rb +0 -140
  155. data/lib/mail/fields/common/common_date.rb +0 -42
  156. data/lib/mail/fields/common/common_field.rb +0 -57
  157. data/lib/mail/fields/common/common_message_id.rb +0 -48
  158. data/lib/mail/multibyte/exceptions.rb +0 -8
  159. data/lib/mail/parsers/address_lists.rb +0 -64
  160. data/lib/mail/parsers/address_lists.treetop +0 -19
  161. data/lib/mail/parsers/content_disposition.rb +0 -535
  162. data/lib/mail/parsers/content_disposition.treetop +0 -46
  163. data/lib/mail/parsers/content_location.rb +0 -139
  164. data/lib/mail/parsers/content_location.treetop +0 -20
  165. data/lib/mail/parsers/content_transfer_encoding.rb +0 -201
  166. data/lib/mail/parsers/content_transfer_encoding.treetop +0 -18
  167. data/lib/mail/parsers/content_type.rb +0 -971
  168. data/lib/mail/parsers/content_type.treetop +0 -68
  169. data/lib/mail/parsers/date_time.rb +0 -114
  170. data/lib/mail/parsers/date_time.treetop +0 -11
  171. data/lib/mail/parsers/envelope_from.rb +0 -194
  172. data/lib/mail/parsers/envelope_from.treetop +0 -32
  173. data/lib/mail/parsers/message_ids.rb +0 -45
  174. data/lib/mail/parsers/message_ids.treetop +0 -15
  175. data/lib/mail/parsers/mime_version.rb +0 -144
  176. data/lib/mail/parsers/mime_version.treetop +0 -19
  177. data/lib/mail/parsers/phrase_lists.rb +0 -45
  178. data/lib/mail/parsers/phrase_lists.treetop +0 -15
  179. data/lib/mail/parsers/received.rb +0 -71
  180. data/lib/mail/parsers/received.treetop +0 -11
  181. data/lib/mail/parsers/rfc2045.rb +0 -421
  182. data/lib/mail/parsers/rfc2045.treetop +0 -35
  183. data/lib/mail/parsers/rfc2822.rb +0 -5397
  184. data/lib/mail/parsers/rfc2822.treetop +0 -408
  185. data/lib/mail/parsers/rfc2822_obsolete.rb +0 -3768
  186. data/lib/mail/parsers/rfc2822_obsolete.treetop +0 -241
  187. data/lib/mail/patterns.rb +0 -35
  188. data/lib/mail/version_specific/ruby_1_8.rb +0 -119
  189. data/lib/mail/version_specific/ruby_1_9.rb +0 -147
  190. data/lib/tasks/corpus.rake +0 -125
  191. data/lib/tasks/treetop.rake +0 -10
data/CONTRIBUTING.md DELETED
@@ -1,45 +0,0 @@
1
- Contributing to Mail
2
- ====================
3
-
4
- Hi there, I welcome pull requests! Here are some thoughts on how to get your
5
- pull request merged quickly:
6
-
7
- 1. Check the Reference RFCs, they are in the References directory, so no excuses.
8
- 2. Check for a ticket on GitHub, maybe someone else has the problem too
9
- 3. Make a fork of my GitHub repository
10
- 4. Run the specs. We only take pull requests with passing tests, and it's great
11
- to know that you have a clean slate: `bundle && bundle exec rake`
12
- 5. Add a spec for your change. Only refactoring and documentation changes
13
- require no new specs. If you are adding functionality or fixing a bug, we need
14
- a spec!
15
- 6. Test the spec _at_ _least_ against MRI-1.9.3 and MRI-1.8.7
16
- 7. Update the README if needed to reflect your change / addition
17
- 8. With all specs passing push your changes back to your fork
18
- 9. Send me a pull request
19
-
20
- Note, specs that break MRI 1.8.7 or 1.9.3 will not be accepted.
21
-
22
- At this point you're waiting on us. We like to at least comment on, if not
23
- accept, pull requests within three business days (and, typically, one business
24
- day). We may suggest some changes or improvements or alternatives.
25
-
26
- Some things that will increase the chance that your pull request is accepted,
27
- taken straight from the Ruby on Rails guide:
28
-
29
- * Tell me you have tested it against more than one version of Ruby, RVM is great for
30
- this. I test against 7 rubies before I push into master.
31
- * Use good, idiomatic, structured and modular code
32
- * Include tests that fail without your code, and pass with it
33
- * Update the documentation, the surrounding one, examples elsewhere, guides,
34
- whatever is affected by your contribution
35
-
36
- Syntax:
37
-
38
- * Two spaces, no tabs.
39
- * No trailing whitespace. Blank lines should not have any space.
40
- * Prefer &&/|| over and/or.
41
- * MyClass.my_method(my_arg) not my_method( my_arg ) or my_method my_arg.
42
- * a = b and not a=b.
43
- * Follow the conventions you see used in the source already.
44
-
45
- And in case we didn't emphasize it enough: we love specs!
data/Dependencies.txt DELETED
@@ -1,3 +0,0 @@
1
- treetop: we need to include this in the gem spec
2
- tlsmail: if ruby < 1.8.6... we could make it optional, or embed it in Mail
3
- mime/types: I think we embed a simplified version, or help maintain it, it is old (2006)
data/Gemfile DELETED
@@ -1,32 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gemspec
4
-
5
- if RUBY_VERSION < '1.9.3'
6
- gem 'activesupport', '< 4'
7
- elsif RUBY_VERSION < '2.2.2'
8
- gem 'activesupport', '< 5'
9
- end
10
- gem 'i18n', '< 0.7.0' if RUBY_VERSION < '1.9.3'
11
- gem "tlsmail" if RUBY_VERSION <= '1.8.6'
12
- gem "mime-types", "~> 1.16"
13
- gem "treetop", "~> 1.4.10"
14
-
15
- gem 'jruby-openssl', :platform => :jruby
16
-
17
- # For gems not required to run tests
18
- group :local_development, :test do
19
- gem 'rake', '> 0.8.7', '< 11.0.1'
20
- gem 'rdoc', '< 4.3' if RUBY_VERSION < '1.9.3'
21
- gem "rspec", "~> 2.8.0"
22
- case
23
- when defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
24
- # Skip it
25
- when RUBY_PLATFORM == 'java'
26
- # Skip it
27
- when RUBY_VERSION < '1.9'
28
- gem "ruby-debug"
29
- else
30
- # Skip it
31
- end
32
- end
data/Rakefile DELETED
@@ -1,21 +0,0 @@
1
- ENV['BUNDLE_GEMFILE'] = File.expand_path('../Gemfile', __FILE__)
2
- require 'rubygems'
3
- require 'bundler/setup'
4
-
5
- require 'rake/testtask'
6
- require 'rspec/core/rake_task'
7
-
8
- desc "Build a gem file"
9
- task :build do
10
- system "gem build mail.gemspec"
11
- end
12
-
13
- task :default => :spec
14
-
15
- RSpec::Core::RakeTask.new(:spec) do |t|
16
- t.ruby_opts = '-w'
17
- t.rspec_opts = %w(--backtrace --color)
18
- end
19
-
20
- # load custom rake tasks
21
- Dir["#{File.dirname(__FILE__)}/lib/tasks/**/*.rake"].sort.each { |ext| load ext }
data/TODO.rdoc DELETED
@@ -1,9 +0,0 @@
1
- == Not really in any order:
2
-
3
- * Add multibyte handling to fields, if they get a multibyte string, try encoding it into
4
- UTF-8 B first, if this fails, throw an error.
5
-
6
- * Cleanup the treetop parsers......... do I _really_ need that many entrance files?
7
-
8
- * Simplify the relationship of Headers and Fields. Doing too much of the Field work
9
- in the Header class on instantiating fields. Header should just say "Field, do it!"
data/lib/VERSION DELETED
@@ -1,4 +0,0 @@
1
- major:2
2
- minor:5
3
- patch:5
4
- build:
data/lib/load_parsers.rb DELETED
@@ -1,35 +0,0 @@
1
- # encoding: utf-8
2
- # This file loads up the parsers for mail to use. It also will attempt to compile parsers
3
- # if they don't exist.
4
- #
5
- # It also only uses the compiler if we are running the SPEC suite
6
- module Mail # :doc:
7
- require 'treetop/runtime'
8
-
9
- def self.compile_parser(parser)
10
- require 'treetop/compiler'
11
- Treetop.load(File.join(File.dirname(__FILE__)) + "/mail/parsers/#{parser}")
12
- end
13
-
14
- parsers = %w[ rfc2822_obsolete rfc2822 address_lists phrase_lists
15
- date_time received message_ids envelope_from rfc2045
16
- mime_version content_type content_disposition
17
- content_transfer_encoding content_location ]
18
-
19
- if defined?(MAIL_SPEC_SUITE_RUNNING)
20
- parsers.each do |parser|
21
- compile_parser(parser)
22
- end
23
-
24
- else
25
- parsers.each do |parser|
26
- begin
27
- require "mail/parsers/#{parser}"
28
- rescue LoadError
29
- compile_parser(parser)
30
- end
31
- end
32
-
33
- end
34
-
35
- end
@@ -1,19 +0,0 @@
1
- # encoding: utf-8
2
-
3
- # This is not loaded if ActiveSupport is already loaded
4
-
5
- class NilClass #:nodoc:
6
- unless nil.respond_to? :blank?
7
- def blank?
8
- true
9
- end
10
- end
11
-
12
- def to_crlf
13
- ''
14
- end
15
-
16
- def to_lf
17
- ''
18
- end
19
- end
@@ -1,13 +0,0 @@
1
- # encoding: utf-8
2
-
3
- unless Object.method_defined? :blank?
4
- class Object
5
- def blank?
6
- if respond_to?(:empty?)
7
- empty?
8
- else
9
- !self
10
- end
11
- end
12
- end
13
- end
@@ -1,24 +0,0 @@
1
- # encoding: utf-8
2
- module Net
3
- class SMTP
4
- # This is a backport of r30294 from ruby trunk because of a bug in net/smtp.
5
- # http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&amp;revision=30294
6
- #
7
- # Fixed in what will be Ruby 1.9.3 - tlsconnect also does not exist in some early versions of ruby
8
- begin
9
- alias_method :original_tlsconnect, :tlsconnect
10
-
11
- def tlsconnect(s)
12
- verified = false
13
- begin
14
- original_tlsconnect(s).tap { verified = true }
15
- ensure
16
- unless verified
17
- s.close rescue nil
18
- end
19
- end
20
- end
21
- rescue NameError
22
- end
23
- end
24
- end
@@ -1,145 +0,0 @@
1
- # encoding: utf-8
2
-
3
- # This is not loaded if ActiveSupport is already loaded
4
-
5
- # This is an almost cut and paste from ActiveSupport v3.0.6, copied in here so that Mail
6
- # itself does not depend on ActiveSupport to avoid versioning conflicts
7
-
8
- class String
9
- unless '1.9'.respond_to?(:force_encoding)
10
- # Returns the character at the +position+ treating the string as an array (where 0 is the first character).
11
- #
12
- # Examples:
13
- # "hello".at(0) # => "h"
14
- # "hello".at(4) # => "o"
15
- # "hello".at(10) # => ERROR if < 1.9, nil in 1.9
16
- def at(position)
17
- mb_chars[position, 1].to_s
18
- end
19
-
20
- # Returns the remaining of the string from the +position+ treating the string as an array (where 0 is the first character).
21
- #
22
- # Examples:
23
- # "hello".from(0) # => "hello"
24
- # "hello".from(2) # => "llo"
25
- # "hello".from(10) # => "" if < 1.9, nil in 1.9
26
- def from(position)
27
- mb_chars[position..-1].to_s
28
- end
29
-
30
- # Returns the beginning of the string up to the +position+ treating the string as an array (where 0 is the first character).
31
- #
32
- # Examples:
33
- # "hello".to(0) # => "h"
34
- # "hello".to(2) # => "hel"
35
- # "hello".to(10) # => "hello"
36
- def to(position)
37
- mb_chars[0..position].to_s
38
- end
39
-
40
- # Returns the first character of the string or the first +limit+ characters.
41
- #
42
- # Examples:
43
- # "hello".first # => "h"
44
- # "hello".first(2) # => "he"
45
- # "hello".first(10) # => "hello"
46
- def first(limit = 1)
47
- if limit == 0
48
- ''
49
- elsif limit >= size
50
- self
51
- else
52
- mb_chars[0...limit].to_s
53
- end
54
- end
55
-
56
- # Returns the last character of the string or the last +limit+ characters.
57
- #
58
- # Examples:
59
- # "hello".last # => "o"
60
- # "hello".last(2) # => "lo"
61
- # "hello".last(10) # => "hello"
62
- def last(limit = 1)
63
- if limit == 0
64
- ''
65
- elsif limit >= size
66
- self
67
- else
68
- mb_chars[(-limit)..-1].to_s
69
- end
70
- end
71
- else
72
- def at(position)
73
- self[position]
74
- end
75
-
76
- def from(position)
77
- self[position..-1]
78
- end
79
-
80
- def to(position)
81
- self[0..position]
82
- end
83
-
84
- def first(limit = 1)
85
- if limit == 0
86
- ''
87
- elsif limit >= size
88
- self
89
- else
90
- to(limit - 1)
91
- end
92
- end
93
-
94
- def last(limit = 1)
95
- if limit == 0
96
- ''
97
- elsif limit >= size
98
- self
99
- else
100
- from(-limit)
101
- end
102
- end
103
- end
104
-
105
- if Module.method(:const_get).arity == 1
106
- # Tries to find a constant with the name specified in the argument string:
107
- #
108
- # "Module".constantize # => Module
109
- # "Test::Unit".constantize # => Test::Unit
110
- #
111
- # The name is assumed to be the one of a top-level constant, no matter whether
112
- # it starts with "::" or not. No lexical context is taken into account:
113
- #
114
- # C = 'outside'
115
- # module M
116
- # C = 'inside'
117
- # C # => 'inside'
118
- # "C".constantize # => 'outside', same as ::C
119
- # end
120
- #
121
- # NameError is raised when the name is not in CamelCase or the constant is
122
- # unknown.
123
- def constantize
124
- names = self.split('::')
125
- names.shift if names.empty? || names.first.empty?
126
-
127
- constant = Object
128
- names.each do |name|
129
- constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
130
- end
131
- constant
132
- end
133
- else
134
- def constantize #:nodoc:
135
- names = self.split('::')
136
- names.shift if names.empty? || names.first.empty?
137
-
138
- constant = Object
139
- names.each do |name|
140
- constant = constant.const_defined?(name, false) ? constant.const_get(name) : constant.const_missing(name)
141
- end
142
- constant
143
- end
144
- end
145
- end
@@ -1,78 +0,0 @@
1
- # encoding: utf-8
2
-
3
- # This is not loaded if ActiveSupport is already loaded
4
-
5
- # This is an almost cut and paste from ActiveSupport v3.0.6, copied in here so that Mail
6
- # itself does not depend on ActiveSupport to avoid versioning conflicts
7
-
8
- require 'mail/multibyte'
9
-
10
- class String
11
- if RUBY_VERSION >= "1.9"
12
- # == Multibyte proxy
13
- #
14
- # +mb_chars+ is a multibyte safe proxy for string methods.
15
- #
16
- # In Ruby 1.8 and older it creates and returns an instance of the Mail::Multibyte::Chars class which
17
- # encapsulates the original string. A Unicode safe version of all the String methods are defined on this proxy
18
- # class. If the proxy class doesn't respond to a certain method, it's forwarded to the encapsuled string.
19
- #
20
- # name = 'Claus Müller'
21
- # name.reverse # => "rell??M sualC"
22
- # name.length # => 13
23
- #
24
- # name.mb_chars.reverse.to_s # => "rellüM sualC"
25
- # name.mb_chars.length # => 12
26
- #
27
- # In Ruby 1.9 and newer +mb_chars+ returns +self+ because String is (mostly) encoding aware. This means that
28
- # it becomes easy to run one version of your code on multiple Ruby versions.
29
- #
30
- # == Method chaining
31
- #
32
- # All the methods on the Chars proxy which normally return a string will return a Chars object. This allows
33
- # method chaining on the result of any of these methods.
34
- #
35
- # name.mb_chars.reverse.length # => 12
36
- #
37
- # == Interoperability and configuration
38
- #
39
- # The Chars object tries to be as interchangeable with String objects as possible: sorting and comparing between
40
- # String and Char work like expected. The bang! methods change the internal string representation in the Chars
41
- # object. Interoperability problems can be resolved easily with a +to_s+ call.
42
- #
43
- # For more information about the methods defined on the Chars proxy see Mail::Multibyte::Chars. For
44
- # information about how to change the default Multibyte behaviour see Mail::Multibyte.
45
- def mb_chars
46
- if Mail::Multibyte.proxy_class.consumes?(self)
47
- Mail::Multibyte.proxy_class.new(self)
48
- else
49
- self
50
- end
51
- end
52
-
53
- def is_utf8? #:nodoc
54
- case encoding
55
- when Encoding::UTF_8
56
- valid_encoding?
57
- when Encoding::ASCII_8BIT, Encoding::US_ASCII
58
- dup.force_encoding(Encoding::UTF_8).valid_encoding?
59
- else
60
- false
61
- end
62
- end
63
- else
64
- def mb_chars
65
- if Mail::Multibyte.proxy_class.wants?(self)
66
- Mail::Multibyte.proxy_class.new(self)
67
- else
68
- self
69
- end
70
- end
71
-
72
- # Returns true if the string has UTF-8 semantics (a String used for purely byte resources is unlikely to have
73
- # them), returns false otherwise.
74
- def is_utf8?
75
- Mail::Multibyte::Chars.consumes?(self)
76
- end
77
- end
78
- end
@@ -1,33 +0,0 @@
1
- # encoding: utf-8
2
- class String #:nodoc:
3
- def to_crlf
4
- to_str.gsub(/\n|\r\n|\r/) { "\r\n" }
5
- end
6
-
7
- def to_lf
8
- to_str.gsub(/\n|\r\n|\r/) { "\n" }
9
- end
10
-
11
- unless String.instance_methods(false).map {|m| m.to_sym}.include?(:blank?)
12
- def blank?
13
- self !~ /\S/
14
- end
15
- end
16
-
17
- unless method_defined?(:ascii_only?)
18
- # Backport from Ruby 1.9 checks for non-us-ascii characters.
19
- def ascii_only?
20
- self !~ MATCH_NON_US_ASCII
21
- end
22
-
23
- MATCH_NON_US_ASCII = /[^\x00-\x7f]/
24
- end
25
-
26
- def not_ascii_only?
27
- !ascii_only?
28
- end
29
-
30
- unless method_defined?(:bytesize)
31
- alias :bytesize :length
32
- end
33
- end
@@ -1,16 +0,0 @@
1
- module Mail
2
-
3
- class AddressContainer < Array
4
-
5
- def initialize(field, list = [])
6
- @field = field
7
- super(list)
8
- end
9
-
10
- def << (address)
11
- @field << address
12
- end
13
-
14
- end
15
-
16
- end
@@ -1,140 +0,0 @@
1
- # encoding: utf-8
2
- require 'mail/fields/common/address_container'
3
-
4
- module Mail
5
- module CommonAddress # :nodoc:
6
-
7
- def parse(val = value)
8
- unless val.blank?
9
- @tree = AddressList.new(encode_if_needed(val))
10
- else
11
- nil
12
- end
13
- end
14
-
15
- def charset
16
- @charset
17
- end
18
-
19
- def encode_if_needed(val)
20
- Encodings.address_encode(val, charset)
21
- end
22
-
23
- # Allows you to iterate through each address object in the syntax tree
24
- def each
25
- tree.addresses.each do |address|
26
- yield(address)
27
- end
28
- end
29
-
30
- # Returns the address string of all the addresses in the address list
31
- def addresses
32
- list = tree.addresses.map { |a| a.address }
33
- Mail::AddressContainer.new(self, list)
34
- end
35
-
36
- # Returns the formatted string of all the addresses in the address list
37
- def formatted
38
- list = tree.addresses.map { |a| a.format }
39
- Mail::AddressContainer.new(self, list)
40
- end
41
-
42
- # Returns the display name of all the addresses in the address list
43
- def display_names
44
- list = tree.addresses.map { |a| a.display_name }
45
- Mail::AddressContainer.new(self, list)
46
- end
47
-
48
- # Returns the actual address objects in the address list
49
- def addrs
50
- list = tree.addresses
51
- Mail::AddressContainer.new(self, list)
52
- end
53
-
54
- # Returns a hash of group name => address strings for the address list
55
- def groups
56
- @groups = Hash.new
57
- tree.group_recipients.each do |group|
58
- @groups[group.group_name.text_value.to_str] = get_group_addresses(group.group_list)
59
- end
60
- @groups
61
- end
62
-
63
- # Returns the addresses that are part of groups
64
- def group_addresses
65
- decoded_group_addresses
66
- end
67
-
68
- # Returns a list of decoded group addresses
69
- def decoded_group_addresses
70
- groups.map { |k,v| v.map { |a| a.decoded } }.flatten
71
- end
72
-
73
- # Returns a list of encoded group addresses
74
- def encoded_group_addresses
75
- groups.map { |k,v| v.map { |a| a.encoded } }.flatten
76
- end
77
-
78
- # Returns the name of all the groups in a string
79
- def group_names # :nodoc:
80
- tree.group_names
81
- end
82
-
83
- def default
84
- addresses
85
- end
86
-
87
- def <<(val)
88
- case
89
- when val.nil?
90
- raise ArgumentError, "Need to pass an address to <<"
91
- when val.blank?
92
- parse(encoded)
93
- else
94
- self.value = [self.value, val].reject {|a| a.blank? }.join(", ")
95
- end
96
- end
97
-
98
- def value=(val)
99
- super
100
- parse(self.value)
101
- end
102
-
103
- private
104
-
105
- def do_encode(field_name)
106
- return '' if value.blank?
107
- address_array = tree.addresses.reject { |a| encoded_group_addresses.include?(a.encoded) }.compact.map { |a| a.encoded }
108
- address_text = address_array.join(", \r\n\s")
109
- group_array = groups.map { |k,v| "#{k}: #{v.map { |a| a.encoded }.join(", \r\n\s")};" }
110
- group_text = group_array.join(" \r\n\s")
111
- return_array = [address_text, group_text].reject { |a| a.blank? }
112
- "#{field_name}: #{return_array.join(", \r\n\s")}\r\n"
113
- end
114
-
115
- def do_decode
116
- return nil if value.blank?
117
- address_array = tree.addresses.reject { |a| decoded_group_addresses.include?(a.decoded) }.map { |a| a.decoded }
118
- address_text = address_array.join(", ")
119
- group_array = groups.map { |k,v| "#{k}: #{v.map { |a| a.decoded }.join(", ")};" }
120
- group_text = group_array.join(" ")
121
- return_array = [address_text, group_text].reject { |a| a.blank? }
122
- return_array.join(", ")
123
- end
124
-
125
- # Returns the syntax tree of the Addresses
126
- def tree # :nodoc:
127
- @tree ||= AddressList.new(value)
128
- end
129
-
130
- def get_group_addresses(group_list)
131
- if group_list.respond_to?(:addresses)
132
- group_list.addresses.map do |address_tree|
133
- Mail::Address.new(address_tree)
134
- end
135
- else
136
- []
137
- end
138
- end
139
- end
140
- end
@@ -1,42 +0,0 @@
1
- # encoding: utf-8
2
- module Mail
3
- module CommonDate # :nodoc:
4
- # Returns a date time object of the parsed date
5
- def date_time
6
- ::DateTime.parse("#{element.date_string} #{element.time_string}")
7
- end
8
-
9
- def default
10
- date_time
11
- end
12
-
13
- def parse(val = value)
14
- unless val.blank?
15
- @element = Mail::DateTimeElement.new(val)
16
- @tree = @element.tree
17
- else
18
- nil
19
- end
20
- end
21
-
22
- private
23
-
24
- def do_encode(field_name)
25
- "#{field_name}: #{value}\r\n"
26
- end
27
-
28
- def do_decode
29
- "#{value}"
30
- end
31
-
32
- def element
33
- @element ||= Mail::DateTimeElement.new(value)
34
- end
35
-
36
- # Returns the syntax tree of the Date
37
- def tree
38
- @tree ||= element.tree
39
- end
40
-
41
- end
42
- end