bounce_email 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9fe2e41f68b363d56e006effeefda2677e50efc2
4
+ data.tar.gz: e49e1d1201f050555dd8698f501e24bb1e5d0c9f
5
+ SHA512:
6
+ metadata.gz: dac46158c4ec4666b8a94a2c3cde4ae426e5865e52d8e9117356f04103fe569d551a363c912f21df6fd2358867892dd9b7d20725cc27acb7424d13e752b0bd1f
7
+ data.tar.gz: 0fbffdd4385603a275a871f5e77471c7454364b5cc8e949869cc4300ae1aced6a0703637249c6d308db90eb2de6a8534cc93d7376e87c7958152103e004317cf
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
+ .bundle
1
2
  doc
2
3
  pkg
3
4
  .rvmrc
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ rvm:
2
+ - 1.9.3
3
+ - 2.0.0
4
+ - 2.1.0
5
+ - 2.2.0
6
+
7
+ script: "bundle exec rake test"
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source "http://rubygems.org"
1
+ source "https://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in bounce-email2.gemspec
4
4
  gemspec
data/HISTORY.md CHANGED
@@ -1,4 +1,21 @@
1
+ ## 0.2.3
2
+
3
+ * add support for Gmail bounces (@saghaulor, livebg/bounce_email#4)
4
+
5
+ ## 0.2.2
6
+
7
+ * fix a failure when an email has no subject header
8
+
9
+ ## 0.2.1
10
+
11
+ * fix Ruby 1.8.7 compatibility
12
+
13
+ ## 0.2.0
14
+
15
+ * new versioning due to new gem being published
16
+
1
17
  ## 0.1.1 2011-09-01
18
+
2
19
  * extended #bounced? to consider error_status and diagnostic_code as well
3
20
  * updated external gems
4
21
 
data/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  This Ruby library is for determining the bounce type of an email message. It determines whether the bounce is hard or soft, if is an "out of office mail", etc.
4
4
 
5
+ [![Build Status](https://api.travis-ci.org/livebg/bounce_email.png)](https://travis-ci.org/livebg/bounce_email)
6
+
5
7
  ## SYNOPSIS:
6
8
 
7
9
  Follow this tutorial to handle bounce-emails: [http://keakaj.com/wisdom/2007/08/08/verp-on-rails](http://keakaj.com/wisdom/2007/08/08/verp-on-rails/)
@@ -19,10 +21,19 @@ Basic usage:
19
21
  bounce.type # "Permanent Failure", "Persistent Transient Failure", "Success" -- BounceEmail::TYPE_HARD_FAIL, TYPE_SOFT_FAIL, TYPE_SUCCESS
20
22
 
21
23
 
24
+ ## Compatibility
25
+
26
+ Compatible with Ruby 1.9.x, 2.0.0, 2.1.0, and 2.2.0.
27
+
28
+ It is no longer tested under 1.8.7, but it should work there as well, if you use it with an older version of the `mime-types` gem (from the 1.x branch). `mime-types` is a dependency of the `mail` gem, which currently works with `mime-types` 1.6+, so it should be possible.
29
+
22
30
  ## REQUIREMENTS:
23
31
 
24
- Ruby 1.9 & Ruby Gem Mail is required. The gem is used for primary bounce handling, which catches about 50% of all bounces.
25
- For most other bounces, this gem comes in. See discussion here: [https://github.com/mikel/mail/issues/103](https://github.com/mikel/mail/issues/103)
32
+ [mail](http://rubygems.org/gems/mail) gem is required with `bounce_email` gem.
33
+ The `mail` gem is used for primary bounce handling, which catches about 50% of
34
+ all bounces. `bounce_email` tries to catch remaining bounce emails.
35
+
36
+ See discussion here: [https://github.com/mikel/mail/issues/103](https://github.com/mikel/mail/issues/103)
26
37
 
27
38
  ## Other implementations:
28
39
 
@@ -31,11 +42,11 @@ For most other bounces, this gem comes in. See discussion here: [https://github.
31
42
 
32
43
  ## TODO:
33
44
 
34
- * code cleanup!!! Oh yes!
35
- * don't hardcode comparison strings, move to external file which can be extended easily
36
- * more test: extend for more bounces
37
- * is OUT of office type needed? if yes implement as optional part
38
- * merge into Mail Gem??
45
+ * Mode code cleanup.
46
+ * Don't hardcode comparison strings, move to external file which can be extended easily.
47
+ * More test: extend for more bounces.
48
+ * Is OUT of office type needed? If yes, implement as an optional part.
49
+ * Merge into Mail Gem?
39
50
 
40
51
  ## CONTRIBUTIONS:
41
52
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.2
1
+ 0.2.3
data/bounce_email.gemspec CHANGED
@@ -19,5 +19,9 @@ Gem::Specification.new do |s|
19
19
  ["mail"].each do |gem|
20
20
  s.add_dependency *gem.split(' ')
21
21
  end
22
+
23
+ ["rake"].each do |gem|
24
+ s.add_development_dependency *gem.split(' ')
25
+ end
22
26
  end
23
27
 
data/lib/bounce_email.rb CHANGED
@@ -1,10 +1,16 @@
1
- # encoding: UTF-8
1
+ # encoding: utf-8
2
2
  require 'mail'
3
3
 
4
4
  module BounceEmail
5
5
  TYPE_HARD_FAIL = 'Permanent Failure'
6
6
  TYPE_SOFT_FAIL = 'Persistent Transient Failure'
7
7
  TYPE_SUCCESS = 'Success'
8
+ INLINE_MESSAGE_BEGIN_DELIMITERS = [
9
+ 'Original message',
10
+ 'Below this line is a copy of the message.',
11
+ 'Message header follows'
12
+ ].map { |delimiter| Regexp.new(/^[-\s]*#{delimiter}[\s-]*$/) }
13
+ INLINE_MESSAGE_END_DELIMITER = /^[-\s]*End of message[\s-]*$/
8
14
 
9
15
  #qmail
10
16
  # Status codes are defined in rfc3463, http://www.ietf.org/rfc/rfc3463.txt
@@ -212,15 +218,24 @@ module BounceEmail
212
218
  false
213
219
  end
214
220
 
215
- def get_original_mail(mail) #worked alright for me, for sure this as to be extended
216
- parts = mail.body.to_s.split(/--- Below this line is a copy of the message.(\r\n\r\n|\n\n)/)
217
- if parts.size > 1
218
- ::Mail.new(parts.last)
219
- elsif mail.parts
220
- ::Mail.new(mail.parts[2].body)
221
+ def get_original_mail(mail) #worked alright for me, for sure this has to be extended
222
+ if mail.multipart?
223
+ ::Mail.new(mail.parts.last)
224
+ elsif i = index_of_original_message_delimiter(mail)
225
+ ::Mail.new(extract_original_message_after_delimiter(mail, i))
221
226
  end
222
227
  rescue => e
223
228
  nil
224
229
  end
230
+
231
+ def index_of_original_message_delimiter(mail)
232
+ INLINE_MESSAGE_BEGIN_DELIMITERS.find_index { |delimiter| self.body.to_s.match delimiter }
233
+ end
234
+
235
+ def extract_original_message_after_delimiter(mail, delimiter_index)
236
+ delimiter = INLINE_MESSAGE_BEGIN_DELIMITERS[delimiter_index]
237
+ message = mail.body.to_s.split(delimiter).last
238
+ message.split(INLINE_MESSAGE_END_DELIMITER).first.strip if message.match(INLINE_MESSAGE_END_DELIMITER)
239
+ end
225
240
  end
226
- end
241
+ end
@@ -107,11 +107,27 @@ class BounceEmailTest < Test::Unit::TestCase
107
107
  assert_not_nil bounce.original_mail
108
108
  end
109
109
 
110
- #Test regexp in when parsing the original email
111
- def test_multipart
112
- bounce = test_bounce('tt_bounce_25')
113
- assert bounce.bounced?
114
- assert_not_nil bounce.original_mail
110
+ def test_original_message_with_multipart_mails
111
+ multipart_mails = %w(03 04 05 07 10 11 13 15 16 23 24)
112
+ multipart_mails.map do |file|
113
+ mail = File.join(File.dirname(__FILE__), 'bounces', "tt_bounce_#{file}.txt")
114
+ bounce = BounceEmail::Mail.new Mail.read(mail)
115
+ assert_not_nil bounce.original_mail
116
+ end
117
+ end
118
+
119
+ def test_original_message_without_inline_original_message
120
+ bounce = test_bounce('tt_bounce_01')
121
+ assert_nil bounce.original_mail
122
+ end
123
+
124
+ def test_original_message_with_inline_original_message
125
+ mails_with_inline_original_message = %w(06 08 09 12_soft 14 17 18 19 20 21 22 25)
126
+ mails_with_inline_original_message.map do |file|
127
+ mail = File.join(File.dirname(__FILE__), 'bounces', "tt_bounce_#{file}.txt")
128
+ bounce = BounceEmail::Mail.new Mail.read(mail)
129
+ assert_not_nil bounce.original_mail
130
+ end
115
131
  end
116
132
 
117
133
  private
metadata CHANGED
@@ -1,15 +1,9 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: bounce_email
3
- version: !ruby/object:Gem::Version
4
- hash: 19
5
- prerelease:
6
- segments:
7
- - 0
8
- - 2
9
- - 2
10
- version: 0.2.2
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.3
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Tobias Bielohlawek
14
8
  - Agris Ameriks
15
9
  - Pedro Visintin
@@ -17,34 +11,45 @@ authors:
17
11
  autorequire:
18
12
  bindir: bin
19
13
  cert_chain: []
20
-
21
- date: 2011-10-28 00:00:00 +03:00
22
- default_executable:
23
- dependencies:
24
- - !ruby/object:Gem::Dependency
14
+ date: 2015-04-01 00:00:00.000000000 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
25
17
  name: mail
26
- prerelease: false
27
- requirement: &id001 !ruby/object:Gem::Requirement
28
- none: false
29
- requirements:
18
+ requirement: !ruby/object:Gem::Requirement
19
+ requirements:
30
20
  - - ">="
31
- - !ruby/object:Gem::Version
32
- hash: 3
33
- segments:
34
- - 0
35
- version: "0"
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
36
23
  type: :runtime
37
- version_requirements: *id001
38
- description: fork of whatcould/bounce-email incl. patches from wakiki, peterpunk, agowan & rngtng
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ type: :development
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ description: fork of whatcould/bounce-email incl. patches from wakiki, peterpunk,
45
+ agowan & rngtng
39
46
  email: tobi@rngtng.com
40
47
  executables: []
41
-
42
48
  extensions: []
43
-
44
49
  extra_rdoc_files: []
45
-
46
- files:
47
- - .gitignore
50
+ files:
51
+ - ".gitignore"
52
+ - ".travis.yml"
48
53
  - Gemfile
49
54
  - HISTORY.md
50
55
  - Manifest.txt
@@ -101,41 +106,30 @@ files:
101
106
  - test/non_bounces/tt_1234211024.txt
102
107
  - test/non_bounces/tt_1234241664.txt
103
108
  - test/test_helper.rb
104
- has_rdoc: true
105
109
  homepage: http://github.com/mitio/bounce_email
106
110
  licenses: []
107
-
111
+ metadata: {}
108
112
  post_install_message:
109
113
  rdoc_options: []
110
-
111
- require_paths:
114
+ require_paths:
112
115
  - lib
113
- required_ruby_version: !ruby/object:Gem::Requirement
114
- none: false
115
- requirements:
116
+ required_ruby_version: !ruby/object:Gem::Requirement
117
+ requirements:
116
118
  - - ">="
117
- - !ruby/object:Gem::Version
118
- hash: 3
119
- segments:
120
- - 0
121
- version: "0"
122
- required_rubygems_version: !ruby/object:Gem::Requirement
123
- none: false
124
- requirements:
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ required_rubygems_version: !ruby/object:Gem::Requirement
122
+ requirements:
125
123
  - - ">="
126
- - !ruby/object:Gem::Version
127
- hash: 3
128
- segments:
129
- - 0
130
- version: "0"
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
131
126
  requirements: []
132
-
133
127
  rubyforge_project:
134
- rubygems_version: 1.6.2
128
+ rubygems_version: 2.2.2
135
129
  signing_key:
136
- specification_version: 3
130
+ specification_version: 4
137
131
  summary: Detect kind of bounced email
138
- test_files:
132
+ test_files:
139
133
  - test/bounce_email_test.rb
140
134
  - test/bounces/malformed_bounce_01.txt
141
135
  - test/bounces/tt_1234175799.txt