astrotrain 0.6.1 → 0.6.2
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.
- data/astrotrain.gemspec +3 -2
- data/lib/astrotrain.rb +2 -2
- data/lib/astrotrain/message.rb +14 -7
- data/test/fixtures/email_in_body.txt +19 -0
- data/test/message_test.rb +6 -1
- metadata +18 -17
data/astrotrain.gemspec
CHANGED
@@ -13,8 +13,8 @@ Gem::Specification.new do |s|
|
|
13
13
|
## If your rubyforge_project name is different, then edit it and comment out
|
14
14
|
## the sub! line in the Rakefile
|
15
15
|
s.name = 'astrotrain'
|
16
|
-
s.version = '0.6.
|
17
|
-
s.date = '2012-04-
|
16
|
+
s.version = '0.6.2'
|
17
|
+
s.date = '2012-04-18'
|
18
18
|
s.rubyforge_project = 'astrotrain'
|
19
19
|
|
20
20
|
## Make sure your summary is short. The description may be as long
|
@@ -65,6 +65,7 @@ Gem::Specification.new do |s|
|
|
65
65
|
test/fixtures/bad_email_format.txt
|
66
66
|
test/fixtures/basic.txt
|
67
67
|
test/fixtures/custom.txt
|
68
|
+
test/fixtures/email_in_body.txt
|
68
69
|
test/fixtures/fwd.txt
|
69
70
|
test/fixtures/gb2312_encoding.txt
|
70
71
|
test/fixtures/gb2312_encoding_invalid.txt
|
data/lib/astrotrain.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module Astrotrain
|
2
|
-
VERSION = '0.6.
|
2
|
+
VERSION = '0.6.2'
|
3
3
|
|
4
4
|
require 'utf8'
|
5
5
|
require 'charlock_holmes'
|
@@ -21,7 +21,7 @@ module Astrotrain
|
|
21
21
|
def self.deliver(message, destination, options = {})
|
22
22
|
uri = Addressable::URI.parse(destination.to_s)
|
23
23
|
klass = Transports.load(uri.scheme)
|
24
|
-
klass.deliver(message, destination,
|
24
|
+
klass.deliver(message, destination,
|
25
25
|
:recipient => options[:recipient],
|
26
26
|
:extra => options[:payload])
|
27
27
|
end
|
data/lib/astrotrain/message.rb
CHANGED
@@ -6,7 +6,7 @@ require 'set'
|
|
6
6
|
module Astrotrain
|
7
7
|
# Wrapper around a TMail object
|
8
8
|
class Message
|
9
|
-
EMAIL_REGEX = /[\w\.\_\%\+\-]+[
|
9
|
+
EMAIL_REGEX = /[\w\.\_\%\+\-]+[^\s\.]@[\w\-\_\.]+/
|
10
10
|
|
11
11
|
# Reference to the internal Mail object that parsed the raw email.
|
12
12
|
attr_reader :mail
|
@@ -23,7 +23,8 @@ module Astrotrain
|
|
23
23
|
x-original-to received)
|
24
24
|
|
25
25
|
# This is the default order that Astrotrain will search for a matching
|
26
|
-
# recipient.
|
26
|
+
# recipient. Set this to a different order. Add "body" to the list if
|
27
|
+
# you want to scan the body for email addresses with EMAIL_REGEX.
|
27
28
|
self.recipient_header_order = %w(original_to delivered_to to)
|
28
29
|
|
29
30
|
# Public: Parses the raw email headers into a Astrotrain::Message instance.
|
@@ -63,7 +64,6 @@ module Astrotrain
|
|
63
64
|
def recipients(order = nil)
|
64
65
|
if !@recipients.key?(order)
|
65
66
|
order = self.class.recipient_header_order if order.blank?
|
66
|
-
order.push :body
|
67
67
|
recipients = []
|
68
68
|
|
69
69
|
emails = order.inject([]) do |memo, key|
|
@@ -183,7 +183,9 @@ module Astrotrain
|
|
183
183
|
def recipients_from_body
|
184
184
|
@recipients_from_body ||= begin
|
185
185
|
emails_from_body = body.scan(EMAIL_REGEX)
|
186
|
-
address_list_for(emails_from_body)
|
186
|
+
address_list_for(emails_from_body, true)
|
187
|
+
rescue Mail::Field::ParseError
|
188
|
+
[]
|
187
189
|
end
|
188
190
|
end
|
189
191
|
|
@@ -224,17 +226,22 @@ module Astrotrain
|
|
224
226
|
|
225
227
|
# Uses Mail::AddressList to parse the given comma separated emails.
|
226
228
|
#
|
227
|
-
# emails - Array of String
|
229
|
+
# emails - Array of String email headers.
|
230
|
+
# Example: ["foo@example.com, Bar <bar@example.com>", ...]
|
228
231
|
#
|
229
232
|
# Returns Array of Mail::Address objects
|
230
|
-
def address_list_for(emails)
|
233
|
+
def address_list_for(emails, retried = false)
|
231
234
|
emails = emails * ", "
|
232
235
|
list = Mail::AddressList.new(self.class.unescape(emails))
|
233
236
|
addrs = list.addresses.each { |a| a.decoded }
|
234
237
|
addrs.uniq!
|
235
238
|
addrs
|
236
239
|
rescue Mail::Field::ParseError
|
237
|
-
|
240
|
+
if retried
|
241
|
+
raise
|
242
|
+
else
|
243
|
+
address_list_for(emails.scan(EMAIL_REGEX), true)
|
244
|
+
end
|
238
245
|
end
|
239
246
|
|
240
247
|
# Stolen from Rack/Camping, remove the "+" => " " translation
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Delivered-To: "Processor" <processor@astrotrain.com>
|
2
|
+
Message-ID: <a16be7390810161014n52b603e9k1aa6bb803c6735aa@mail.gmail.com>
|
3
|
+
Received: by 10.231.149.194 with SMTP id u2mr924086ibv.32.1298067999839; Fri, 18 Feb 2011 14:26:39 -0800
|
4
|
+
Received: by 10.231.153.2 with HTTP; Fri, 18 Feb 2011 14:26:39 -0800
|
5
|
+
Date: Thu, 16 Oct 2008 10:14:18 -0700
|
6
|
+
From: Bob <user@example.com>
|
7
|
+
To: Processor <processor@astrotrain.com>
|
8
|
+
Cc: Fred <fred@example.com>
|
9
|
+
Subject: Fwd: blah blah
|
10
|
+
MIME-Version: 1.0
|
11
|
+
X-Custom: reply
|
12
|
+
Content-Type: text/plain; charset=ISO-8859-1
|
13
|
+
Content-Transfer-Encoding: 7bit
|
14
|
+
Content-Disposition: inline
|
15
|
+
|
16
|
+
---------- Forwarded message ----------
|
17
|
+
booya. @technoweenie
|
18
|
+
foo@bar.com
|
19
|
+
|
data/test/message_test.rb
CHANGED
@@ -124,7 +124,7 @@ class MessageParsingTest < Test::Unit::TestCase
|
|
124
124
|
msg = astrotrain(:multiple_with_body_recipients)
|
125
125
|
|
126
126
|
assert_equal %w(processor@astrotrain.com other@example.com processor+foobar@astrotrain.com processor+blah@astrotrain.com),
|
127
|
-
msg.recipients
|
127
|
+
msg.recipients(Astrotrain::Message.recipient_header_order + %w(body))
|
128
128
|
end
|
129
129
|
|
130
130
|
test "with only HTML body in a multipart message" do
|
@@ -173,6 +173,11 @@ class MessageParsingTest < Test::Unit::TestCase
|
|
173
173
|
assert_equal([], msg.recipients_from_to)
|
174
174
|
end
|
175
175
|
|
176
|
+
test "parsing emails from body" do
|
177
|
+
msg = astrotrain :email_in_body
|
178
|
+
assert_equal %w(foo@bar.com), msg.recipients_from_body.map(&:address)
|
179
|
+
end
|
180
|
+
|
176
181
|
test "saves path of parsed email" do
|
177
182
|
path = mail(:basic)
|
178
183
|
msg = Astrotrain::Message.read(path)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: astrotrain
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-04-
|
12
|
+
date: 2012-04-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: utf8
|
16
|
-
requirement: &
|
16
|
+
requirement: &70356752937340 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.1.8
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70356752937340
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: mail
|
27
|
-
requirement: &
|
27
|
+
requirement: &70356752936700 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 2.4.0
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70356752936700
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: i18n
|
38
|
-
requirement: &
|
38
|
+
requirement: &70356752936160 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 0.6.0
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70356752936160
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: faraday
|
49
|
-
requirement: &
|
49
|
+
requirement: &70356752935300 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 0.5.0
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70356752935300
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: addressable
|
60
|
-
requirement: &
|
60
|
+
requirement: &70356752934040 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: 2.2.4
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70356752934040
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: charlock_holmes
|
71
|
-
requirement: &
|
71
|
+
requirement: &70356752922600 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ~>
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: 0.6.8
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70356752922600
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: resque
|
82
|
-
requirement: &
|
82
|
+
requirement: &70356752919900 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,7 +87,7 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70356752919900
|
91
91
|
description: email => http post
|
92
92
|
email: technoweenie@gmail.com
|
93
93
|
executables: []
|
@@ -108,6 +108,7 @@ files:
|
|
108
108
|
- test/fixtures/bad_email_format.txt
|
109
109
|
- test/fixtures/basic.txt
|
110
110
|
- test/fixtures/custom.txt
|
111
|
+
- test/fixtures/email_in_body.txt
|
111
112
|
- test/fixtures/fwd.txt
|
112
113
|
- test/fixtures/gb2312_encoding.txt
|
113
114
|
- test/fixtures/gb2312_encoding_invalid.txt
|
@@ -146,7 +147,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
146
147
|
version: '0'
|
147
148
|
requirements: []
|
148
149
|
rubyforge_project: astrotrain
|
149
|
-
rubygems_version: 1.8.
|
150
|
+
rubygems_version: 1.8.10
|
150
151
|
signing_key:
|
151
152
|
specification_version: 2
|
152
153
|
summary: email => http post
|