mail-trunk 2.3.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 (137) hide show
  1. data/CHANGELOG.rdoc +555 -0
  2. data/Dependencies.txt +3 -0
  3. data/Gemfile +29 -0
  4. data/README.mkd +583 -0
  5. data/Rakefile +66 -0
  6. data/TODO.rdoc +9 -0
  7. data/lib/VERSION +4 -0
  8. data/lib/mail.rb +89 -0
  9. data/lib/mail/attachments_list.rb +105 -0
  10. data/lib/mail/body.rb +292 -0
  11. data/lib/mail/configuration.rb +73 -0
  12. data/lib/mail/core_extensions/nil.rb +17 -0
  13. data/lib/mail/core_extensions/object.rb +13 -0
  14. data/lib/mail/core_extensions/shellwords.rb +57 -0
  15. data/lib/mail/core_extensions/smtp.rb +25 -0
  16. data/lib/mail/core_extensions/string.rb +31 -0
  17. data/lib/mail/core_extensions/string/access.rb +104 -0
  18. data/lib/mail/core_extensions/string/multibyte.rb +78 -0
  19. data/lib/mail/elements.rb +14 -0
  20. data/lib/mail/elements/address.rb +306 -0
  21. data/lib/mail/elements/address_list.rb +74 -0
  22. data/lib/mail/elements/content_disposition_element.rb +30 -0
  23. data/lib/mail/elements/content_location_element.rb +25 -0
  24. data/lib/mail/elements/content_transfer_encoding_element.rb +24 -0
  25. data/lib/mail/elements/content_type_element.rb +35 -0
  26. data/lib/mail/elements/date_time_element.rb +26 -0
  27. data/lib/mail/elements/envelope_from_element.rb +34 -0
  28. data/lib/mail/elements/message_ids_element.rb +29 -0
  29. data/lib/mail/elements/mime_version_element.rb +26 -0
  30. data/lib/mail/elements/phrase_list.rb +21 -0
  31. data/lib/mail/elements/received_element.rb +30 -0
  32. data/lib/mail/encodings.rb +266 -0
  33. data/lib/mail/encodings/7bit.rb +31 -0
  34. data/lib/mail/encodings/8bit.rb +31 -0
  35. data/lib/mail/encodings/base64.rb +33 -0
  36. data/lib/mail/encodings/binary.rb +31 -0
  37. data/lib/mail/encodings/quoted_printable.rb +38 -0
  38. data/lib/mail/encodings/transfer_encoding.rb +58 -0
  39. data/lib/mail/envelope.rb +35 -0
  40. data/lib/mail/field.rb +224 -0
  41. data/lib/mail/field_list.rb +33 -0
  42. data/lib/mail/fields.rb +35 -0
  43. data/lib/mail/fields/bcc_field.rb +56 -0
  44. data/lib/mail/fields/cc_field.rb +55 -0
  45. data/lib/mail/fields/comments_field.rb +41 -0
  46. data/lib/mail/fields/common/address_container.rb +16 -0
  47. data/lib/mail/fields/common/common_address.rb +125 -0
  48. data/lib/mail/fields/common/common_date.rb +42 -0
  49. data/lib/mail/fields/common/common_field.rb +51 -0
  50. data/lib/mail/fields/common/common_message_id.rb +44 -0
  51. data/lib/mail/fields/common/parameter_hash.rb +58 -0
  52. data/lib/mail/fields/content_description_field.rb +19 -0
  53. data/lib/mail/fields/content_disposition_field.rb +69 -0
  54. data/lib/mail/fields/content_id_field.rb +63 -0
  55. data/lib/mail/fields/content_location_field.rb +42 -0
  56. data/lib/mail/fields/content_transfer_encoding_field.rb +50 -0
  57. data/lib/mail/fields/content_type_field.rb +198 -0
  58. data/lib/mail/fields/date_field.rb +57 -0
  59. data/lib/mail/fields/from_field.rb +55 -0
  60. data/lib/mail/fields/in_reply_to_field.rb +55 -0
  61. data/lib/mail/fields/keywords_field.rb +44 -0
  62. data/lib/mail/fields/message_id_field.rb +83 -0
  63. data/lib/mail/fields/mime_version_field.rb +53 -0
  64. data/lib/mail/fields/optional_field.rb +13 -0
  65. data/lib/mail/fields/received_field.rb +75 -0
  66. data/lib/mail/fields/references_field.rb +55 -0
  67. data/lib/mail/fields/reply_to_field.rb +55 -0
  68. data/lib/mail/fields/resent_bcc_field.rb +55 -0
  69. data/lib/mail/fields/resent_cc_field.rb +55 -0
  70. data/lib/mail/fields/resent_date_field.rb +35 -0
  71. data/lib/mail/fields/resent_from_field.rb +55 -0
  72. data/lib/mail/fields/resent_message_id_field.rb +34 -0
  73. data/lib/mail/fields/resent_sender_field.rb +62 -0
  74. data/lib/mail/fields/resent_to_field.rb +55 -0
  75. data/lib/mail/fields/return_path_field.rb +65 -0
  76. data/lib/mail/fields/sender_field.rb +67 -0
  77. data/lib/mail/fields/structured_field.rb +51 -0
  78. data/lib/mail/fields/subject_field.rb +16 -0
  79. data/lib/mail/fields/to_field.rb +55 -0
  80. data/lib/mail/fields/unstructured_field.rb +182 -0
  81. data/lib/mail/header.rb +265 -0
  82. data/lib/mail/indifferent_hash.rb +146 -0
  83. data/lib/mail/mail.rb +255 -0
  84. data/lib/mail/message.rb +2017 -0
  85. data/lib/mail/multibyte.rb +42 -0
  86. data/lib/mail/multibyte/chars.rb +474 -0
  87. data/lib/mail/multibyte/exceptions.rb +8 -0
  88. data/lib/mail/multibyte/unicode.rb +392 -0
  89. data/lib/mail/multibyte/utils.rb +60 -0
  90. data/lib/mail/network.rb +13 -0
  91. data/lib/mail/network/delivery_methods/file_delivery.rb +40 -0
  92. data/lib/mail/network/delivery_methods/sendmail.rb +62 -0
  93. data/lib/mail/network/delivery_methods/smtp.rb +137 -0
  94. data/lib/mail/network/delivery_methods/smtp_connection.rb +74 -0
  95. data/lib/mail/network/delivery_methods/test_mailer.rb +40 -0
  96. data/lib/mail/network/retriever_methods/base.rb +63 -0
  97. data/lib/mail/network/retriever_methods/imap.rb +158 -0
  98. data/lib/mail/network/retriever_methods/pop3.rb +140 -0
  99. data/lib/mail/network/retriever_methods/test_retriever.rb +47 -0
  100. data/lib/mail/parsers/address_lists.rb +64 -0
  101. data/lib/mail/parsers/address_lists.treetop +19 -0
  102. data/lib/mail/parsers/content_disposition.rb +535 -0
  103. data/lib/mail/parsers/content_disposition.treetop +46 -0
  104. data/lib/mail/parsers/content_location.rb +139 -0
  105. data/lib/mail/parsers/content_location.treetop +20 -0
  106. data/lib/mail/parsers/content_transfer_encoding.rb +162 -0
  107. data/lib/mail/parsers/content_transfer_encoding.treetop +20 -0
  108. data/lib/mail/parsers/content_type.rb +967 -0
  109. data/lib/mail/parsers/content_type.treetop +68 -0
  110. data/lib/mail/parsers/date_time.rb +114 -0
  111. data/lib/mail/parsers/date_time.treetop +11 -0
  112. data/lib/mail/parsers/envelope_from.rb +194 -0
  113. data/lib/mail/parsers/envelope_from.treetop +32 -0
  114. data/lib/mail/parsers/message_ids.rb +45 -0
  115. data/lib/mail/parsers/message_ids.treetop +15 -0
  116. data/lib/mail/parsers/mime_version.rb +144 -0
  117. data/lib/mail/parsers/mime_version.treetop +19 -0
  118. data/lib/mail/parsers/phrase_lists.rb +45 -0
  119. data/lib/mail/parsers/phrase_lists.treetop +15 -0
  120. data/lib/mail/parsers/received.rb +71 -0
  121. data/lib/mail/parsers/received.treetop +11 -0
  122. data/lib/mail/parsers/rfc2045.rb +464 -0
  123. data/lib/mail/parsers/rfc2045.treetop +36 -0
  124. data/lib/mail/parsers/rfc2822.rb +5341 -0
  125. data/lib/mail/parsers/rfc2822.treetop +410 -0
  126. data/lib/mail/parsers/rfc2822_obsolete.rb +3757 -0
  127. data/lib/mail/parsers/rfc2822_obsolete.treetop +241 -0
  128. data/lib/mail/part.rb +116 -0
  129. data/lib/mail/parts_list.rb +51 -0
  130. data/lib/mail/patterns.rb +35 -0
  131. data/lib/mail/utilities.rb +215 -0
  132. data/lib/mail/version.rb +24 -0
  133. data/lib/mail/version_specific/ruby_1_8.rb +98 -0
  134. data/lib/mail/version_specific/ruby_1_9.rb +113 -0
  135. data/lib/tasks/corpus.rake +125 -0
  136. data/lib/tasks/treetop.rake +10 -0
  137. metadata +221 -0
@@ -0,0 +1,24 @@
1
+ # encoding: utf-8
2
+ module Mail
3
+ module VERSION
4
+
5
+ version = {}
6
+ File.read(File.join(File.dirname(__FILE__), '../', 'VERSION')).each_line do |line|
7
+ type, value = line.chomp.split(":")
8
+ next if type =~ /^\s+$/ || value =~ /^\s+$/
9
+ version[type] = value
10
+ end
11
+
12
+ MAJOR = version['major']
13
+ MINOR = version['minor']
14
+ PATCH = version['patch']
15
+ BUILD = version['build']
16
+
17
+ STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
18
+
19
+ def self.version
20
+ STRING
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,98 @@
1
+ # encoding: utf-8
2
+
3
+ module Mail
4
+ class Ruby18
5
+ require 'base64'
6
+
7
+ # Escapes any parenthesis in a string that are unescaped. This can't
8
+ # use the Ruby 1.9.1 regexp feature of negative look behind so we have
9
+ # to do two replacement, first unescape everything, then re-escape it
10
+ def Ruby18.escape_paren( str )
11
+ re = /\\\)/
12
+ str = str.gsub(re) { |s| ')'}
13
+ re = /\\\(/
14
+ str = str.gsub(re) { |s| '('}
15
+ re = /([\(\)])/ # Only match unescaped parens
16
+ str.gsub(re) { |s| '\\' + s }
17
+ end
18
+
19
+ def Ruby18.paren( str )
20
+ str = $1 if str =~ /^\((.*)?\)$/
21
+ str = escape_paren( str )
22
+ '(' + str + ')'
23
+ end
24
+
25
+ def Ruby18.escape_bracket( str )
26
+ re = /\\\>/
27
+ str = str.gsub(re) { |s| '>'}
28
+ re = /\\\</
29
+ str = str.gsub(re) { |s| '<'}
30
+ re = /([\<\>])/ # Only match unescaped parens
31
+ str.gsub(re) { |s| '\\' + s }
32
+ end
33
+
34
+ def Ruby18.bracket( str )
35
+ str = $1 if str =~ /^\<(.*)?\>$/
36
+ str = escape_bracket( str )
37
+ '<' + str + '>'
38
+ end
39
+
40
+ def Ruby18.decode_base64(str)
41
+ Base64.decode64(str) if str
42
+ end
43
+
44
+ def Ruby18.encode_base64(str)
45
+ Base64.encode64(str)
46
+ end
47
+
48
+ def Ruby18.has_constant?(klass, string)
49
+ klass.constants.include?( string )
50
+ end
51
+
52
+ def Ruby18.get_constant(klass, string)
53
+ klass.const_get( string )
54
+ end
55
+
56
+ def Ruby18.b_value_encode(str, encoding)
57
+ # Ruby 1.8 requires an encoding to work
58
+ raise ArgumentError, "Must supply an encoding" if encoding.nil?
59
+ encoding = encoding.to_s.upcase.gsub('_', '-')
60
+ [Encodings::Base64.encode(str), encoding]
61
+ end
62
+
63
+ def Ruby18.b_value_decode(str)
64
+ match = str.match(/\=\?(.+)?\?[Bb]\?(.+)?\?\=/m)
65
+ if match
66
+ encoding = match[1]
67
+ str = Ruby18.decode_base64(match[2])
68
+ end
69
+ str
70
+ end
71
+
72
+ def Ruby18.q_value_encode(str, encoding)
73
+ # Ruby 1.8 requires an encoding to work
74
+ raise ArgumentError, "Must supply an encoding" if encoding.nil?
75
+ encoding = encoding.to_s.upcase.gsub('_', '-')
76
+ [Encodings::QuotedPrintable.encode(str), encoding]
77
+ end
78
+
79
+ def Ruby18.q_value_decode(str)
80
+ match = str.match(/\=\?(.+)?\?[Qq]\?(.+)?\?\=/m)
81
+ if match
82
+ encoding = match[1]
83
+ str = Encodings::QuotedPrintable.decode(match[2])
84
+ end
85
+ str
86
+ end
87
+
88
+ def Ruby18.param_decode(str, encoding)
89
+ URI.unescape(str)
90
+ end
91
+
92
+ def Ruby18.param_encode(str)
93
+ encoding = $KCODE.to_s.downcase
94
+ language = Configuration.instance.param_encode_language
95
+ "#{encoding}'#{language}'#{URI.escape(str)}"
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,113 @@
1
+ # encoding: utf-8
2
+
3
+ module Mail
4
+ class Ruby19
5
+
6
+ # Escapes any parenthesis in a string that are unescaped this uses
7
+ # a Ruby 1.9.1 regexp feature of negative look behind
8
+ def Ruby19.escape_paren( str )
9
+ re = /(?<!\\)([\(\)])/ # Only match unescaped parens
10
+ str.gsub(re) { |s| '\\' + s }
11
+ end
12
+
13
+ def Ruby19.paren( str )
14
+ str = $1 if str =~ /^\((.*)?\)$/
15
+ str = escape_paren( str )
16
+ '(' + str + ')'
17
+ end
18
+
19
+ def Ruby19.escape_bracket( str )
20
+ re = /(?<!\\)([\<\>])/ # Only match unescaped brackets
21
+ str.gsub(re) { |s| '\\' + s }
22
+ end
23
+
24
+ def Ruby19.bracket( str )
25
+ str = $1 if str =~ /^\<(.*)?\>$/
26
+ str = escape_bracket( str )
27
+ '<' + str + '>'
28
+ end
29
+
30
+ def Ruby19.decode_base64(str)
31
+ str.unpack( 'm' ).first
32
+ end
33
+
34
+ def Ruby19.encode_base64(str)
35
+ [str].pack( 'm' )
36
+ end
37
+
38
+ def Ruby19.has_constant?(klass, string)
39
+ klass.const_defined?( string, false )
40
+ end
41
+
42
+ def Ruby19.get_constant(klass, string)
43
+ klass.const_get( string )
44
+ end
45
+
46
+ def Ruby19.b_value_encode(str, encoding = nil)
47
+ encoding = str.encoding.to_s
48
+ [Ruby19.encode_base64(str), encoding]
49
+ end
50
+
51
+ def Ruby19.b_value_decode(str)
52
+ match = str.match(/\=\?(.+)?\?[Bb]\?(.+)?\?\=/m)
53
+ if match
54
+ encoding = match[1]
55
+ str = Ruby19.decode_base64(match[2])
56
+ str.force_encoding(fix_encoding(encoding))
57
+ end
58
+ decoded = str.encode("utf-8", :invalid => :replace, :replace => "")
59
+ decoded.valid_encoding? ? decoded : decoded.encode("utf-16le", :invalid => :replace, :replace => "").encode("utf-8")
60
+ end
61
+
62
+ def Ruby19.q_value_encode(str, encoding = nil)
63
+ encoding = str.encoding.to_s
64
+ [Encodings::QuotedPrintable.encode(str), encoding]
65
+ end
66
+
67
+ def Ruby19.q_value_decode(str)
68
+ match = str.match(/\=\?(.+)?\?[Qq]\?(.+)?\?\=/m)
69
+ if match
70
+ encoding = match[1]
71
+ str = Encodings::QuotedPrintable.decode(match[2])
72
+ str.force_encoding(fix_encoding(encoding))
73
+ end
74
+ decoded = str.encode("utf-8", :invalid => :replace, :replace => "")
75
+ decoded.valid_encoding? ? decoded : decoded.encode("utf-16le", :invalid => :replace, :replace => "").encode("utf-8")
76
+ end
77
+
78
+ def Ruby19.param_decode(str, encoding)
79
+ string = uri_parser.unescape(str)
80
+ string.force_encoding(encoding) if encoding
81
+ string
82
+ end
83
+
84
+ def Ruby19.param_encode(str)
85
+ encoding = str.encoding.to_s.downcase
86
+ language = Configuration.instance.param_encode_language
87
+ "#{encoding}'#{language}'#{uri_parser.escape(str)}"
88
+ end
89
+
90
+ def Ruby19.uri_parser
91
+ @uri_parser ||= URI::Parser.new
92
+ end
93
+
94
+ # mails somtimes includes invalid encodings like iso885915 or utf8 so we transform them to iso885915 or utf8
95
+ # TODO: add this as a test somewhere
96
+ # Encoding.list.map{|e| [e.to_s.upcase==fix_encoding(e.to_s.downcase.gsub("-", "")), e.to_s] }.select {|a,b| !b}
97
+ # Encoding.list.map{|e| [e.to_s==fix_encoding(e.to_s), e.to_s] }.select {|a,b| !b}
98
+ def Ruby19.fix_encoding(encoding)
99
+ case encoding
100
+ # ISO-8859-15, ISO-2022-JP and alike
101
+ when /iso-?(\d{4})-?(\w{1,2})/i then return "ISO-#{$1}-#{$2}"
102
+ # "ISO-2022-JP-KDDI" and alike
103
+ when /iso-?(\d{4})-?(\w{1,2})-?(\w*)/i then return "ISO-#{$1}-#{$2}-#{$3}"
104
+ # UTF-8, UTF-32BE and alike
105
+ when /utf-?(\d{1,2})?(\w{1,2})/i then return "UTF-#{$1}#{$2}"
106
+ # Windows-1252 and alike
107
+ when /Windows-?(.*)/i then return "Windows-#{$1}"
108
+ #more aliases to be added if needed
109
+ else return encoding
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,125 @@
1
+ namespace :corpus do
2
+
3
+ task :load_mail do
4
+ require File.expand_path('../../../spec/environment')
5
+ require 'mail'
6
+ end
7
+
8
+ # Used to run parsing against an arbitrary corpus of email.
9
+ # For example: http://plg.uwaterloo.ca/~gvcormac/treccorpus/
10
+ desc "Provide a LOCATION=/some/dir to verify parsing in bulk, otherwise defaults"
11
+ task :verify_all => :load_mail do
12
+
13
+ root_of_corpus = ENV['LOCATION'] || 'corpus/spam'
14
+ @save_failures_to = ENV['SAVE_TO'] || 'spec/fixtures/emails/failed_emails'
15
+ @failed_emails = []
16
+ @checked_count = 0
17
+
18
+ if root_of_corpus
19
+ root_of_corpus = File.expand_path(root_of_corpus)
20
+ if not File.directory?(root_of_corpus)
21
+ raise "\n\tPath '#{root_of_corpus}' is not a directory.\n\n"
22
+ end
23
+ else
24
+ raise "\n\tSupply path to corpus: LOCATION=/path/to/corpus\n\n"
25
+ end
26
+
27
+ if @save_failures_to
28
+ if not File.directory?(@save_failures_to)
29
+ raise "\n\tPath '#{@save_failures_to}' is not a directory.\n\n"
30
+ end
31
+ @save_failures_to = File.expand_path(@save_failures_to)
32
+ puts "Mail which fails to parse will be saved in '#{@save_failures_to}'"
33
+ end
34
+
35
+ puts "Checking '#{root_of_corpus}' directory (recursively)"
36
+
37
+ # we're tracking all the errors separately, don't clutter terminal
38
+ $stderr_backup = $stderr.dup
39
+ $stderr.reopen("/dev/null", "w")
40
+ STDERR = $stderr
41
+
42
+ dir_node(root_of_corpus)
43
+
44
+ # put our toys back now that we're done with them
45
+ $stderr = $stderr_backup.dup
46
+ STDERR = $stderr
47
+
48
+ puts "\n\n"
49
+
50
+ if @failed_emails.any?
51
+ report_failures_to_stdout
52
+ end
53
+ puts "Out of Total: #{@checked_count}"
54
+
55
+ if @save_failures_to
56
+ puts "Add SAVE_TO=/some/dir to save failed emails to for review.,"
57
+ puts "May result in a lot of saved files. Do a dry run first!\n\n"
58
+ else
59
+ puts "There are no errors"
60
+ end
61
+ end
62
+
63
+ def dir_node(path)
64
+ puts "\n\n"
65
+ puts "Checking emails in '#{path}':"
66
+
67
+ entries = Dir.entries(path)
68
+
69
+ entries.each do |entry|
70
+ next if ['.', '..'].include?(entry)
71
+ full_path = File.join(path, entry)
72
+
73
+ if File.file?(full_path)
74
+ file_node(full_path)
75
+ elsif File.directory?(full_path)
76
+ dir_node(full_path)
77
+ end
78
+ end
79
+ end
80
+
81
+ def file_node(path)
82
+ verify(path)
83
+ end
84
+
85
+ def verify(path)
86
+ result, message = parse_as_mail(path)
87
+ if result
88
+ print '.'
89
+ $stdout.flush
90
+ else
91
+ save_failure(path, message)
92
+ print 'x'
93
+ end
94
+ end
95
+
96
+ def save_failure(path, message)
97
+ @failed_emails << [path, message]
98
+ if @save_failures_to
99
+ email_basename = File.basename(path)
100
+ failure_as_filename = message.gsub(/\W/, '_')
101
+ new_email_name = [failure_as_filename, email_basename].join("_")
102
+ File.open(File.join(@save_failures_to, new_email_name), 'w+') do |fh|
103
+ fh << File.read(path)
104
+ end
105
+ end
106
+ end
107
+
108
+ def parse_as_mail(path)
109
+ @checked_count += 1
110
+ begin
111
+ parsed_mail = Mail.read(path)
112
+ [true, nil]
113
+ rescue => e
114
+ [false, e.message]
115
+ end
116
+ end
117
+
118
+ def report_failures_to_stdout
119
+ @failed_emails.each do |failed|
120
+ puts "#{failed[0]} : #{failed[1]}"
121
+ end
122
+ puts "Failed: #{@failed_emails.size}"
123
+ end
124
+
125
+ end
@@ -0,0 +1,10 @@
1
+ namespace :treetop do
2
+
3
+ desc "Pre-generate all the .treetop files into .rb files"
4
+ task :generate do
5
+ Dir.glob(File.expand_path('../../mail/parsers/*.treetop', __FILE__)).each do |filename|
6
+ `bundle exec tt #{filename}`
7
+ end
8
+ end
9
+
10
+ end
metadata ADDED
@@ -0,0 +1,221 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mail-trunk
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.3.0
5
+ platform: ruby
6
+ authors:
7
+ - Mikel Lindsaar
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2011-12-28 00:00:00 +02:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: mime-types
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ~>
22
+ - !ruby/object:Gem::Version
23
+ version: "1.16"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: treetop
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 1.4.8
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: i18n
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 0.4.0
44
+ version:
45
+ description: A really Ruby Mail handler.
46
+ email: raasdnil@gmail.com
47
+ executables: []
48
+
49
+ extensions: []
50
+
51
+ extra_rdoc_files:
52
+ - README.mkd
53
+ - CHANGELOG.rdoc
54
+ - TODO.rdoc
55
+ files:
56
+ - README.mkd
57
+ - CHANGELOG.rdoc
58
+ - Dependencies.txt
59
+ - Gemfile
60
+ - Rakefile
61
+ - TODO.rdoc
62
+ - lib/mail.rb
63
+ - lib/tasks/treetop.rake
64
+ - lib/tasks/corpus.rake
65
+ - lib/VERSION
66
+ - lib/mail/patterns.rb
67
+ - lib/mail/message.rb
68
+ - lib/mail/multibyte/unicode.rb
69
+ - lib/mail/multibyte/chars.rb
70
+ - lib/mail/multibyte/utils.rb
71
+ - lib/mail/multibyte/exceptions.rb
72
+ - lib/mail/header.rb
73
+ - lib/mail/version_specific/ruby_1_9.rb
74
+ - lib/mail/version_specific/ruby_1_8.rb
75
+ - lib/mail/version.rb
76
+ - lib/mail/mail.rb
77
+ - lib/mail/multibyte.rb
78
+ - lib/mail/elements/phrase_list.rb
79
+ - lib/mail/elements/content_type_element.rb
80
+ - lib/mail/elements/content_location_element.rb
81
+ - lib/mail/elements/content_disposition_element.rb
82
+ - lib/mail/elements/received_element.rb
83
+ - lib/mail/elements/address_list.rb
84
+ - lib/mail/elements/date_time_element.rb
85
+ - lib/mail/elements/address.rb
86
+ - lib/mail/elements/message_ids_element.rb
87
+ - lib/mail/elements/mime_version_element.rb
88
+ - lib/mail/elements/content_transfer_encoding_element.rb
89
+ - lib/mail/elements/envelope_from_element.rb
90
+ - lib/mail/envelope.rb
91
+ - lib/mail/utilities.rb
92
+ - lib/mail/field_list.rb
93
+ - lib/mail/fields/resent_bcc_field.rb
94
+ - lib/mail/fields/received_field.rb
95
+ - lib/mail/fields/sender_field.rb
96
+ - lib/mail/fields/content_disposition_field.rb
97
+ - lib/mail/fields/resent_cc_field.rb
98
+ - lib/mail/fields/content_location_field.rb
99
+ - lib/mail/fields/cc_field.rb
100
+ - lib/mail/fields/resent_to_field.rb
101
+ - lib/mail/fields/references_field.rb
102
+ - lib/mail/fields/resent_from_field.rb
103
+ - lib/mail/fields/content_type_field.rb
104
+ - lib/mail/fields/date_field.rb
105
+ - lib/mail/fields/content_id_field.rb
106
+ - lib/mail/fields/from_field.rb
107
+ - lib/mail/fields/resent_sender_field.rb
108
+ - lib/mail/fields/common/common_message_id.rb
109
+ - lib/mail/fields/common/common_address.rb
110
+ - lib/mail/fields/common/common_field.rb
111
+ - lib/mail/fields/common/parameter_hash.rb
112
+ - lib/mail/fields/common/common_date.rb
113
+ - lib/mail/fields/common/address_container.rb
114
+ - lib/mail/fields/content_description_field.rb
115
+ - lib/mail/fields/in_reply_to_field.rb
116
+ - lib/mail/fields/message_id_field.rb
117
+ - lib/mail/fields/structured_field.rb
118
+ - lib/mail/fields/mime_version_field.rb
119
+ - lib/mail/fields/optional_field.rb
120
+ - lib/mail/fields/to_field.rb
121
+ - lib/mail/fields/return_path_field.rb
122
+ - lib/mail/fields/unstructured_field.rb
123
+ - lib/mail/fields/resent_date_field.rb
124
+ - lib/mail/fields/reply_to_field.rb
125
+ - lib/mail/fields/comments_field.rb
126
+ - lib/mail/fields/resent_message_id_field.rb
127
+ - lib/mail/fields/content_transfer_encoding_field.rb
128
+ - lib/mail/fields/bcc_field.rb
129
+ - lib/mail/fields/keywords_field.rb
130
+ - lib/mail/fields/subject_field.rb
131
+ - lib/mail/elements.rb
132
+ - lib/mail/fields.rb
133
+ - lib/mail/core_extensions/smtp.rb
134
+ - lib/mail/core_extensions/shellwords.rb
135
+ - lib/mail/core_extensions/string.rb
136
+ - lib/mail/core_extensions/nil.rb
137
+ - lib/mail/core_extensions/object.rb
138
+ - lib/mail/core_extensions/string/multibyte.rb
139
+ - lib/mail/core_extensions/string/access.rb
140
+ - lib/mail/configuration.rb
141
+ - lib/mail/body.rb
142
+ - lib/mail/attachments_list.rb
143
+ - lib/mail/encodings/7bit.rb
144
+ - lib/mail/encodings/binary.rb
145
+ - lib/mail/encodings/quoted_printable.rb
146
+ - lib/mail/encodings/base64.rb
147
+ - lib/mail/encodings/8bit.rb
148
+ - lib/mail/encodings/transfer_encoding.rb
149
+ - lib/mail/indifferent_hash.rb
150
+ - lib/mail/field.rb
151
+ - lib/mail/parsers/date_time.treetop
152
+ - lib/mail/parsers/content_type.rb
153
+ - lib/mail/parsers/received.rb
154
+ - lib/mail/parsers/date_time.rb
155
+ - lib/mail/parsers/rfc2045.treetop
156
+ - lib/mail/parsers/message_ids.rb
157
+ - lib/mail/parsers/phrase_lists.rb
158
+ - lib/mail/parsers/rfc2822_obsolete.rb
159
+ - lib/mail/parsers/envelope_from.treetop
160
+ - lib/mail/parsers/content_disposition.rb
161
+ - lib/mail/parsers/received.treetop
162
+ - lib/mail/parsers/rfc2822_obsolete.treetop
163
+ - lib/mail/parsers/mime_version.rb
164
+ - lib/mail/parsers/phrase_lists.treetop
165
+ - lib/mail/parsers/content_location.treetop
166
+ - lib/mail/parsers/mime_version.treetop
167
+ - lib/mail/parsers/rfc2822.treetop
168
+ - lib/mail/parsers/content_transfer_encoding.rb
169
+ - lib/mail/parsers/message_ids.treetop
170
+ - lib/mail/parsers/content_disposition.treetop
171
+ - lib/mail/parsers/rfc2045.rb
172
+ - lib/mail/parsers/address_lists.rb
173
+ - lib/mail/parsers/rfc2822.rb
174
+ - lib/mail/parsers/content_type.treetop
175
+ - lib/mail/parsers/content_location.rb
176
+ - lib/mail/parsers/content_transfer_encoding.treetop
177
+ - lib/mail/parsers/envelope_from.rb
178
+ - lib/mail/parsers/address_lists.treetop
179
+ - lib/mail/part.rb
180
+ - lib/mail/encodings.rb
181
+ - lib/mail/network/retriever_methods/base.rb
182
+ - lib/mail/network/retriever_methods/imap.rb
183
+ - lib/mail/network/retriever_methods/pop3.rb
184
+ - lib/mail/network/retriever_methods/test_retriever.rb
185
+ - lib/mail/network/delivery_methods/smtp.rb
186
+ - lib/mail/network/delivery_methods/sendmail.rb
187
+ - lib/mail/network/delivery_methods/test_mailer.rb
188
+ - lib/mail/network/delivery_methods/smtp_connection.rb
189
+ - lib/mail/network/delivery_methods/file_delivery.rb
190
+ - lib/mail/network.rb
191
+ - lib/mail/parts_list.rb
192
+ has_rdoc: true
193
+ homepage: http://github.com/mikel/mail
194
+ licenses: []
195
+
196
+ post_install_message:
197
+ rdoc_options: []
198
+
199
+ require_paths:
200
+ - lib
201
+ required_ruby_version: !ruby/object:Gem::Requirement
202
+ requirements:
203
+ - - ">="
204
+ - !ruby/object:Gem::Version
205
+ version: "0"
206
+ version:
207
+ required_rubygems_version: !ruby/object:Gem::Requirement
208
+ requirements:
209
+ - - ">="
210
+ - !ruby/object:Gem::Version
211
+ version: "0"
212
+ version:
213
+ requirements: []
214
+
215
+ rubyforge_project:
216
+ rubygems_version: 1.3.5
217
+ signing_key:
218
+ specification_version: 3
219
+ summary: Mail provides a nice Ruby DSL for making, sending and reading emails.
220
+ test_files: []
221
+