iron_mailer 0.0.2 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +0 -1
- data/iron_mailer.gemspec +3 -3
- data/lib/iron_mailer/send_email.rb +36 -47
- data/lib/iron_mailer/version.rb +1 -1
- data/spec/iron_mailer/send_email_spec.rb +44 -103
- metadata +6 -22
data/.gitignore
CHANGED
data/iron_mailer.gemspec
CHANGED
@@ -22,8 +22,8 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_development_dependency "rake"
|
23
23
|
spec.add_development_dependency "rspec"
|
24
24
|
spec.add_dependency "mail"
|
25
|
-
spec.add_dependency "iron_mq", '~>
|
26
|
-
spec.add_dependency "iron_cache", '~> 1.
|
25
|
+
spec.add_dependency "iron_mq", '~> 3.1'
|
26
|
+
spec.add_dependency "iron_cache", '~> 1.3'
|
27
27
|
spec.add_dependency "typhoeus"
|
28
|
-
|
28
|
+
|
29
29
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'iron_cache'
|
2
|
-
require 'uuidtools'
|
3
2
|
class IronMailer::SendEmail
|
4
|
-
attr_reader :iron_mq_client, :iron_cache_client, :queue, :cache
|
3
|
+
attr_reader :iron_mq_client, :iron_cache_client, :queue, :cache
|
5
4
|
|
6
5
|
def initialize(options={})
|
7
6
|
@iron_mq_client = IronMQ::Client.new(options['iron_mq'])
|
@@ -9,43 +8,40 @@ class IronMailer::SendEmail
|
|
9
8
|
@iron_cache_client = IronCache::Client.new(options['iron_cache'])
|
10
9
|
|
11
10
|
@cache = @iron_cache_client.cache(options['iron_cache']['cache_name'])
|
12
|
-
|
13
|
-
|
11
|
+
|
12
|
+
Mail.defaults do
|
14
13
|
if options['delivery_method'].is_a?(Hash)
|
15
14
|
delivery_method_hash = options['delivery_method']
|
16
|
-
|
17
|
-
@delivery_method_settings = {}
|
18
|
-
|
19
|
-
params = delivery_method_hash.values.first.clone
|
20
|
-
|
21
|
-
params.keys.each do |key|
|
22
|
-
@delivery_method_settings[key.to_sym] = params[key]
|
23
|
-
end
|
24
|
-
|
15
|
+
delivery_method delivery_method_hash.keys.first.to_sym, delivery_method_hash.values.first
|
25
16
|
else
|
26
|
-
|
27
|
-
@delivery_method_settings={}
|
17
|
+
delivery_method options['delivery_method'].to_sym
|
28
18
|
end
|
29
|
-
|
19
|
+
end
|
30
20
|
end
|
31
21
|
|
32
22
|
def split_email(source_email)
|
33
23
|
tos = source_email.to
|
34
24
|
tos.uniq.map{|destination|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
25
|
+
Mail.new do
|
26
|
+
to destination
|
27
|
+
from source_email.from
|
28
|
+
subject source_email.subject
|
29
|
+
if destination==tos.first
|
30
|
+
message_id source_email.message_id
|
31
|
+
bcc source_email.bcc
|
32
|
+
cc source_email.cc
|
33
|
+
end
|
34
|
+
reply_to source_email.reply_to
|
35
|
+
|
36
|
+
html_part do
|
37
|
+
content_type 'text/html; charset=UTF-8'
|
38
|
+
body source_email.html_part.body.to_s
|
39
|
+
end if source_email.html_part
|
40
|
+
|
41
|
+
text_part do
|
42
|
+
body source_email.text_part.body.to_s
|
43
|
+
end if source_email.text_part
|
44
|
+
end
|
49
45
|
}
|
50
46
|
end
|
51
47
|
|
@@ -54,16 +50,10 @@ class IronMailer::SendEmail
|
|
54
50
|
'date'=>mail.date,
|
55
51
|
'from'=>mail.from,
|
56
52
|
'to'=>mail.to,
|
57
|
-
'
|
53
|
+
'content'=>(mail.html_part || mail.text_part).body.to_s
|
58
54
|
}
|
59
55
|
end
|
60
56
|
|
61
|
-
def cache_email(mail)
|
62
|
-
field = mail.header['X-SMTPAPI'].is_a?(Array) ? mail.header['X-SMTPAPI'].first : mail.header['X-SMTPAPI']
|
63
|
-
cache_key = JSON.parse(field.value)['unique_args']['cache_key']
|
64
|
-
self.cache.put(cache_key, self.extract_cache_info(mail).to_json)
|
65
|
-
end
|
66
|
-
|
67
57
|
def execute
|
68
58
|
messages = self.queue.get(:n=>100)
|
69
59
|
|
@@ -71,28 +61,27 @@ class IronMailer::SendEmail
|
|
71
61
|
messages.each do |message|
|
72
62
|
begin
|
73
63
|
source_email = Mail.new(message.body)
|
74
|
-
|
75
|
-
puts self.delivery_method=>self.delivery_method_settings if self.debug
|
64
|
+
|
76
65
|
mails = self.split_email(source_email)
|
66
|
+
|
77
67
|
mails.each do |mail|
|
78
|
-
mail.delivery_method self.delivery_method, self.delivery_method_settings
|
79
68
|
mail.deliver
|
80
|
-
|
69
|
+
|
70
|
+
self.cache.put(mail.message_id, self.extract_cache_info(mail).to_json)
|
81
71
|
end
|
82
72
|
message.delete
|
83
73
|
rescue Exception=>e
|
84
|
-
if self.debug
|
85
|
-
puts e.message
|
86
|
-
puts e.backtrace
|
87
|
-
end
|
88
74
|
errors << message
|
89
75
|
end
|
90
76
|
end
|
91
77
|
errors.each do |message|
|
92
|
-
puts "Releasing: #{message.id}" if self.debug
|
93
78
|
message.release
|
94
79
|
end
|
95
80
|
|
96
81
|
end
|
97
82
|
|
98
|
-
end
|
83
|
+
end
|
84
|
+
|
85
|
+
if defined?(params)
|
86
|
+
IronMailer::SendEmail.execute(params)
|
87
|
+
end
|
data/lib/iron_mailer/version.rb
CHANGED
@@ -25,8 +25,7 @@ describe IronMailer::SendEmail do
|
|
25
25
|
|
26
26
|
it "should allow setting of a test delivery_method" do
|
27
27
|
IronMailer::SendEmail.new(@options.merge('delivery_method'=>'test'))
|
28
|
-
|
29
|
-
@send_email.delivery_method_settings.class.should == Hash
|
28
|
+
Mail.delivery_method.class.should == Mail::TestMailer
|
30
29
|
end
|
31
30
|
|
32
31
|
describe "iron_mq_client" do
|
@@ -57,43 +56,62 @@ describe IronMailer::SendEmail do
|
|
57
56
|
@send_email.cache.name.should == @options['iron_cache']['cache_name']
|
58
57
|
end
|
59
58
|
end
|
60
|
-
|
61
|
-
it "should set delivery_method" do
|
62
|
-
@send_email.delivery_method.should == @options['delivery_method'].keys.first.to_sym
|
63
|
-
end
|
64
|
-
|
59
|
+
|
65
60
|
describe "smtp_config" do
|
66
61
|
it "should assign the address" do
|
67
|
-
|
62
|
+
Mail.delivery_method.settings['address'].should == @options['delivery_method']['smtp']['address']
|
68
63
|
end
|
69
64
|
|
70
65
|
it "should assign the port" do
|
71
|
-
|
66
|
+
Mail.delivery_method.settings['port'] == @options['delivery_method']['smtp']['port']
|
72
67
|
end
|
73
68
|
|
74
69
|
it "should assign the domain" do
|
75
|
-
|
70
|
+
Mail.delivery_method.settings['domain'] == @options['delivery_method']['smtp']['domain']
|
76
71
|
end
|
77
72
|
|
78
73
|
it "should assign the user_name" do
|
79
|
-
|
74
|
+
Mail.delivery_method.settings['user_name'] == @options['delivery_method']['smtp']['user_name']
|
80
75
|
end
|
81
76
|
|
82
77
|
it "should assign the password" do
|
83
|
-
|
78
|
+
Mail.delivery_method.settings['password'] == @options['delivery_method']['smtp']['password']
|
84
79
|
end
|
85
80
|
|
86
81
|
it "should assign the authentication" do
|
87
|
-
|
82
|
+
Mail.delivery_method.settings['authentication'] == @options['delivery_method']['smtp']['authentication']
|
88
83
|
end
|
89
84
|
|
90
85
|
it "should assign enable_starttls_auto" do
|
91
|
-
|
86
|
+
Mail.delivery_method.settings['enable_starttls_auto'] == @options['delivery_method']['smtp']['enable_starttls_auto']
|
92
87
|
end
|
93
88
|
end
|
94
89
|
|
95
90
|
end
|
96
91
|
|
92
|
+
def test_config
|
93
|
+
@iron_mq_config = JSON.parse(File.read('spec/config/iron_mq.json'))
|
94
|
+
@iron_cache_config = JSON.parse(File.read('spec/config/iron_cache.json'))
|
95
|
+
{'iron_mq'=>@iron_mq_config, 'iron_cache'=>@iron_cache_config.merge('cache_name'=>"test_email_cache"), 'delivery_method'=>'test'}
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_email(other_tos=[])
|
99
|
+
to = (['to@example.com']<<other_tos)
|
100
|
+
|
101
|
+
mail=Mail.new do
|
102
|
+
to to
|
103
|
+
from "from@example.com"
|
104
|
+
subject "This is a test email"
|
105
|
+
text_part do
|
106
|
+
body "This is a test"
|
107
|
+
end
|
108
|
+
html_part do
|
109
|
+
content_type 'text/html; charset=UTF-8'
|
110
|
+
body "<h1>This is a test</h1>"
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
97
115
|
describe "execute" do
|
98
116
|
before(:each) do
|
99
117
|
@iron_mq_config = JSON.parse(File.read('spec/config/iron_mq.json'))
|
@@ -123,20 +141,19 @@ describe IronMailer::SendEmail do
|
|
123
141
|
end
|
124
142
|
|
125
143
|
it "should add info about the email to the cache" do
|
126
|
-
@send_email.
|
127
|
-
@
|
144
|
+
@execute.should change(@send_email.cache, :size).by(1)
|
145
|
+
@send_email.cache.get(@test_email.message_id).value.should == @send_email.extract_cache_info(@test_email).to_json
|
128
146
|
end
|
129
147
|
|
130
148
|
it "should call deliver with on the results of split_email" do
|
131
149
|
@test_email=test_email
|
132
|
-
@test_email.stub(:message_id).and_return(Time.now.to_f.to_s)
|
133
150
|
@send_email.stub(:split_email).and_return([@test_email])
|
134
151
|
@test_email.should_receive(:deliver)
|
135
152
|
@execute.call
|
136
153
|
end
|
137
154
|
|
138
155
|
it "should add the message back to the queue if there's an error " do
|
139
|
-
@send_email.queue.clear
|
156
|
+
@send_email.queue.clear
|
140
157
|
email = test_email
|
141
158
|
email.to.clear
|
142
159
|
class ErrorMailer
|
@@ -162,49 +179,7 @@ describe IronMailer::SendEmail do
|
|
162
179
|
end
|
163
180
|
end
|
164
181
|
|
165
|
-
|
166
|
-
before(:each) do
|
167
|
-
@send_email = IronMailer::SendEmail.new(test_config)
|
168
|
-
@test_email = @send_email.split_email(test_email).first
|
169
|
-
@cache=lambda{
|
170
|
-
@send_email.cache_email(@test_email)
|
171
|
-
@send_email.cache.reload
|
172
|
-
}
|
173
|
-
end
|
174
|
-
|
175
|
-
|
176
|
-
after(:each) do
|
177
|
-
@send_email.cache.clear if @send_email.cache.size > 0
|
178
|
-
end
|
179
|
-
|
180
|
-
it "should add an item to the cache " do
|
181
|
-
@cache.should change(@send_email.cache, :size).by(1)
|
182
|
-
end
|
183
|
-
|
184
|
-
it "should use the cache key from the header" do
|
185
|
-
@cache.call
|
186
|
-
cache_key=JSON.parse(@test_email.header['X-SMTPAPI'].value)['unique_args']['cache_key']
|
187
|
-
@send_email.cache.get(cache_key).should_not be_nil
|
188
|
-
end
|
189
|
-
|
190
|
-
it "should blow up if the cache key is blank" do
|
191
|
-
@test_email.header['X-SMTPAPI'] = nil
|
192
|
-
@test_email.header['X-SMTPAPI'] = {unique_args: {cache_key: nil}}.to_json
|
193
|
-
@cache.should raise_error
|
194
|
-
end
|
195
|
-
|
196
|
-
it "should blow up if the header is blank" do
|
197
|
-
@test_email.header['X-SMTPAPI'] = nil
|
198
|
-
@test_email.header['X-SMTPAPI'] = ""
|
199
|
-
@cache.should raise_error
|
200
|
-
end
|
201
|
-
|
202
|
-
it "should handle 'X-SMTPAPI' being an array" do
|
203
|
-
@test_email.header['X-SMTPAPI'] = 'some_header_value'
|
204
|
-
@cache.should change(@send_email.cache, :size).by(1)
|
205
|
-
end
|
206
|
-
|
207
|
-
end
|
182
|
+
|
208
183
|
describe "extract_cache_info" do
|
209
184
|
before(:each) do
|
210
185
|
@send_email = IronMailer::SendEmail.new(test_config)
|
@@ -227,11 +202,16 @@ describe IronMailer::SendEmail do
|
|
227
202
|
@send_email.extract_cache_info(@test_email)['date'].should == @test_email.date
|
228
203
|
end
|
229
204
|
|
230
|
-
it "should
|
231
|
-
@send_email.extract_cache_info(@test_email)['
|
205
|
+
it "should exract html_part as content" do
|
206
|
+
@send_email.extract_cache_info(@test_email)['content'].should == @test_email.html_part.body.to_s
|
207
|
+
end
|
208
|
+
|
209
|
+
it "should extract the text_part if the text part is nil" do
|
210
|
+
@test_email.stub(:html_part).and_return(nil)
|
211
|
+
@send_email.extract_cache_info(@test_email)['content'].should == @test_email.text_part.body.to_s
|
232
212
|
end
|
233
213
|
end
|
234
|
-
|
214
|
+
|
235
215
|
describe "split_email" do
|
236
216
|
before(:each) do
|
237
217
|
@send_email = IronMailer::SendEmail.new(test_config)
|
@@ -274,44 +254,5 @@ describe IronMailer::SendEmail do
|
|
274
254
|
@send_email.split_email(@test_email).first.cc.should == @test_email.cc
|
275
255
|
end
|
276
256
|
|
277
|
-
it "should handle non-multipart emails" do
|
278
|
-
@test_email=test_email{
|
279
|
-
"This is not multipart"
|
280
|
-
}
|
281
|
-
@send_email.split_email(@test_email).first.body.to_s.should =~ /This is not multipart/
|
282
|
-
end
|
283
|
-
|
284
|
-
it "should include a cache_id in the smtp headers" do
|
285
|
-
@email = @send_email.split_email(@test_email).first
|
286
|
-
JSON.parse(@email.header['X-SMTPAPI'].first.value)['unique_args']['cache_key'].should_not be_blank
|
287
|
-
end
|
288
|
-
end
|
289
|
-
|
290
|
-
def test_config
|
291
|
-
@iron_mq_config = JSON.parse(File.read('spec/config/iron_mq.json'))
|
292
|
-
@iron_cache_config = JSON.parse(File.read('spec/config/iron_cache.json'))
|
293
|
-
{'iron_mq'=>@iron_mq_config, 'iron_cache'=>@iron_cache_config.merge('cache_name'=>"test_email_cache"), 'delivery_method'=>'test', 'debug'=>false}
|
294
|
-
end
|
295
|
-
|
296
|
-
def test_email(other_tos=[])
|
297
|
-
to = (['to@example.com']<<other_tos)
|
298
|
-
|
299
|
-
mail=Mail.new do
|
300
|
-
to to
|
301
|
-
from "from@example.com"
|
302
|
-
subject "This is a test email"
|
303
|
-
if block_given?
|
304
|
-
body yield
|
305
|
-
else
|
306
|
-
text_part do
|
307
|
-
body "This is a test"
|
308
|
-
end
|
309
|
-
html_part do
|
310
|
-
content_type 'text/html; charset=UTF-8'
|
311
|
-
body "<h1>This is a test</h1>"
|
312
|
-
end
|
313
|
-
end
|
314
|
-
end
|
315
257
|
end
|
316
|
-
|
317
258
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: iron_mailer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-08-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -82,7 +82,7 @@ dependencies:
|
|
82
82
|
requirements:
|
83
83
|
- - ~>
|
84
84
|
- !ruby/object:Gem::Version
|
85
|
-
version: '
|
85
|
+
version: '3.1'
|
86
86
|
type: :runtime
|
87
87
|
prerelease: false
|
88
88
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -90,7 +90,7 @@ dependencies:
|
|
90
90
|
requirements:
|
91
91
|
- - ~>
|
92
92
|
- !ruby/object:Gem::Version
|
93
|
-
version: '
|
93
|
+
version: '3.1'
|
94
94
|
- !ruby/object:Gem::Dependency
|
95
95
|
name: iron_cache
|
96
96
|
requirement: !ruby/object:Gem::Requirement
|
@@ -98,7 +98,7 @@ dependencies:
|
|
98
98
|
requirements:
|
99
99
|
- - ~>
|
100
100
|
- !ruby/object:Gem::Version
|
101
|
-
version: '1.
|
101
|
+
version: '1.3'
|
102
102
|
type: :runtime
|
103
103
|
prerelease: false
|
104
104
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -106,7 +106,7 @@ dependencies:
|
|
106
106
|
requirements:
|
107
107
|
- - ~>
|
108
108
|
- !ruby/object:Gem::Version
|
109
|
-
version: '1.
|
109
|
+
version: '1.3'
|
110
110
|
- !ruby/object:Gem::Dependency
|
111
111
|
name: typhoeus
|
112
112
|
requirement: !ruby/object:Gem::Requirement
|
@@ -123,22 +123,6 @@ dependencies:
|
|
123
123
|
- - ! '>='
|
124
124
|
- !ruby/object:Gem::Version
|
125
125
|
version: '0'
|
126
|
-
- !ruby/object:Gem::Dependency
|
127
|
-
name: uuidtools
|
128
|
-
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
|
-
requirements:
|
131
|
-
- - ! '>='
|
132
|
-
- !ruby/object:Gem::Version
|
133
|
-
version: '0'
|
134
|
-
type: :runtime
|
135
|
-
prerelease: false
|
136
|
-
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
|
-
requirements:
|
139
|
-
- - ! '>='
|
140
|
-
- !ruby/object:Gem::Version
|
141
|
-
version: '0'
|
142
126
|
description: A Rails mail delivery method using Iron MQ & Workers
|
143
127
|
email:
|
144
128
|
- erich@hordesoftware.com
|