mail 2.6.1 → 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 (188) hide show
  1. checksums.yaml +5 -5
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +150 -107
  4. data/lib/mail/attachments_list.rb +13 -10
  5. data/lib/mail/body.rb +104 -90
  6. data/lib/mail/check_delivery_params.rb +55 -10
  7. data/lib/mail/configuration.rb +3 -0
  8. data/lib/mail/constants.rb +79 -0
  9. data/lib/mail/elements/address.rb +96 -108
  10. data/lib/mail/elements/address_list.rb +13 -30
  11. data/lib/mail/elements/content_disposition_element.rb +10 -16
  12. data/lib/mail/elements/content_location_element.rb +9 -13
  13. data/lib/mail/elements/content_transfer_encoding_element.rb +7 -11
  14. data/lib/mail/elements/content_type_element.rb +17 -23
  15. data/lib/mail/elements/date_time_element.rb +8 -15
  16. data/lib/mail/elements/envelope_from_element.rb +23 -23
  17. data/lib/mail/elements/message_ids_element.rb +22 -15
  18. data/lib/mail/elements/mime_version_element.rb +8 -15
  19. data/lib/mail/elements/phrase_list.rb +13 -10
  20. data/lib/mail/elements/received_element.rb +28 -19
  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 -92
  31. data/lib/mail/envelope.rb +12 -14
  32. data/lib/mail/field.rb +121 -85
  33. data/lib/mail/field_list.rb +62 -8
  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 +32 -31
  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 +36 -50
  73. data/lib/mail/fields.rb +1 -0
  74. data/lib/mail/header.rb +73 -110
  75. data/lib/mail/indifferent_hash.rb +1 -0
  76. data/lib/mail/mail.rb +6 -11
  77. data/lib/mail/matchers/attachment_matchers.rb +44 -0
  78. data/lib/mail/matchers/has_sent_mail.rb +53 -9
  79. data/lib/mail/message.rb +132 -136
  80. data/lib/mail/multibyte/chars.rb +24 -180
  81. data/lib/mail/multibyte/unicode.rb +31 -26
  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 +9 -11
  85. data/lib/mail/network/delivery_methods/file_delivery.rb +14 -16
  86. data/lib/mail/network/delivery_methods/logger_delivery.rb +34 -0
  87. data/lib/mail/network/delivery_methods/sendmail.rb +68 -24
  88. data/lib/mail/network/delivery_methods/smtp.rb +77 -54
  89. data/lib/mail/network/delivery_methods/smtp_connection.rb +5 -9
  90. data/lib/mail/network/delivery_methods/test_mailer.rb +9 -9
  91. data/lib/mail/network/retriever_methods/base.rb +9 -8
  92. data/lib/mail/network/retriever_methods/imap.rb +21 -7
  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 +33226 -116
  98. data/lib/mail/parsers/address_lists_parser.rl +179 -0
  99. data/lib/mail/parsers/content_disposition_parser.rb +883 -49
  100. data/lib/mail/parsers/content_disposition_parser.rl +89 -0
  101. data/lib/mail/parsers/content_location_parser.rb +810 -23
  102. data/lib/mail/parsers/content_location_parser.rl +78 -0
  103. data/lib/mail/parsers/content_transfer_encoding_parser.rb +510 -21
  104. data/lib/mail/parsers/content_transfer_encoding_parser.rl +71 -0
  105. data/lib/mail/parsers/content_type_parser.rb +1031 -47
  106. data/lib/mail/parsers/content_type_parser.rl +90 -0
  107. data/lib/mail/parsers/date_time_parser.rb +879 -24
  108. data/lib/mail/parsers/date_time_parser.rl +69 -0
  109. data/lib/mail/parsers/envelope_from_parser.rb +3670 -40
  110. data/lib/mail/parsers/envelope_from_parser.rl +89 -0
  111. data/lib/mail/parsers/message_ids_parser.rb +5147 -25
  112. data/lib/mail/parsers/message_ids_parser.rl +93 -0
  113. data/lib/mail/parsers/mime_version_parser.rb +498 -26
  114. data/lib/mail/parsers/mime_version_parser.rl +68 -0
  115. data/lib/mail/parsers/phrase_lists_parser.rb +872 -21
  116. data/lib/mail/parsers/phrase_lists_parser.rl +90 -0
  117. data/lib/mail/parsers/received_parser.rb +8777 -42
  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/{ragel/date_time.rl → rfc5322_date_time.rl} +8 -1
  128. data/lib/mail/parsers/rfc5322_lexical_tokens.rl +60 -0
  129. data/lib/mail/parsers.rb +12 -25
  130. data/lib/mail/part.rb +11 -12
  131. data/lib/mail/parts_list.rb +88 -14
  132. data/lib/mail/smtp_envelope.rb +57 -0
  133. data/lib/mail/utilities.rb +377 -40
  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 +138 -94
  139. data/CHANGELOG.rdoc +0 -752
  140. data/CONTRIBUTING.md +0 -60
  141. data/Dependencies.txt +0 -2
  142. data/Gemfile +0 -15
  143. data/Rakefile +0 -29
  144. data/TODO.rdoc +0 -9
  145. data/VERSION +0 -4
  146. data/lib/mail/core_extensions/nil.rb +0 -19
  147. data/lib/mail/core_extensions/object.rb +0 -13
  148. data/lib/mail/core_extensions/smtp.rb +0 -24
  149. data/lib/mail/core_extensions/string/access.rb +0 -145
  150. data/lib/mail/core_extensions/string/multibyte.rb +0 -78
  151. data/lib/mail/core_extensions/string.rb +0 -43
  152. data/lib/mail/fields/common/address_container.rb +0 -16
  153. data/lib/mail/fields/common/common_address.rb +0 -135
  154. data/lib/mail/fields/common/common_date.rb +0 -35
  155. data/lib/mail/fields/common/common_field.rb +0 -57
  156. data/lib/mail/fields/common/common_message_id.rb +0 -48
  157. data/lib/mail/multibyte/exceptions.rb +0 -8
  158. data/lib/mail/parsers/ragel/common.rl +0 -184
  159. data/lib/mail/parsers/ragel/parser_info.rb +0 -61
  160. data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb +0 -14864
  161. data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb.rl +0 -37
  162. data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb +0 -751
  163. data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb.rl +0 -37
  164. data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb +0 -614
  165. data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb.rl +0 -37
  166. data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb +0 -447
  167. data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb.rl +0 -37
  168. data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb +0 -825
  169. data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb.rl +0 -37
  170. data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb +0 -817
  171. data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb.rl +0 -37
  172. data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb +0 -2129
  173. data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb.rl +0 -37
  174. data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb +0 -1570
  175. data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb.rl +0 -37
  176. data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb +0 -440
  177. data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb.rl +0 -37
  178. data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb +0 -564
  179. data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb.rl +0 -37
  180. data/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl +0 -51
  181. data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb +0 -5144
  182. data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb.rl +0 -37
  183. data/lib/mail/parsers/ragel/ruby/parser.rb.rl.erb +0 -37
  184. data/lib/mail/parsers/ragel/ruby.rb +0 -39
  185. data/lib/mail/parsers/ragel.rb +0 -17
  186. data/lib/mail/patterns.rb +0 -37
  187. data/lib/mail/version_specific/ruby_1_8.rb +0 -119
  188. data/lib/mail/version_specific/ruby_1_9.rb +0 -159
data/CONTRIBUTING.md DELETED
@@ -1,60 +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. Update the CHANGELOG and give yourself credit
18
- 9. With all specs passing push your changes back to your fork
19
- 10. Send me a pull request.
20
- - If it needs any changes, please push or force push to the same branch you made the pull request from. GitHub will just update the pull request with your changes.
21
-
22
- Note, specs that break MRI 1.8.7 or 1.9.3 will not be accepted.
23
-
24
- At this point you're waiting on us. We like to at least comment on, if not
25
- accept, pull requests within three business days (and, typically, one business
26
- day). We may suggest some changes or improvements or alternatives.
27
-
28
- Some things that will increase the chance that your pull request is accepted,
29
- taken straight from the Ruby on Rails guide:
30
-
31
- * Tell me you have tested it against more than one version of Ruby, RVM is great for
32
- this. I test against 7 rubies before I push into master.
33
- * Use good, idiomatic, structured and modular code
34
- * Include tests that fail without your code, and pass with it
35
- * Update the documentation, the surrounding one, examples elsewhere, guides,
36
- whatever is affected by your contribution
37
-
38
- Syntax:
39
-
40
- * Two spaces, no tabs.
41
- * No trailing whitespace. Blank lines should not have any space.
42
- * Prefer &&/|| over and/or.
43
- * MyClass.my_method(my_arg) not my_method( my_arg ) or my_method my_arg.
44
- * a = b and not a=b.
45
- * Follow the conventions you see used in the source already.
46
-
47
- And in case we didn't emphasize it enough: we love specs!
48
-
49
- ### Testing against mime-types versions:
50
-
51
- Use [appraisal](https://github.com/thoughtbot/appraisal) to run against all supported versions of mime-types.
52
-
53
- 1. Run `(bundle check || bundle) && appraisal` so that all the 'appraised' gemfiles are bundled.
54
- 2. Run either `appraisal rake` or `rake appraisal` to run all the tests.
55
-
56
- To run only one 'appraised' gemfile, run. e.g. `BUNDLE_GEMFILE=gemfiles/mime_types_edge.gemfile (bundle check || bundle) && rake`
57
-
58
- To change the appraisals, modify the `Appraisals` file, run `appraisal`, commit the generated gemfiles, and modify the .travis.yml matrix.
59
-
60
- To run on all rubies / gemfiles, just like TravisCI, see [WWTD](https://github.com/grosser/wwtd).
data/Dependencies.txt DELETED
@@ -1,2 +0,0 @@
1
- tlsmail: if ruby < 1.8.6... we could make it optional, or embed it in Mail
2
- mime/types: I think we embed a simplified version, or help maintain it, it is old (2006)
data/Gemfile DELETED
@@ -1,15 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gemspec
4
-
5
- gem "tlsmail", "~> 0.0.1" if RUBY_VERSION <= "1.8.6"
6
- gem "jruby-openssl", :platforms => :jruby
7
-
8
- group :development, :test do
9
- gem "appraisal", "~> 1.0"
10
- end
11
-
12
- # For gems not required to run tests
13
- group :local_development, :test do
14
- gem "ruby-debug", :platforms => :mri_18
15
- end
data/Rakefile DELETED
@@ -1,29 +0,0 @@
1
- if !ENV["APPRAISAL_INITIALIZED"] && !ENV["TRAVIS"]
2
- ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __FILE__)
3
- end
4
- require 'rubygems'
5
- require 'bundler/setup'
6
-
7
- require 'rake/testtask'
8
- require 'rspec/core/rake_task'
9
-
10
- desc "Build a gem file"
11
- task :build do
12
- system "gem build mail.gemspec"
13
- end
14
-
15
- task :default => :spec
16
-
17
- RSpec::Core::RakeTask.new(:spec) do |t|
18
- t.ruby_opts = '-w'
19
- t.rspec_opts = %w(--backtrace --color)
20
- end
21
-
22
- begin
23
- require "appraisal"
24
- rescue LoadError
25
- warn "Appraisal is only available in test/development"
26
- end
27
-
28
- # load custom rake tasks
29
- Dir["#{File.dirname(__FILE__)}/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/VERSION DELETED
@@ -1,4 +0,0 @@
1
- major:2
2
- minor:6
3
- patch:1
4
- build:
@@ -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,43 +0,0 @@
1
- # encoding: utf-8
2
- class String #:nodoc:
3
-
4
- if RUBY_VERSION >= '1.9'
5
- # This 1.9 only regex can save a reasonable amount of time (~20%)
6
- # by not matching "\r\n" so the string is returned unchanged in
7
- # the common case.
8
- CRLF_REGEX = Regexp.new("(?<!\r)\n|\r(?!\n)")
9
- else
10
- CRLF_REGEX = /\n|\r\n|\r/
11
- end
12
-
13
- def to_crlf
14
- to_str.gsub(CRLF_REGEX, "\r\n")
15
- end
16
-
17
- def to_lf
18
- to_str.gsub(/\r\n|\r/, "\n")
19
- end
20
-
21
- unless String.instance_methods(false).map {|m| m.to_sym}.include?(:blank?)
22
- def blank?
23
- self !~ /\S/
24
- end
25
- end
26
-
27
- unless method_defined?(:ascii_only?)
28
- # Backport from Ruby 1.9 checks for non-us-ascii characters.
29
- def ascii_only?
30
- self !~ MATCH_NON_US_ASCII
31
- end
32
-
33
- MATCH_NON_US_ASCII = /[^\x00-\x7f]/
34
- end
35
-
36
- def not_ascii_only?
37
- !ascii_only?
38
- end
39
-
40
- unless method_defined?(:bytesize)
41
- alias :bytesize :length
42
- end
43
- 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,135 +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
- @address_list = 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 address_list
24
- def each
25
- address_list.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 = address_list.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 = address_list.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 = address_list.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 = address_list.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
- address_list.addresses_grouped_by_group
57
- end
58
-
59
- # Returns the addresses that are part of groups
60
- def group_addresses
61
- decoded_group_addresses
62
- end
63
-
64
- # Returns a list of decoded group addresses
65
- def decoded_group_addresses
66
- groups.map { |k,v| v.map { |a| a.decoded } }.flatten
67
- end
68
-
69
- # Returns a list of encoded group addresses
70
- def encoded_group_addresses
71
- groups.map { |k,v| v.map { |a| a.encoded } }.flatten
72
- end
73
-
74
- # Returns the name of all the groups in a string
75
- def group_names # :nodoc:
76
- address_list.group_names
77
- end
78
-
79
- def default
80
- addresses
81
- end
82
-
83
- def <<(val)
84
- case
85
- when val.nil?
86
- raise ArgumentError, "Need to pass an address to <<"
87
- when val.blank?
88
- parse(encoded)
89
- else
90
- self.value = [self.value, val].reject {|a| a.blank? }.join(", ")
91
- end
92
- end
93
-
94
- def value=(val)
95
- super
96
- parse(self.value)
97
- end
98
-
99
- private
100
-
101
- def do_encode(field_name)
102
- return '' if value.blank?
103
- address_array = address_list.addresses.reject { |a| encoded_group_addresses.include?(a.encoded) }.compact.map { |a| a.encoded }
104
- address_text = address_array.join(", \r\n\s")
105
- group_array = groups.map { |k,v| "#{k}: #{v.map { |a| a.encoded }.join(", \r\n\s")};" }
106
- group_text = group_array.join(" \r\n\s")
107
- return_array = [address_text, group_text].reject { |a| a.blank? }
108
- "#{field_name}: #{return_array.join(", \r\n\s")}\r\n"
109
- end
110
-
111
- def do_decode
112
- return nil if value.blank?
113
- address_array = address_list.addresses.reject { |a| decoded_group_addresses.include?(a.decoded) }.map { |a| a.decoded }
114
- address_text = address_array.join(", ")
115
- group_array = groups.map { |k,v| "#{k}: #{v.map { |a| a.decoded }.join(", ")};" }
116
- group_text = group_array.join(" ")
117
- return_array = [address_text, group_text].reject { |a| a.blank? }
118
- return_array.join(", ")
119
- end
120
-
121
- def address_list # :nodoc:
122
- @address_list ||= AddressList.new(value)
123
- end
124
-
125
- def get_group_addresses(group_list)
126
- if group_list.respond_to?(:addresses)
127
- group_list.addresses.map do |address|
128
- Mail::Address.new(address)
129
- end
130
- else
131
- []
132
- end
133
- end
134
- end
135
- end
@@ -1,35 +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
- else
17
- nil
18
- end
19
- end
20
-
21
- private
22
-
23
- def do_encode(field_name)
24
- "#{field_name}: #{value}\r\n"
25
- end
26
-
27
- def do_decode
28
- "#{value}"
29
- end
30
-
31
- def element
32
- @element ||= Mail::DateTimeElement.new(value)
33
- end
34
- end
35
- end
@@ -1,57 +0,0 @@
1
- # encoding: utf-8
2
- module Mail
3
- module CommonField # :nodoc:
4
-
5
- def name=(value)
6
- @name = value
7
- end
8
-
9
- def name
10
- @name ||= nil
11
- end
12
-
13
- def value=(value)
14
- @length = nil
15
- @tree = nil
16
- @element = nil
17
- @value = value
18
- end
19
-
20
- def value
21
- @value
22
- end
23
-
24
- def to_s
25
- decoded.to_s
26
- end
27
-
28
- def default
29
- decoded
30
- end
31
-
32
- def field_length
33
- @length ||= "#{name}: #{encode(decoded)}".length
34
- end
35
-
36
- def responsible_for?( val )
37
- name.to_s.casecmp(val.to_s) == 0
38
- end
39
-
40
- private
41
-
42
- def strip_field(field_name, value)
43
- if value.is_a?(Array)
44
- value
45
- else
46
- value.to_s.sub(/#{field_name}:\s+/i, '')
47
- end
48
- end
49
-
50
- FILENAME_RE = /\b(filename|name)=([^;"\r\n]+\s[^;"\r\n]+)/
51
- def ensure_filename_quoted(value)
52
- if value.is_a?(String)
53
- value.sub! FILENAME_RE, '\1="\2"'
54
- end
55
- end
56
- end
57
- end