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.
- checksums.yaml +5 -5
- data/MIT-LICENSE +1 -1
- data/README.md +150 -107
- data/lib/mail/attachments_list.rb +13 -10
- data/lib/mail/body.rb +104 -90
- data/lib/mail/check_delivery_params.rb +55 -10
- data/lib/mail/configuration.rb +3 -0
- data/lib/mail/constants.rb +79 -0
- data/lib/mail/elements/address.rb +96 -108
- data/lib/mail/elements/address_list.rb +13 -30
- data/lib/mail/elements/content_disposition_element.rb +10 -16
- data/lib/mail/elements/content_location_element.rb +9 -13
- data/lib/mail/elements/content_transfer_encoding_element.rb +7 -11
- data/lib/mail/elements/content_type_element.rb +17 -23
- data/lib/mail/elements/date_time_element.rb +8 -15
- data/lib/mail/elements/envelope_from_element.rb +23 -23
- data/lib/mail/elements/message_ids_element.rb +22 -15
- data/lib/mail/elements/mime_version_element.rb +8 -15
- data/lib/mail/elements/phrase_list.rb +13 -10
- data/lib/mail/elements/received_element.rb +28 -19
- data/lib/mail/elements.rb +1 -0
- data/lib/mail/encodings/7bit.rb +10 -14
- data/lib/mail/encodings/8bit.rb +5 -18
- data/lib/mail/encodings/base64.rb +15 -10
- data/lib/mail/encodings/binary.rb +4 -22
- data/lib/mail/encodings/identity.rb +24 -0
- data/lib/mail/encodings/quoted_printable.rb +13 -7
- data/lib/mail/encodings/transfer_encoding.rb +47 -28
- data/lib/mail/encodings/unix_to_unix.rb +20 -0
- data/lib/mail/encodings.rb +102 -92
- data/lib/mail/envelope.rb +12 -14
- data/lib/mail/field.rb +121 -85
- data/lib/mail/field_list.rb +62 -8
- data/lib/mail/fields/bcc_field.rb +42 -48
- data/lib/mail/fields/cc_field.rb +29 -50
- data/lib/mail/fields/comments_field.rb +28 -37
- data/lib/mail/fields/common_address_field.rb +170 -0
- data/lib/mail/fields/common_date_field.rb +58 -0
- data/lib/mail/fields/common_field.rb +77 -0
- data/lib/mail/fields/common_message_id_field.rb +42 -0
- data/lib/mail/fields/content_description_field.rb +8 -14
- data/lib/mail/fields/content_disposition_field.rb +20 -44
- data/lib/mail/fields/content_id_field.rb +25 -51
- data/lib/mail/fields/content_location_field.rb +12 -25
- data/lib/mail/fields/content_transfer_encoding_field.rb +32 -31
- data/lib/mail/fields/content_type_field.rb +51 -80
- data/lib/mail/fields/date_field.rb +24 -52
- data/lib/mail/fields/from_field.rb +29 -50
- data/lib/mail/fields/in_reply_to_field.rb +39 -49
- data/lib/mail/fields/keywords_field.rb +19 -32
- data/lib/mail/fields/message_id_field.rb +26 -71
- data/lib/mail/fields/mime_version_field.rb +20 -30
- data/lib/mail/fields/named_structured_field.rb +11 -0
- data/lib/mail/fields/named_unstructured_field.rb +11 -0
- data/lib/mail/fields/optional_field.rb +10 -7
- data/lib/mail/fields/{common/parameter_hash.rb → parameter_hash.rb} +16 -13
- data/lib/mail/fields/received_field.rb +44 -57
- data/lib/mail/fields/references_field.rb +36 -49
- data/lib/mail/fields/reply_to_field.rb +29 -50
- data/lib/mail/fields/resent_bcc_field.rb +29 -50
- data/lib/mail/fields/resent_cc_field.rb +29 -50
- data/lib/mail/fields/resent_date_field.rb +6 -30
- data/lib/mail/fields/resent_from_field.rb +29 -50
- data/lib/mail/fields/resent_message_id_field.rb +6 -29
- data/lib/mail/fields/resent_sender_field.rb +28 -57
- data/lib/mail/fields/resent_to_field.rb +29 -50
- data/lib/mail/fields/return_path_field.rb +51 -55
- data/lib/mail/fields/sender_field.rb +35 -56
- data/lib/mail/fields/structured_field.rb +4 -30
- data/lib/mail/fields/subject_field.rb +10 -11
- data/lib/mail/fields/to_field.rb +29 -50
- data/lib/mail/fields/unstructured_field.rb +36 -50
- data/lib/mail/fields.rb +1 -0
- data/lib/mail/header.rb +73 -110
- data/lib/mail/indifferent_hash.rb +1 -0
- data/lib/mail/mail.rb +6 -11
- data/lib/mail/matchers/attachment_matchers.rb +44 -0
- data/lib/mail/matchers/has_sent_mail.rb +53 -9
- data/lib/mail/message.rb +132 -136
- data/lib/mail/multibyte/chars.rb +24 -180
- data/lib/mail/multibyte/unicode.rb +31 -26
- data/lib/mail/multibyte/utils.rb +27 -43
- data/lib/mail/multibyte.rb +56 -16
- data/lib/mail/network/delivery_methods/exim.rb +9 -11
- data/lib/mail/network/delivery_methods/file_delivery.rb +14 -16
- data/lib/mail/network/delivery_methods/logger_delivery.rb +34 -0
- data/lib/mail/network/delivery_methods/sendmail.rb +68 -24
- data/lib/mail/network/delivery_methods/smtp.rb +77 -54
- data/lib/mail/network/delivery_methods/smtp_connection.rb +5 -9
- data/lib/mail/network/delivery_methods/test_mailer.rb +9 -9
- data/lib/mail/network/retriever_methods/base.rb +9 -8
- data/lib/mail/network/retriever_methods/imap.rb +21 -7
- data/lib/mail/network/retriever_methods/pop3.rb +6 -3
- data/lib/mail/network/retriever_methods/test_retriever.rb +4 -2
- data/lib/mail/network.rb +2 -0
- data/lib/mail/parser_tools.rb +15 -0
- data/lib/mail/parsers/address_lists_parser.rb +33226 -116
- data/lib/mail/parsers/address_lists_parser.rl +179 -0
- data/lib/mail/parsers/content_disposition_parser.rb +883 -49
- data/lib/mail/parsers/content_disposition_parser.rl +89 -0
- data/lib/mail/parsers/content_location_parser.rb +810 -23
- data/lib/mail/parsers/content_location_parser.rl +78 -0
- data/lib/mail/parsers/content_transfer_encoding_parser.rb +510 -21
- data/lib/mail/parsers/content_transfer_encoding_parser.rl +71 -0
- data/lib/mail/parsers/content_type_parser.rb +1031 -47
- data/lib/mail/parsers/content_type_parser.rl +90 -0
- data/lib/mail/parsers/date_time_parser.rb +879 -24
- data/lib/mail/parsers/date_time_parser.rl +69 -0
- data/lib/mail/parsers/envelope_from_parser.rb +3670 -40
- data/lib/mail/parsers/envelope_from_parser.rl +89 -0
- data/lib/mail/parsers/message_ids_parser.rb +5147 -25
- data/lib/mail/parsers/message_ids_parser.rl +93 -0
- data/lib/mail/parsers/mime_version_parser.rb +498 -26
- data/lib/mail/parsers/mime_version_parser.rl +68 -0
- data/lib/mail/parsers/phrase_lists_parser.rb +872 -21
- data/lib/mail/parsers/phrase_lists_parser.rl +90 -0
- data/lib/mail/parsers/received_parser.rb +8777 -42
- data/lib/mail/parsers/received_parser.rl +91 -0
- data/lib/mail/parsers/rfc2045_content_transfer_encoding.rl +13 -0
- data/lib/mail/parsers/rfc2045_content_type.rl +25 -0
- data/lib/mail/parsers/rfc2045_mime.rl +16 -0
- data/lib/mail/parsers/rfc2183_content_disposition.rl +15 -0
- data/lib/mail/parsers/rfc3629_utf8.rl +19 -0
- data/lib/mail/parsers/rfc5234_abnf_core_rules.rl +22 -0
- data/lib/mail/parsers/rfc5322.rl +74 -0
- data/lib/mail/parsers/rfc5322_address.rl +72 -0
- data/lib/mail/parsers/{ragel/date_time.rl → rfc5322_date_time.rl} +8 -1
- data/lib/mail/parsers/rfc5322_lexical_tokens.rl +60 -0
- data/lib/mail/parsers.rb +12 -25
- data/lib/mail/part.rb +11 -12
- data/lib/mail/parts_list.rb +88 -14
- data/lib/mail/smtp_envelope.rb +57 -0
- data/lib/mail/utilities.rb +377 -40
- data/lib/mail/values/unicode_tables.dat +0 -0
- data/lib/mail/version.rb +8 -15
- data/lib/mail/yaml.rb +30 -0
- data/lib/mail.rb +9 -32
- metadata +138 -94
- data/CHANGELOG.rdoc +0 -752
- data/CONTRIBUTING.md +0 -60
- data/Dependencies.txt +0 -2
- data/Gemfile +0 -15
- data/Rakefile +0 -29
- data/TODO.rdoc +0 -9
- data/VERSION +0 -4
- data/lib/mail/core_extensions/nil.rb +0 -19
- data/lib/mail/core_extensions/object.rb +0 -13
- data/lib/mail/core_extensions/smtp.rb +0 -24
- data/lib/mail/core_extensions/string/access.rb +0 -145
- data/lib/mail/core_extensions/string/multibyte.rb +0 -78
- data/lib/mail/core_extensions/string.rb +0 -43
- data/lib/mail/fields/common/address_container.rb +0 -16
- data/lib/mail/fields/common/common_address.rb +0 -135
- data/lib/mail/fields/common/common_date.rb +0 -35
- data/lib/mail/fields/common/common_field.rb +0 -57
- data/lib/mail/fields/common/common_message_id.rb +0 -48
- data/lib/mail/multibyte/exceptions.rb +0 -8
- data/lib/mail/parsers/ragel/common.rl +0 -184
- data/lib/mail/parsers/ragel/parser_info.rb +0 -61
- data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb +0 -14864
- data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb.rl +0 -37
- data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb +0 -751
- data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb.rl +0 -37
- data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb +0 -614
- data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb.rl +0 -37
- data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb +0 -447
- data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb.rl +0 -37
- data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb +0 -825
- data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb.rl +0 -37
- data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb +0 -817
- data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb.rl +0 -37
- data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb +0 -2129
- data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb.rl +0 -37
- data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb +0 -1570
- data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb.rl +0 -37
- data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb +0 -440
- data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb.rl +0 -37
- data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb +0 -564
- data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb.rl +0 -37
- data/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl +0 -51
- data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb +0 -5144
- data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb.rl +0 -37
- data/lib/mail/parsers/ragel/ruby/parser.rb.rl.erb +0 -37
- data/lib/mail/parsers/ragel/ruby.rb +0 -39
- data/lib/mail/parsers/ragel.rb +0 -17
- data/lib/mail/patterns.rb +0 -37
- data/lib/mail/version_specific/ruby_1_8.rb +0 -119
- 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
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,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&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,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
|