mail 2.6.4 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +111 -118
  3. data/lib/mail/attachments_list.rb +11 -10
  4. data/lib/mail/body.rb +73 -84
  5. data/lib/mail/check_delivery_params.rb +54 -10
  6. data/lib/mail/configuration.rb +2 -0
  7. data/lib/mail/constants.rb +27 -5
  8. data/lib/mail/elements/address.rb +61 -50
  9. data/lib/mail/elements/address_list.rb +11 -19
  10. data/lib/mail/elements/content_disposition_element.rb +9 -16
  11. data/lib/mail/elements/content_location_element.rb +6 -11
  12. data/lib/mail/elements/content_transfer_encoding_element.rb +6 -11
  13. data/lib/mail/elements/content_type_element.rb +16 -23
  14. data/lib/mail/elements/date_time_element.rb +7 -15
  15. data/lib/mail/elements/envelope_from_element.rb +22 -23
  16. data/lib/mail/elements/message_ids_element.rb +18 -13
  17. data/lib/mail/elements/mime_version_element.rb +7 -15
  18. data/lib/mail/elements/phrase_list.rb +12 -10
  19. data/lib/mail/elements/received_element.rb +27 -19
  20. data/lib/mail/encodings/7bit.rb +9 -14
  21. data/lib/mail/encodings/8bit.rb +2 -21
  22. data/lib/mail/encodings/base64.rb +11 -12
  23. data/lib/mail/encodings/binary.rb +3 -22
  24. data/lib/mail/encodings/identity.rb +24 -0
  25. data/lib/mail/encodings/quoted_printable.rb +6 -6
  26. data/lib/mail/encodings/transfer_encoding.rb +38 -29
  27. data/lib/mail/encodings/unix_to_unix.rb +3 -1
  28. data/lib/mail/encodings.rb +81 -54
  29. data/lib/mail/envelope.rb +11 -14
  30. data/lib/mail/field.rb +119 -98
  31. data/lib/mail/field_list.rb +60 -7
  32. data/lib/mail/fields/bcc_field.rb +34 -52
  33. data/lib/mail/fields/cc_field.rb +28 -49
  34. data/lib/mail/fields/comments_field.rb +27 -37
  35. data/lib/mail/fields/common_address_field.rb +170 -0
  36. data/lib/mail/fields/common_date_field.rb +58 -0
  37. data/lib/mail/fields/common_field.rb +77 -0
  38. data/lib/mail/fields/common_message_id_field.rb +42 -0
  39. data/lib/mail/fields/content_description_field.rb +7 -14
  40. data/lib/mail/fields/content_disposition_field.rb +13 -38
  41. data/lib/mail/fields/content_id_field.rb +24 -51
  42. data/lib/mail/fields/content_location_field.rb +11 -25
  43. data/lib/mail/fields/content_transfer_encoding_field.rb +31 -31
  44. data/lib/mail/fields/content_type_field.rb +50 -80
  45. data/lib/mail/fields/date_field.rb +23 -52
  46. data/lib/mail/fields/from_field.rb +28 -49
  47. data/lib/mail/fields/in_reply_to_field.rb +38 -49
  48. data/lib/mail/fields/keywords_field.rb +18 -31
  49. data/lib/mail/fields/message_id_field.rb +25 -71
  50. data/lib/mail/fields/mime_version_field.rb +19 -30
  51. data/lib/mail/fields/named_structured_field.rb +11 -0
  52. data/lib/mail/fields/named_unstructured_field.rb +11 -0
  53. data/lib/mail/fields/optional_field.rb +9 -7
  54. data/lib/mail/fields/{common/parameter_hash.rb → parameter_hash.rb} +13 -11
  55. data/lib/mail/fields/received_field.rb +43 -57
  56. data/lib/mail/fields/references_field.rb +35 -49
  57. data/lib/mail/fields/reply_to_field.rb +28 -49
  58. data/lib/mail/fields/resent_bcc_field.rb +28 -49
  59. data/lib/mail/fields/resent_cc_field.rb +28 -49
  60. data/lib/mail/fields/resent_date_field.rb +5 -30
  61. data/lib/mail/fields/resent_from_field.rb +28 -49
  62. data/lib/mail/fields/resent_message_id_field.rb +5 -29
  63. data/lib/mail/fields/resent_sender_field.rb +27 -56
  64. data/lib/mail/fields/resent_to_field.rb +28 -49
  65. data/lib/mail/fields/return_path_field.rb +50 -54
  66. data/lib/mail/fields/sender_field.rb +34 -55
  67. data/lib/mail/fields/structured_field.rb +3 -30
  68. data/lib/mail/fields/subject_field.rb +9 -11
  69. data/lib/mail/fields/to_field.rb +28 -49
  70. data/lib/mail/fields/unstructured_field.rb +32 -47
  71. data/lib/mail/header.rb +71 -110
  72. data/lib/mail/mail.rb +2 -10
  73. data/lib/mail/matchers/attachment_matchers.rb +15 -0
  74. data/lib/mail/matchers/has_sent_mail.rb +21 -1
  75. data/lib/mail/message.rb +113 -117
  76. data/lib/mail/multibyte/chars.rb +23 -180
  77. data/lib/mail/multibyte/unicode.rb +10 -10
  78. data/lib/mail/multibyte/utils.rb +26 -43
  79. data/lib/mail/multibyte.rb +55 -16
  80. data/lib/mail/network/delivery_methods/exim.rb +8 -11
  81. data/lib/mail/network/delivery_methods/file_delivery.rb +13 -16
  82. data/lib/mail/network/delivery_methods/logger_delivery.rb +34 -0
  83. data/lib/mail/network/delivery_methods/sendmail.rb +32 -35
  84. data/lib/mail/network/delivery_methods/smtp.rb +76 -54
  85. data/lib/mail/network/delivery_methods/smtp_connection.rb +4 -9
  86. data/lib/mail/network/delivery_methods/test_mailer.rb +8 -9
  87. data/lib/mail/network/retriever_methods/base.rb +8 -8
  88. data/lib/mail/network/retriever_methods/imap.rb +20 -7
  89. data/lib/mail/network/retriever_methods/pop3.rb +5 -3
  90. data/lib/mail/network/retriever_methods/test_retriever.rb +3 -2
  91. data/lib/mail/network.rb +1 -0
  92. data/lib/mail/parser_tools.rb +15 -0
  93. data/lib/mail/parsers/address_lists_parser.rb +33225 -116
  94. data/lib/mail/parsers/address_lists_parser.rl +179 -0
  95. data/lib/mail/parsers/content_disposition_parser.rb +882 -49
  96. data/lib/mail/parsers/content_disposition_parser.rl +89 -0
  97. data/lib/mail/parsers/content_location_parser.rb +809 -23
  98. data/lib/mail/parsers/content_location_parser.rl +78 -0
  99. data/lib/mail/parsers/content_transfer_encoding_parser.rb +509 -21
  100. data/lib/mail/parsers/content_transfer_encoding_parser.rl +71 -0
  101. data/lib/mail/parsers/content_type_parser.rb +1037 -56
  102. data/lib/mail/parsers/content_type_parser.rl +90 -0
  103. data/lib/mail/parsers/date_time_parser.rb +877 -25
  104. data/lib/mail/parsers/date_time_parser.rl +69 -0
  105. data/lib/mail/parsers/envelope_from_parser.rb +3669 -40
  106. data/lib/mail/parsers/envelope_from_parser.rl +89 -0
  107. data/lib/mail/parsers/message_ids_parser.rb +5146 -25
  108. data/lib/mail/parsers/message_ids_parser.rl +93 -0
  109. data/lib/mail/parsers/mime_version_parser.rb +497 -26
  110. data/lib/mail/parsers/mime_version_parser.rl +68 -0
  111. data/lib/mail/parsers/phrase_lists_parser.rb +870 -22
  112. data/lib/mail/parsers/phrase_lists_parser.rl +90 -0
  113. data/lib/mail/parsers/received_parser.rb +8776 -43
  114. data/lib/mail/parsers/received_parser.rl +91 -0
  115. data/lib/mail/parsers/rfc2045_content_transfer_encoding.rl +13 -0
  116. data/lib/mail/parsers/rfc2045_content_type.rl +25 -0
  117. data/lib/mail/parsers/rfc2045_mime.rl +16 -0
  118. data/lib/mail/parsers/rfc2183_content_disposition.rl +15 -0
  119. data/lib/mail/parsers/rfc3629_utf8.rl +19 -0
  120. data/lib/mail/parsers/rfc5234_abnf_core_rules.rl +22 -0
  121. data/lib/mail/parsers/rfc5322.rl +74 -0
  122. data/lib/mail/parsers/rfc5322_address.rl +72 -0
  123. data/lib/mail/parsers/{ragel/date_time.rl → rfc5322_date_time.rl} +8 -1
  124. data/lib/mail/parsers/rfc5322_lexical_tokens.rl +60 -0
  125. data/lib/mail/parsers.rb +11 -25
  126. data/lib/mail/part.rb +6 -10
  127. data/lib/mail/parts_list.rb +62 -6
  128. data/lib/mail/smtp_envelope.rb +57 -0
  129. data/lib/mail/utilities.rb +357 -74
  130. data/lib/mail/version.rb +2 -2
  131. data/lib/mail/yaml.rb +30 -0
  132. data/lib/mail.rb +5 -35
  133. metadata +111 -66
  134. data/CHANGELOG.rdoc +0 -787
  135. data/CONTRIBUTING.md +0 -60
  136. data/Dependencies.txt +0 -2
  137. data/Gemfile +0 -11
  138. data/Rakefile +0 -29
  139. data/TODO.rdoc +0 -9
  140. data/lib/mail/core_extensions/smtp.rb +0 -25
  141. data/lib/mail/core_extensions/string/access.rb +0 -146
  142. data/lib/mail/core_extensions/string/multibyte.rb +0 -79
  143. data/lib/mail/core_extensions/string.rb +0 -21
  144. data/lib/mail/fields/common/address_container.rb +0 -17
  145. data/lib/mail/fields/common/common_address.rb +0 -136
  146. data/lib/mail/fields/common/common_date.rb +0 -36
  147. data/lib/mail/fields/common/common_field.rb +0 -61
  148. data/lib/mail/fields/common/common_message_id.rb +0 -49
  149. data/lib/mail/multibyte/exceptions.rb +0 -9
  150. data/lib/mail/parsers/ragel/common.rl +0 -185
  151. data/lib/mail/parsers/ragel/parser_info.rb +0 -61
  152. data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb +0 -14864
  153. data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb.rl +0 -37
  154. data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb +0 -751
  155. data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb.rl +0 -37
  156. data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb +0 -614
  157. data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb.rl +0 -37
  158. data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb +0 -447
  159. data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb.rl +0 -37
  160. data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb +0 -825
  161. data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb.rl +0 -37
  162. data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb +0 -817
  163. data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb.rl +0 -37
  164. data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb +0 -2149
  165. data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb.rl +0 -37
  166. data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb +0 -1570
  167. data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb.rl +0 -37
  168. data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb +0 -440
  169. data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb.rl +0 -37
  170. data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb +0 -564
  171. data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb.rl +0 -37
  172. data/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl +0 -51
  173. data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb +0 -5144
  174. data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb.rl +0 -37
  175. data/lib/mail/parsers/ragel/ruby/parser.rb.rl.erb +0 -37
  176. data/lib/mail/parsers/ragel/ruby.rb +0 -40
  177. data/lib/mail/parsers/ragel.rb +0 -18
  178. data/lib/mail/version_specific/ruby_1_8.rb +0 -126
  179. data/lib/mail/version_specific/ruby_1_9.rb +0 -223
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,11 +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
- # For gems not required to run tests
9
- group :local_development, :test do
10
- gem "appraisal", "~> 1.0" unless RUBY_VERSION <= "1.8.7"
11
- 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, SyntaxError
25
- warn "Appraisal is only available in test/development on Ruby 1.9+"
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!"
@@ -1,25 +0,0 @@
1
- # encoding: utf-8
2
- # frozen_string_literal: true
3
- module Net
4
- class SMTP
5
- # This is a backport of r30294 from ruby trunk because of a bug in net/smtp.
6
- # http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&amp;revision=30294
7
- #
8
- # Fixed in what will be Ruby 1.9.3 - tlsconnect also does not exist in some early versions of ruby
9
- begin
10
- alias_method :original_tlsconnect, :tlsconnect
11
-
12
- def tlsconnect(s)
13
- verified = false
14
- begin
15
- original_tlsconnect(s).tap { verified = true }
16
- ensure
17
- unless verified
18
- s.close rescue nil
19
- end
20
- end
21
- end
22
- rescue NameError
23
- end
24
- end
25
- end
@@ -1,146 +0,0 @@
1
- # encoding: utf-8
2
- # frozen_string_literal: true
3
-
4
- # This is not loaded if ActiveSupport is already loaded
5
-
6
- # This is an almost cut and paste from ActiveSupport v3.0.6, copied in here so that Mail
7
- # itself does not depend on ActiveSupport to avoid versioning conflicts
8
-
9
- class String
10
- unless '1.9'.respond_to?(:force_encoding)
11
- # Returns the character at the +position+ treating the string as an array (where 0 is the first character).
12
- #
13
- # Examples:
14
- # "hello".at(0) # => "h"
15
- # "hello".at(4) # => "o"
16
- # "hello".at(10) # => ERROR if < 1.9, nil in 1.9
17
- def at(position)
18
- mb_chars[position, 1].to_s
19
- end
20
-
21
- # Returns the remaining of the string from the +position+ treating the string as an array (where 0 is the first character).
22
- #
23
- # Examples:
24
- # "hello".from(0) # => "hello"
25
- # "hello".from(2) # => "llo"
26
- # "hello".from(10) # => "" if < 1.9, nil in 1.9
27
- def from(position)
28
- mb_chars[position..-1].to_s
29
- end
30
-
31
- # Returns the beginning of the string up to the +position+ treating the string as an array (where 0 is the first character).
32
- #
33
- # Examples:
34
- # "hello".to(0) # => "h"
35
- # "hello".to(2) # => "hel"
36
- # "hello".to(10) # => "hello"
37
- def to(position)
38
- mb_chars[0..position].to_s
39
- end
40
-
41
- # Returns the first character of the string or the first +limit+ characters.
42
- #
43
- # Examples:
44
- # "hello".first # => "h"
45
- # "hello".first(2) # => "he"
46
- # "hello".first(10) # => "hello"
47
- def first(limit = 1)
48
- if limit == 0
49
- ''
50
- elsif limit >= size
51
- self
52
- else
53
- mb_chars[0...limit].to_s
54
- end
55
- end
56
-
57
- # Returns the last character of the string or the last +limit+ characters.
58
- #
59
- # Examples:
60
- # "hello".last # => "o"
61
- # "hello".last(2) # => "lo"
62
- # "hello".last(10) # => "hello"
63
- def last(limit = 1)
64
- if limit == 0
65
- ''
66
- elsif limit >= size
67
- self
68
- else
69
- mb_chars[(-limit)..-1].to_s
70
- end
71
- end
72
- else
73
- def at(position)
74
- self[position]
75
- end
76
-
77
- def from(position)
78
- self[position..-1]
79
- end
80
-
81
- def to(position)
82
- self[0..position]
83
- end
84
-
85
- def first(limit = 1)
86
- if limit == 0
87
- ''
88
- elsif limit >= size
89
- self
90
- else
91
- to(limit - 1)
92
- end
93
- end
94
-
95
- def last(limit = 1)
96
- if limit == 0
97
- ''
98
- elsif limit >= size
99
- self
100
- else
101
- from(-limit)
102
- end
103
- end
104
- end
105
-
106
- if Module.method(:const_get).arity == 1
107
- # Tries to find a constant with the name specified in the argument string:
108
- #
109
- # "Module".constantize # => Module
110
- # "Test::Unit".constantize # => Test::Unit
111
- #
112
- # The name is assumed to be the one of a top-level constant, no matter whether
113
- # it starts with "::" or not. No lexical context is taken into account:
114
- #
115
- # C = 'outside'
116
- # module M
117
- # C = 'inside'
118
- # C # => 'inside'
119
- # "C".constantize # => 'outside', same as ::C
120
- # end
121
- #
122
- # NameError is raised when the name is not in CamelCase or the constant is
123
- # unknown.
124
- def constantize
125
- names = self.split('::')
126
- names.shift if names.empty? || names.first.empty?
127
-
128
- constant = Object
129
- names.each do |name|
130
- constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
131
- end
132
- constant
133
- end
134
- else
135
- def constantize #:nodoc:
136
- names = self.split('::')
137
- names.shift if names.empty? || names.first.empty?
138
-
139
- constant = Object
140
- names.each do |name|
141
- constant = constant.const_defined?(name, false) ? constant.const_get(name) : constant.const_missing(name)
142
- end
143
- constant
144
- end
145
- end
146
- end
@@ -1,79 +0,0 @@
1
- # encoding: utf-8
2
- # frozen_string_literal: true
3
-
4
- # This is not loaded if ActiveSupport is already loaded
5
-
6
- # This is an almost cut and paste from ActiveSupport v3.0.6, copied in here so that Mail
7
- # itself does not depend on ActiveSupport to avoid versioning conflicts
8
-
9
- require 'mail/multibyte'
10
-
11
- class String
12
- if RUBY_VERSION >= "1.9"
13
- # == Multibyte proxy
14
- #
15
- # +mb_chars+ is a multibyte safe proxy for string methods.
16
- #
17
- # In Ruby 1.8 and older it creates and returns an instance of the Mail::Multibyte::Chars class which
18
- # encapsulates the original string. A Unicode safe version of all the String methods are defined on this proxy
19
- # class. If the proxy class doesn't respond to a certain method, it's forwarded to the encapsuled string.
20
- #
21
- # name = 'Claus Müller'
22
- # name.reverse # => "rell??M sualC"
23
- # name.length # => 13
24
- #
25
- # name.mb_chars.reverse.to_s # => "rellüM sualC"
26
- # name.mb_chars.length # => 12
27
- #
28
- # In Ruby 1.9 and newer +mb_chars+ returns +self+ because String is (mostly) encoding aware. This means that
29
- # it becomes easy to run one version of your code on multiple Ruby versions.
30
- #
31
- # == Method chaining
32
- #
33
- # All the methods on the Chars proxy which normally return a string will return a Chars object. This allows
34
- # method chaining on the result of any of these methods.
35
- #
36
- # name.mb_chars.reverse.length # => 12
37
- #
38
- # == Interoperability and configuration
39
- #
40
- # The Chars object tries to be as interchangeable with String objects as possible: sorting and comparing between
41
- # String and Char work like expected. The bang! methods change the internal string representation in the Chars
42
- # object. Interoperability problems can be resolved easily with a +to_s+ call.
43
- #
44
- # For more information about the methods defined on the Chars proxy see Mail::Multibyte::Chars. For
45
- # information about how to change the default Multibyte behaviour see Mail::Multibyte.
46
- def mb_chars
47
- if Mail::Multibyte.proxy_class.consumes?(self)
48
- Mail::Multibyte.proxy_class.new(self)
49
- else
50
- self
51
- end
52
- end
53
-
54
- def is_utf8? #:nodoc
55
- case encoding
56
- when Encoding::UTF_8
57
- valid_encoding?
58
- when Encoding::ASCII_8BIT, Encoding::US_ASCII
59
- dup.force_encoding(Encoding::UTF_8).valid_encoding?
60
- else
61
- false
62
- end
63
- end
64
- else
65
- def mb_chars
66
- if Mail::Multibyte.proxy_class.wants?(self)
67
- Mail::Multibyte.proxy_class.new(self)
68
- else
69
- self
70
- end
71
- end
72
-
73
- # Returns true if the string has UTF-8 semantics (a String used for purely byte resources is unlikely to have
74
- # them), returns false otherwise.
75
- def is_utf8?
76
- Mail::Multibyte::Chars.consumes?(self)
77
- end
78
- end
79
- end
@@ -1,21 +0,0 @@
1
- # encoding: utf-8
2
- # frozen_string_literal: true
3
- class String #:nodoc:
4
-
5
- unless method_defined?(:ascii_only?)
6
- # Backport from Ruby 1.9 checks for non-us-ascii characters.
7
- def ascii_only?
8
- self !~ MATCH_NON_US_ASCII
9
- end
10
-
11
- MATCH_NON_US_ASCII = /[^\x00-\x7f]/
12
- end
13
-
14
- def not_ascii_only?
15
- !ascii_only?
16
- end
17
-
18
- unless method_defined?(:bytesize)
19
- alias :bytesize :length
20
- end
21
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
- module Mail
3
-
4
- class AddressContainer < Array
5
-
6
- def initialize(field, list = [])
7
- @field = field
8
- super(list)
9
- end
10
-
11
- def << (address)
12
- @field << address
13
- end
14
-
15
- end
16
-
17
- end
@@ -1,136 +0,0 @@
1
- # encoding: utf-8
2
- # frozen_string_literal: true
3
- require 'mail/fields/common/address_container'
4
-
5
- module Mail
6
- module CommonAddress # :nodoc:
7
-
8
- def parse(val = value)
9
- unless Utilities.blank?(val)
10
- @address_list = AddressList.new(encode_if_needed(val))
11
- else
12
- nil
13
- end
14
- end
15
-
16
- def charset
17
- @charset
18
- end
19
-
20
- def encode_if_needed(val)
21
- Encodings.address_encode(val, charset)
22
- end
23
-
24
- # Allows you to iterate through each address object in the address_list
25
- def each
26
- address_list.addresses.each do |address|
27
- yield(address)
28
- end
29
- end
30
-
31
- # Returns the address string of all the addresses in the address list
32
- def addresses
33
- list = address_list.addresses.map { |a| a.address }
34
- Mail::AddressContainer.new(self, list)
35
- end
36
-
37
- # Returns the formatted string of all the addresses in the address list
38
- def formatted
39
- list = address_list.addresses.map { |a| a.format }
40
- Mail::AddressContainer.new(self, list)
41
- end
42
-
43
- # Returns the display name of all the addresses in the address list
44
- def display_names
45
- list = address_list.addresses.map { |a| a.display_name }
46
- Mail::AddressContainer.new(self, list)
47
- end
48
-
49
- # Returns the actual address objects in the address list
50
- def addrs
51
- list = address_list.addresses
52
- Mail::AddressContainer.new(self, list)
53
- end
54
-
55
- # Returns a hash of group name => address strings for the address list
56
- def groups
57
- address_list.addresses_grouped_by_group
58
- end
59
-
60
- # Returns the addresses that are part of groups
61
- def group_addresses
62
- decoded_group_addresses
63
- end
64
-
65
- # Returns a list of decoded group addresses
66
- def decoded_group_addresses
67
- groups.map { |k,v| v.map { |a| a.decoded } }.flatten
68
- end
69
-
70
- # Returns a list of encoded group addresses
71
- def encoded_group_addresses
72
- groups.map { |k,v| v.map { |a| a.encoded } }.flatten
73
- end
74
-
75
- # Returns the name of all the groups in a string
76
- def group_names # :nodoc:
77
- address_list.group_names
78
- end
79
-
80
- def default
81
- addresses
82
- end
83
-
84
- def <<(val)
85
- case
86
- when val.nil?
87
- raise ArgumentError, "Need to pass an address to <<"
88
- when Utilities.blank?(val)
89
- parse(encoded)
90
- else
91
- self.value = [self.value, val].reject {|a| Utilities.blank?(a) }.join(", ")
92
- end
93
- end
94
-
95
- def value=(val)
96
- super
97
- parse(self.value)
98
- end
99
-
100
- private
101
-
102
- def do_encode(field_name)
103
- return '' if Utilities.blank?(value)
104
- address_array = address_list.addresses.reject { |a| encoded_group_addresses.include?(a.encoded) }.compact.map { |a| a.encoded }
105
- address_text = address_array.join(", \r\n\s")
106
- group_array = groups.map { |k,v| "#{k}: #{v.map { |a| a.encoded }.join(", \r\n\s")};" }
107
- group_text = group_array.join(" \r\n\s")
108
- return_array = [address_text, group_text].reject { |a| Utilities.blank?(a) }
109
- "#{field_name}: #{return_array.join(", \r\n\s")}\r\n"
110
- end
111
-
112
- def do_decode
113
- return nil if Utilities.blank?(value)
114
- address_array = address_list.addresses.reject { |a| decoded_group_addresses.include?(a.decoded) }.map { |a| a.decoded }
115
- address_text = address_array.join(", ")
116
- group_array = groups.map { |k,v| "#{k}: #{v.map { |a| a.decoded }.join(", ")};" }
117
- group_text = group_array.join(" ")
118
- return_array = [address_text, group_text].reject { |a| Utilities.blank?(a) }
119
- return_array.join(", ")
120
- end
121
-
122
- def address_list # :nodoc:
123
- @address_list ||= AddressList.new(value)
124
- end
125
-
126
- def get_group_addresses(group_list)
127
- if group_list.respond_to?(:addresses)
128
- group_list.addresses.map do |address|
129
- Mail::Address.new(address)
130
- end
131
- else
132
- []
133
- end
134
- end
135
- end
136
- end
@@ -1,36 +0,0 @@
1
- # encoding: utf-8
2
- # frozen_string_literal: true
3
- module Mail
4
- module CommonDate # :nodoc:
5
- # Returns a date time object of the parsed date
6
- def date_time
7
- ::DateTime.parse("#{element.date_string} #{element.time_string}")
8
- end
9
-
10
- def default
11
- date_time
12
- end
13
-
14
- def parse(val = value)
15
- unless Utilities.blank?(val)
16
- @element = Mail::DateTimeElement.new(val)
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
- end
36
- end
@@ -1,61 +0,0 @@
1
- # encoding: utf-8
2
- # frozen_string_literal: true
3
- module Mail
4
- module CommonField # :nodoc:
5
- include Mail::Constants
6
-
7
- def name=(value)
8
- @name = value
9
- end
10
-
11
- def name
12
- @name ||= nil
13
- end
14
-
15
- def value=(value)
16
- @length = nil
17
- @tree = nil
18
- @element = nil
19
- @value = value
20
- end
21
-
22
- def value
23
- @value
24
- end
25
-
26
- def to_s
27
- decoded.to_s
28
- end
29
-
30
- def default
31
- decoded
32
- end
33
-
34
- def field_length
35
- @length ||= "#{name}: #{encode(decoded)}".length
36
- end
37
-
38
- def responsible_for?( val )
39
- name.to_s.casecmp(val.to_s) == 0
40
- end
41
-
42
- private
43
-
44
- def strip_field(field_name, value)
45
- if value.is_a?(Array)
46
- value
47
- else
48
- value.to_s.sub(/\A#{field_name}:\s+/i, EMPTY)
49
- end
50
- end
51
-
52
- FILENAME_RE = /\b(filename|name)=([^;"\r\n]+\s[^;"\r\n]+)/
53
- def ensure_filename_quoted(value)
54
- if value.is_a?(String)
55
- value.sub FILENAME_RE, '\1="\2"'
56
- else
57
- value
58
- end
59
- end
60
- end
61
- end
@@ -1,49 +0,0 @@
1
- # encoding: utf-8
2
- # frozen_string_literal: true
3
- module Mail
4
- module CommonMessageId # :nodoc:
5
- def element
6
- @element ||= Mail::MessageIdsElement.new(value) unless Utilities.blank?(value)
7
- end
8
-
9
- def parse(val = value)
10
- unless Utilities.blank?(val)
11
- @element = Mail::MessageIdsElement.new(val)
12
- else
13
- nil
14
- end
15
- end
16
-
17
- def message_id
18
- element.message_id if element
19
- end
20
-
21
- def message_ids
22
- element.message_ids if element
23
- end
24
-
25
- def default
26
- return nil unless message_ids
27
- if message_ids.length == 1
28
- message_ids[0]
29
- else
30
- message_ids
31
- end
32
- end
33
-
34
- private
35
-
36
- def do_encode(field_name)
37
- %Q{#{field_name}: #{formated_message_ids("\r\n ")}\r\n}
38
- end
39
-
40
- def do_decode
41
- formated_message_ids(' ')
42
- end
43
-
44
- def formated_message_ids(join)
45
- message_ids.map{ |m| "<#{m}>" }.join(join) if message_ids
46
- end
47
-
48
- end
49
- end