mail 2.5.5 → 2.8.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 (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