mail 2.5.5 → 2.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/MIT-LICENSE +1 -1
- data/README.md +170 -108
- data/lib/mail/attachments_list.rb +13 -10
- data/lib/mail/body.rb +105 -91
- data/lib/mail/check_delivery_params.rb +30 -22
- data/lib/mail/configuration.rb +3 -0
- data/lib/mail/constants.rb +79 -0
- data/lib/mail/elements/address.rb +118 -174
- data/lib/mail/elements/address_list.rb +16 -56
- data/lib/mail/elements/content_disposition_element.rb +12 -22
- data/lib/mail/elements/content_location_element.rb +9 -17
- data/lib/mail/elements/content_transfer_encoding_element.rb +8 -19
- data/lib/mail/elements/content_type_element.rb +20 -30
- data/lib/mail/elements/date_time_element.rb +10 -21
- data/lib/mail/elements/envelope_from_element.rb +23 -31
- data/lib/mail/elements/message_ids_element.rb +22 -20
- data/lib/mail/elements/mime_version_element.rb +10 -21
- data/lib/mail/elements/phrase_list.rb +13 -15
- data/lib/mail/elements/received_element.rb +26 -21
- 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 -93
- data/lib/mail/envelope.rb +12 -19
- data/lib/mail/field.rb +143 -71
- data/lib/mail/field_list.rb +73 -19
- 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 +31 -36
- 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 +43 -51
- data/lib/mail/fields.rb +1 -0
- data/lib/mail/header.rb +78 -129
- data/lib/mail/indifferent_hash.rb +1 -0
- data/lib/mail/mail.rb +18 -11
- data/lib/mail/matchers/attachment_matchers.rb +44 -0
- data/lib/mail/matchers/has_sent_mail.rb +81 -4
- data/lib/mail/message.rb +142 -139
- data/lib/mail/multibyte/chars.rb +24 -180
- data/lib/mail/multibyte/unicode.rb +32 -27
- data/lib/mail/multibyte/utils.rb +27 -43
- data/lib/mail/multibyte.rb +56 -16
- data/lib/mail/network/delivery_methods/exim.rb +6 -4
- data/lib/mail/network/delivery_methods/file_delivery.rb +12 -10
- data/lib/mail/network/delivery_methods/logger_delivery.rb +34 -0
- data/lib/mail/network/delivery_methods/sendmail.rb +63 -21
- data/lib/mail/network/delivery_methods/smtp.rb +76 -50
- data/lib/mail/network/delivery_methods/smtp_connection.rb +4 -4
- data/lib/mail/network/delivery_methods/test_mailer.rb +5 -2
- data/lib/mail/network/retriever_methods/base.rb +9 -8
- data/lib/mail/network/retriever_methods/imap.rb +37 -18
- 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 +33242 -0
- data/lib/mail/parsers/address_lists_parser.rl +179 -0
- data/lib/mail/parsers/content_disposition_parser.rb +901 -0
- data/lib/mail/parsers/content_disposition_parser.rl +89 -0
- data/lib/mail/parsers/content_location_parser.rb +822 -0
- data/lib/mail/parsers/content_location_parser.rl +78 -0
- data/lib/mail/parsers/content_transfer_encoding_parser.rb +522 -0
- data/lib/mail/parsers/content_transfer_encoding_parser.rl +71 -0
- data/lib/mail/parsers/content_type_parser.rb +1048 -0
- data/lib/mail/parsers/content_type_parser.rl +90 -0
- data/lib/mail/parsers/date_time_parser.rb +891 -0
- data/lib/mail/parsers/date_time_parser.rl +69 -0
- data/lib/mail/parsers/envelope_from_parser.rb +3675 -0
- data/lib/mail/parsers/envelope_from_parser.rl +89 -0
- data/lib/mail/parsers/message_ids_parser.rb +5161 -0
- data/lib/mail/parsers/message_ids_parser.rl +93 -0
- data/lib/mail/parsers/mime_version_parser.rb +513 -0
- data/lib/mail/parsers/mime_version_parser.rl +68 -0
- data/lib/mail/parsers/phrase_lists_parser.rb +884 -0
- data/lib/mail/parsers/phrase_lists_parser.rl +90 -0
- data/lib/mail/parsers/received_parser.rb +8782 -0
- 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/rfc5322_date_time.rl +37 -0
- data/lib/mail/parsers/rfc5322_lexical_tokens.rl +60 -0
- data/lib/mail/parsers.rb +13 -0
- data/lib/mail/part.rb +11 -12
- data/lib/mail/parts_list.rb +90 -14
- data/lib/mail/smtp_envelope.rb +57 -0
- data/lib/mail/utilities.rb +415 -76
- 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 +127 -79
- data/CHANGELOG.rdoc +0 -742
- data/CONTRIBUTING.md +0 -45
- data/Dependencies.txt +0 -3
- data/Gemfile +0 -32
- data/Rakefile +0 -21
- data/TODO.rdoc +0 -9
- data/lib/VERSION +0 -4
- data/lib/load_parsers.rb +0 -35
- 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 -33
- data/lib/mail/fields/common/address_container.rb +0 -16
- data/lib/mail/fields/common/common_address.rb +0 -140
- data/lib/mail/fields/common/common_date.rb +0 -42
- 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/address_lists.rb +0 -64
- data/lib/mail/parsers/address_lists.treetop +0 -19
- data/lib/mail/parsers/content_disposition.rb +0 -535
- data/lib/mail/parsers/content_disposition.treetop +0 -46
- data/lib/mail/parsers/content_location.rb +0 -139
- data/lib/mail/parsers/content_location.treetop +0 -20
- data/lib/mail/parsers/content_transfer_encoding.rb +0 -201
- data/lib/mail/parsers/content_transfer_encoding.treetop +0 -18
- data/lib/mail/parsers/content_type.rb +0 -971
- data/lib/mail/parsers/content_type.treetop +0 -68
- data/lib/mail/parsers/date_time.rb +0 -114
- data/lib/mail/parsers/date_time.treetop +0 -11
- data/lib/mail/parsers/envelope_from.rb +0 -194
- data/lib/mail/parsers/envelope_from.treetop +0 -32
- data/lib/mail/parsers/message_ids.rb +0 -45
- data/lib/mail/parsers/message_ids.treetop +0 -15
- data/lib/mail/parsers/mime_version.rb +0 -144
- data/lib/mail/parsers/mime_version.treetop +0 -19
- data/lib/mail/parsers/phrase_lists.rb +0 -45
- data/lib/mail/parsers/phrase_lists.treetop +0 -15
- data/lib/mail/parsers/received.rb +0 -71
- data/lib/mail/parsers/received.treetop +0 -11
- data/lib/mail/parsers/rfc2045.rb +0 -421
- data/lib/mail/parsers/rfc2045.treetop +0 -35
- data/lib/mail/parsers/rfc2822.rb +0 -5397
- data/lib/mail/parsers/rfc2822.treetop +0 -408
- data/lib/mail/parsers/rfc2822_obsolete.rb +0 -3768
- data/lib/mail/parsers/rfc2822_obsolete.treetop +0 -241
- data/lib/mail/patterns.rb +0 -35
- data/lib/mail/version_specific/ruby_1_8.rb +0 -119
- data/lib/mail/version_specific/ruby_1_9.rb +0 -147
- data/lib/tasks/corpus.rake +0 -125
- data/lib/tasks/treetop.rake +0 -10
data/CONTRIBUTING.md
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
Contributing to Mail
|
2
|
-
====================
|
3
|
-
|
4
|
-
Hi there, I welcome pull requests! Here are some thoughts on how to get your
|
5
|
-
pull request merged quickly:
|
6
|
-
|
7
|
-
1. Check the Reference RFCs, they are in the References directory, so no excuses.
|
8
|
-
2. Check for a ticket on GitHub, maybe someone else has the problem too
|
9
|
-
3. Make a fork of my GitHub repository
|
10
|
-
4. Run the specs. We only take pull requests with passing tests, and it's great
|
11
|
-
to know that you have a clean slate: `bundle && bundle exec rake`
|
12
|
-
5. Add a spec for your change. Only refactoring and documentation changes
|
13
|
-
require no new specs. If you are adding functionality or fixing a bug, we need
|
14
|
-
a spec!
|
15
|
-
6. Test the spec _at_ _least_ against MRI-1.9.3 and MRI-1.8.7
|
16
|
-
7. Update the README if needed to reflect your change / addition
|
17
|
-
8. With all specs passing push your changes back to your fork
|
18
|
-
9. Send me a pull request
|
19
|
-
|
20
|
-
Note, specs that break MRI 1.8.7 or 1.9.3 will not be accepted.
|
21
|
-
|
22
|
-
At this point you're waiting on us. We like to at least comment on, if not
|
23
|
-
accept, pull requests within three business days (and, typically, one business
|
24
|
-
day). We may suggest some changes or improvements or alternatives.
|
25
|
-
|
26
|
-
Some things that will increase the chance that your pull request is accepted,
|
27
|
-
taken straight from the Ruby on Rails guide:
|
28
|
-
|
29
|
-
* Tell me you have tested it against more than one version of Ruby, RVM is great for
|
30
|
-
this. I test against 7 rubies before I push into master.
|
31
|
-
* Use good, idiomatic, structured and modular code
|
32
|
-
* Include tests that fail without your code, and pass with it
|
33
|
-
* Update the documentation, the surrounding one, examples elsewhere, guides,
|
34
|
-
whatever is affected by your contribution
|
35
|
-
|
36
|
-
Syntax:
|
37
|
-
|
38
|
-
* Two spaces, no tabs.
|
39
|
-
* No trailing whitespace. Blank lines should not have any space.
|
40
|
-
* Prefer &&/|| over and/or.
|
41
|
-
* MyClass.my_method(my_arg) not my_method( my_arg ) or my_method my_arg.
|
42
|
-
* a = b and not a=b.
|
43
|
-
* Follow the conventions you see used in the source already.
|
44
|
-
|
45
|
-
And in case we didn't emphasize it enough: we love specs!
|
data/Dependencies.txt
DELETED
data/Gemfile
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
source 'https://rubygems.org'
|
2
|
-
|
3
|
-
gemspec
|
4
|
-
|
5
|
-
if RUBY_VERSION < '1.9.3'
|
6
|
-
gem 'activesupport', '< 4'
|
7
|
-
elsif RUBY_VERSION < '2.2.2'
|
8
|
-
gem 'activesupport', '< 5'
|
9
|
-
end
|
10
|
-
gem 'i18n', '< 0.7.0' if RUBY_VERSION < '1.9.3'
|
11
|
-
gem "tlsmail" if RUBY_VERSION <= '1.8.6'
|
12
|
-
gem "mime-types", "~> 1.16"
|
13
|
-
gem "treetop", "~> 1.4.10"
|
14
|
-
|
15
|
-
gem 'jruby-openssl', :platform => :jruby
|
16
|
-
|
17
|
-
# For gems not required to run tests
|
18
|
-
group :local_development, :test do
|
19
|
-
gem 'rake', '> 0.8.7', '< 11.0.1'
|
20
|
-
gem 'rdoc', '< 4.3' if RUBY_VERSION < '1.9.3'
|
21
|
-
gem "rspec", "~> 2.8.0"
|
22
|
-
case
|
23
|
-
when defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
|
24
|
-
# Skip it
|
25
|
-
when RUBY_PLATFORM == 'java'
|
26
|
-
# Skip it
|
27
|
-
when RUBY_VERSION < '1.9'
|
28
|
-
gem "ruby-debug"
|
29
|
-
else
|
30
|
-
# Skip it
|
31
|
-
end
|
32
|
-
end
|
data/Rakefile
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
ENV['BUNDLE_GEMFILE'] = File.expand_path('../Gemfile', __FILE__)
|
2
|
-
require 'rubygems'
|
3
|
-
require 'bundler/setup'
|
4
|
-
|
5
|
-
require 'rake/testtask'
|
6
|
-
require 'rspec/core/rake_task'
|
7
|
-
|
8
|
-
desc "Build a gem file"
|
9
|
-
task :build do
|
10
|
-
system "gem build mail.gemspec"
|
11
|
-
end
|
12
|
-
|
13
|
-
task :default => :spec
|
14
|
-
|
15
|
-
RSpec::Core::RakeTask.new(:spec) do |t|
|
16
|
-
t.ruby_opts = '-w'
|
17
|
-
t.rspec_opts = %w(--backtrace --color)
|
18
|
-
end
|
19
|
-
|
20
|
-
# load custom rake tasks
|
21
|
-
Dir["#{File.dirname(__FILE__)}/lib/tasks/**/*.rake"].sort.each { |ext| load ext }
|
data/TODO.rdoc
DELETED
@@ -1,9 +0,0 @@
|
|
1
|
-
== Not really in any order:
|
2
|
-
|
3
|
-
* Add multibyte handling to fields, if they get a multibyte string, try encoding it into
|
4
|
-
UTF-8 B first, if this fails, throw an error.
|
5
|
-
|
6
|
-
* Cleanup the treetop parsers......... do I _really_ need that many entrance files?
|
7
|
-
|
8
|
-
* Simplify the relationship of Headers and Fields. Doing too much of the Field work
|
9
|
-
in the Header class on instantiating fields. Header should just say "Field, do it!"
|
data/lib/VERSION
DELETED
data/lib/load_parsers.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
# This file loads up the parsers for mail to use. It also will attempt to compile parsers
|
3
|
-
# if they don't exist.
|
4
|
-
#
|
5
|
-
# It also only uses the compiler if we are running the SPEC suite
|
6
|
-
module Mail # :doc:
|
7
|
-
require 'treetop/runtime'
|
8
|
-
|
9
|
-
def self.compile_parser(parser)
|
10
|
-
require 'treetop/compiler'
|
11
|
-
Treetop.load(File.join(File.dirname(__FILE__)) + "/mail/parsers/#{parser}")
|
12
|
-
end
|
13
|
-
|
14
|
-
parsers = %w[ rfc2822_obsolete rfc2822 address_lists phrase_lists
|
15
|
-
date_time received message_ids envelope_from rfc2045
|
16
|
-
mime_version content_type content_disposition
|
17
|
-
content_transfer_encoding content_location ]
|
18
|
-
|
19
|
-
if defined?(MAIL_SPEC_SUITE_RUNNING)
|
20
|
-
parsers.each do |parser|
|
21
|
-
compile_parser(parser)
|
22
|
-
end
|
23
|
-
|
24
|
-
else
|
25
|
-
parsers.each do |parser|
|
26
|
-
begin
|
27
|
-
require "mail/parsers/#{parser}"
|
28
|
-
rescue LoadError
|
29
|
-
compile_parser(parser)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
@@ -1,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,33 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
class String #:nodoc:
|
3
|
-
def to_crlf
|
4
|
-
to_str.gsub(/\n|\r\n|\r/) { "\r\n" }
|
5
|
-
end
|
6
|
-
|
7
|
-
def to_lf
|
8
|
-
to_str.gsub(/\n|\r\n|\r/) { "\n" }
|
9
|
-
end
|
10
|
-
|
11
|
-
unless String.instance_methods(false).map {|m| m.to_sym}.include?(:blank?)
|
12
|
-
def blank?
|
13
|
-
self !~ /\S/
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
unless method_defined?(:ascii_only?)
|
18
|
-
# Backport from Ruby 1.9 checks for non-us-ascii characters.
|
19
|
-
def ascii_only?
|
20
|
-
self !~ MATCH_NON_US_ASCII
|
21
|
-
end
|
22
|
-
|
23
|
-
MATCH_NON_US_ASCII = /[^\x00-\x7f]/
|
24
|
-
end
|
25
|
-
|
26
|
-
def not_ascii_only?
|
27
|
-
!ascii_only?
|
28
|
-
end
|
29
|
-
|
30
|
-
unless method_defined?(:bytesize)
|
31
|
-
alias :bytesize :length
|
32
|
-
end
|
33
|
-
end
|
@@ -1,140 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require 'mail/fields/common/address_container'
|
3
|
-
|
4
|
-
module Mail
|
5
|
-
module CommonAddress # :nodoc:
|
6
|
-
|
7
|
-
def parse(val = value)
|
8
|
-
unless val.blank?
|
9
|
-
@tree = AddressList.new(encode_if_needed(val))
|
10
|
-
else
|
11
|
-
nil
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def charset
|
16
|
-
@charset
|
17
|
-
end
|
18
|
-
|
19
|
-
def encode_if_needed(val)
|
20
|
-
Encodings.address_encode(val, charset)
|
21
|
-
end
|
22
|
-
|
23
|
-
# Allows you to iterate through each address object in the syntax tree
|
24
|
-
def each
|
25
|
-
tree.addresses.each do |address|
|
26
|
-
yield(address)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
# Returns the address string of all the addresses in the address list
|
31
|
-
def addresses
|
32
|
-
list = tree.addresses.map { |a| a.address }
|
33
|
-
Mail::AddressContainer.new(self, list)
|
34
|
-
end
|
35
|
-
|
36
|
-
# Returns the formatted string of all the addresses in the address list
|
37
|
-
def formatted
|
38
|
-
list = tree.addresses.map { |a| a.format }
|
39
|
-
Mail::AddressContainer.new(self, list)
|
40
|
-
end
|
41
|
-
|
42
|
-
# Returns the display name of all the addresses in the address list
|
43
|
-
def display_names
|
44
|
-
list = tree.addresses.map { |a| a.display_name }
|
45
|
-
Mail::AddressContainer.new(self, list)
|
46
|
-
end
|
47
|
-
|
48
|
-
# Returns the actual address objects in the address list
|
49
|
-
def addrs
|
50
|
-
list = tree.addresses
|
51
|
-
Mail::AddressContainer.new(self, list)
|
52
|
-
end
|
53
|
-
|
54
|
-
# Returns a hash of group name => address strings for the address list
|
55
|
-
def groups
|
56
|
-
@groups = Hash.new
|
57
|
-
tree.group_recipients.each do |group|
|
58
|
-
@groups[group.group_name.text_value.to_str] = get_group_addresses(group.group_list)
|
59
|
-
end
|
60
|
-
@groups
|
61
|
-
end
|
62
|
-
|
63
|
-
# Returns the addresses that are part of groups
|
64
|
-
def group_addresses
|
65
|
-
decoded_group_addresses
|
66
|
-
end
|
67
|
-
|
68
|
-
# Returns a list of decoded group addresses
|
69
|
-
def decoded_group_addresses
|
70
|
-
groups.map { |k,v| v.map { |a| a.decoded } }.flatten
|
71
|
-
end
|
72
|
-
|
73
|
-
# Returns a list of encoded group addresses
|
74
|
-
def encoded_group_addresses
|
75
|
-
groups.map { |k,v| v.map { |a| a.encoded } }.flatten
|
76
|
-
end
|
77
|
-
|
78
|
-
# Returns the name of all the groups in a string
|
79
|
-
def group_names # :nodoc:
|
80
|
-
tree.group_names
|
81
|
-
end
|
82
|
-
|
83
|
-
def default
|
84
|
-
addresses
|
85
|
-
end
|
86
|
-
|
87
|
-
def <<(val)
|
88
|
-
case
|
89
|
-
when val.nil?
|
90
|
-
raise ArgumentError, "Need to pass an address to <<"
|
91
|
-
when val.blank?
|
92
|
-
parse(encoded)
|
93
|
-
else
|
94
|
-
self.value = [self.value, val].reject {|a| a.blank? }.join(", ")
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
def value=(val)
|
99
|
-
super
|
100
|
-
parse(self.value)
|
101
|
-
end
|
102
|
-
|
103
|
-
private
|
104
|
-
|
105
|
-
def do_encode(field_name)
|
106
|
-
return '' if value.blank?
|
107
|
-
address_array = tree.addresses.reject { |a| encoded_group_addresses.include?(a.encoded) }.compact.map { |a| a.encoded }
|
108
|
-
address_text = address_array.join(", \r\n\s")
|
109
|
-
group_array = groups.map { |k,v| "#{k}: #{v.map { |a| a.encoded }.join(", \r\n\s")};" }
|
110
|
-
group_text = group_array.join(" \r\n\s")
|
111
|
-
return_array = [address_text, group_text].reject { |a| a.blank? }
|
112
|
-
"#{field_name}: #{return_array.join(", \r\n\s")}\r\n"
|
113
|
-
end
|
114
|
-
|
115
|
-
def do_decode
|
116
|
-
return nil if value.blank?
|
117
|
-
address_array = tree.addresses.reject { |a| decoded_group_addresses.include?(a.decoded) }.map { |a| a.decoded }
|
118
|
-
address_text = address_array.join(", ")
|
119
|
-
group_array = groups.map { |k,v| "#{k}: #{v.map { |a| a.decoded }.join(", ")};" }
|
120
|
-
group_text = group_array.join(" ")
|
121
|
-
return_array = [address_text, group_text].reject { |a| a.blank? }
|
122
|
-
return_array.join(", ")
|
123
|
-
end
|
124
|
-
|
125
|
-
# Returns the syntax tree of the Addresses
|
126
|
-
def tree # :nodoc:
|
127
|
-
@tree ||= AddressList.new(value)
|
128
|
-
end
|
129
|
-
|
130
|
-
def get_group_addresses(group_list)
|
131
|
-
if group_list.respond_to?(:addresses)
|
132
|
-
group_list.addresses.map do |address_tree|
|
133
|
-
Mail::Address.new(address_tree)
|
134
|
-
end
|
135
|
-
else
|
136
|
-
[]
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
module Mail
|
3
|
-
module CommonDate # :nodoc:
|
4
|
-
# Returns a date time object of the parsed date
|
5
|
-
def date_time
|
6
|
-
::DateTime.parse("#{element.date_string} #{element.time_string}")
|
7
|
-
end
|
8
|
-
|
9
|
-
def default
|
10
|
-
date_time
|
11
|
-
end
|
12
|
-
|
13
|
-
def parse(val = value)
|
14
|
-
unless val.blank?
|
15
|
-
@element = Mail::DateTimeElement.new(val)
|
16
|
-
@tree = @element.tree
|
17
|
-
else
|
18
|
-
nil
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def do_encode(field_name)
|
25
|
-
"#{field_name}: #{value}\r\n"
|
26
|
-
end
|
27
|
-
|
28
|
-
def do_decode
|
29
|
-
"#{value}"
|
30
|
-
end
|
31
|
-
|
32
|
-
def element
|
33
|
-
@element ||= Mail::DateTimeElement.new(value)
|
34
|
-
end
|
35
|
-
|
36
|
-
# Returns the syntax tree of the Date
|
37
|
-
def tree
|
38
|
-
@tree ||= element.tree
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
end
|