ar_mailer_revised 1.0.1 → 1.0.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -0
- data/ar_mailer_revised.gemspec +1 -0
- data/lib/action_mailer/ar_mailer.rb +4 -4
- data/lib/ar_mailer_revised/mailman.rb +20 -6
- data/lib/ar_mailer_revised/version.rb +1 -1
- data/test/dummy/test/mailers/test_mailer_test.rb +78 -1
- metadata +19 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e31b96ff2c52c7ea6de5612eaf78aaac96f0c848
|
4
|
+
data.tar.gz: 8bee7faa04dd6dc0b6e873fd8c54d9bd6f2832b9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e2c952822e0eef6031bcb68d4441dc8dbc50c8940f04390c9dcffa59fd3a7c1bc4f456e8b0252cb6e646a136489b8cf0a8fd2f4cac699fa7e496d1108d9ebe5d
|
7
|
+
data.tar.gz: 09de5500a627fb78d1259476b458d17c5a62629e6e472700be4c736491a071b706beef0a849d9fdee269b385bbe25e8d686b3ba3b96bf32bd5d7c2be779cbd95
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
Version 1.0.2
|
2
|
+
-------------
|
3
|
+
|
4
|
+
- Remove custom SMTP settings on SMTP SyntaxErrors.
|
5
|
+
This makes more sense than simply trying to re-deliver them
|
6
|
+
in the next batch as it will most likely still be bad syntax.
|
7
|
+
- Emails with Syntax or Authentication errors without custom SMTP
|
8
|
+
settings are now handled by adjusting their last send attempt.
|
9
|
+
This causes them to go to the end of the sending queue where they
|
10
|
+
will either be deleted after some time or - hopefully - eventually
|
11
|
+
sent when the developer corrects his application's SMTP settings.
|
data/ar_mailer_revised.gemspec
CHANGED
@@ -26,6 +26,7 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.add_development_dependency 'sqlite3'
|
27
27
|
spec.add_development_dependency 'minitest'
|
28
28
|
spec.add_development_dependency 'shoulda'
|
29
|
+
spec.add_development_dependency 'mailcatcher'
|
29
30
|
|
30
31
|
spec.add_dependency 'rails', '~> 4'
|
31
32
|
spec.add_dependency 'log4r'
|
@@ -46,14 +46,14 @@ class ActionMailer::Base
|
|
46
46
|
#
|
47
47
|
def ar_mailer_setting(key, value = nil)
|
48
48
|
if headers[:ar_mailer_settings]
|
49
|
-
settings = YAML
|
49
|
+
settings = YAML::load(headers[:ar_mailer_settings]).stringify_keys
|
50
50
|
else
|
51
51
|
settings = {}
|
52
52
|
end
|
53
53
|
|
54
54
|
if value
|
55
55
|
settings[key.to_s] = value
|
56
|
-
headers[:ar_mailer_settings] = YAML
|
56
|
+
headers[:ar_mailer_settings] = YAML::dump(settings)
|
57
57
|
else
|
58
58
|
settings[key.to_s]
|
59
59
|
end
|
@@ -78,7 +78,7 @@ module ActionMailer
|
|
78
78
|
#
|
79
79
|
def deliver!(mail)
|
80
80
|
if mail['ar_mailer_settings']
|
81
|
-
ar_settings
|
81
|
+
ar_settings = YAML::load(mail['ar_mailer_settings'].value).stringify_keys
|
82
82
|
mail['ar_mailer_settings'] = nil
|
83
83
|
else
|
84
84
|
ar_settings = {}
|
@@ -86,7 +86,7 @@ module ActionMailer
|
|
86
86
|
|
87
87
|
email_options = {}
|
88
88
|
email_options[:delivery_time] = ar_settings.delete('delivery_time')
|
89
|
-
email_options[:smtp_settings] = ar_settings.delete('smtp_settings')
|
89
|
+
email_options[:smtp_settings] = ar_settings.delete('smtp_settings').try(:symbolize_keys)
|
90
90
|
email_options[:mail] = mail.encoded
|
91
91
|
email_options[:from] = (mail['return-path'] && mail['return-path'].spec) || mail.from.first
|
92
92
|
email_options.reverse_merge!(ar_settings['custom_attributes'] || {})
|
@@ -58,6 +58,7 @@ module ArMailerRevised
|
|
58
58
|
group_emails_by_settings(emails).each do |settings_hash, grouped_emails|
|
59
59
|
setting = OpenStruct.new(settings_hash)
|
60
60
|
logger.info "Using setting #{setting.address}:#{setting.port}/#{setting.user_name}"
|
61
|
+
logger.info setting.inspect
|
61
62
|
|
62
63
|
smtp = Net::SMTP.new(setting.address, setting.port)
|
63
64
|
smtp.open_timeout = 10
|
@@ -73,12 +74,14 @@ module ArMailerRevised
|
|
73
74
|
end
|
74
75
|
rescue Net::SMTPAuthenticationError => e
|
75
76
|
handle_smtp_authentication_error(setting, e, grouped_emails)
|
77
|
+
rescue Net::SMTPSyntaxError => e
|
78
|
+
handle_smtp_syntax_error(setting, e, grouped_emails)
|
76
79
|
rescue Net::SMTPServerBusy => e
|
77
80
|
logger.warn 'Server is busy, trying again next batch.'
|
78
81
|
logger.warn 'Complete Error: ' + e.to_s
|
79
82
|
rescue Net::OpenTimeout, Net::ReadTimeout => e
|
80
83
|
handle_smtp_timeout(setting, e, grouped_emails)
|
81
|
-
rescue Net::
|
84
|
+
rescue Net::SMTPFatalError, Net::SMTPUnknownError => e
|
82
85
|
#TODO: Should we remove the custom SMTP settings here as well?
|
83
86
|
logger.warn 'Other SMTP error, trying again next batch.'
|
84
87
|
logger.warn 'Complete Error: ' + e.to_s
|
@@ -207,9 +210,9 @@ module ArMailerRevised
|
|
207
210
|
logger.warn 'Complete Error: ' + exception.to_s
|
208
211
|
|
209
212
|
if setting.custom_setting
|
213
|
+
logger.warn 'Setting default SMTP settings for all affected emails, they will be sent next batch.'
|
210
214
|
emails.each do |email|
|
211
215
|
if email.previously_attempted?
|
212
|
-
logger.warn 'Setting default SMTP settings for all affected emails, they will be sent next batch.'
|
213
216
|
remove_custom_smtp_settings!(email)
|
214
217
|
else
|
215
218
|
adjust_last_send_attempt!(email)
|
@@ -231,12 +234,23 @@ module ArMailerRevised
|
|
231
234
|
|
232
235
|
if setting.custom_setting
|
233
236
|
logger.warn 'Setting default SMTP settings for all affected emails, they will be sent next batch.'
|
234
|
-
|
235
|
-
if setting.custom_setting
|
236
|
-
emails.each { |email| remove_custom_smtp_settings!(email) }
|
237
|
-
end
|
237
|
+
emails.each { |email| remove_custom_smtp_settings!(email) }
|
238
238
|
else
|
239
239
|
logger.error "Your application's base setting ('#{setting.host}:#{setting.port}') produced an authentication error!"
|
240
|
+
emails.each { |email| adjust_last_send_attempt!(email) }
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
def handle_smtp_syntax_error(setting, exception, emails)
|
245
|
+
logger.warn "SMTP syntax error while connecting to '#{setting.host}:#{setting.port}'"
|
246
|
+
logger.warn 'Complete Error: ' + exception.to_s
|
247
|
+
|
248
|
+
if setting.custom_setting
|
249
|
+
logger.warn 'Setting default SMTP settings for all affected emails, they will be sent next batch.'
|
250
|
+
emails.each { |email| remove_custom_smtp_settings!(email) }
|
251
|
+
else
|
252
|
+
emails.each { |email| adjust_last_send_attempt!(email) }
|
253
|
+
logger.error "Your application's base setting ('#{setting.host}:#{setting.port}') produced a syntax error!"
|
240
254
|
end
|
241
255
|
end
|
242
256
|
|
@@ -1,7 +1,13 @@
|
|
1
|
-
require 'test_helper'
|
1
|
+
# require 'test_helper'
|
2
|
+
require 'open-uri'
|
3
|
+
require 'ar_mailer_revised/mailman'
|
2
4
|
|
3
5
|
class TestMailerTest < ActionMailer::TestCase
|
4
6
|
|
7
|
+
#----------------------------------------------------------------
|
8
|
+
# Email Generation Testing
|
9
|
+
#----------------------------------------------------------------
|
10
|
+
|
5
11
|
context 'ActionMailer::Base.deliver' do
|
6
12
|
setup do
|
7
13
|
#@todo: Check if there is a way to set this in the dummy application itself,
|
@@ -51,4 +57,75 @@ class TestMailerTest < ActionMailer::TestCase
|
|
51
57
|
assert_equal 42, email.a_number
|
52
58
|
end
|
53
59
|
end
|
60
|
+
|
61
|
+
#----------------------------------------------------------------
|
62
|
+
# SMTP Testing
|
63
|
+
#----------------------------------------------------------------
|
64
|
+
|
65
|
+
context 'Email sending' do
|
66
|
+
setup do
|
67
|
+
ActionMailer::Base.delivery_method = :activerecord
|
68
|
+
if mailcatcher_running?
|
69
|
+
setup_mailcatcher_settings
|
70
|
+
@old_email_count = received_emails.size
|
71
|
+
else
|
72
|
+
puts 'Mailcatcher is not running, SMTP tests are skipped'
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
should 'send out basic emails correctly' do
|
77
|
+
if mailcatcher_running?
|
78
|
+
assert TestMailer.basic_email.deliver
|
79
|
+
run_ar_sendmail
|
80
|
+
assert_equal @old_email_count + 1, received_emails.count, 'Email was not sent to local SMTP server'
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
private
|
87
|
+
|
88
|
+
#
|
89
|
+
# Executes ar_sendmail to send deliverable emails
|
90
|
+
#
|
91
|
+
def run_ar_sendmail
|
92
|
+
run_options = {
|
93
|
+
:chdir => Rails.root,
|
94
|
+
:rails_env => 'test',
|
95
|
+
:log_level => 'debug'
|
96
|
+
}
|
97
|
+
ArMailerRevised::Mailman.new(run_options).run
|
98
|
+
end
|
99
|
+
|
100
|
+
#
|
101
|
+
# @return [Boolean] +true+ if mailcatcher is running
|
102
|
+
#
|
103
|
+
def mailcatcher_running?
|
104
|
+
begin
|
105
|
+
open('http://localhost:1080')
|
106
|
+
true
|
107
|
+
rescue Errno::ECONNREFUSED
|
108
|
+
false
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def setup_mailcatcher_settings
|
113
|
+
ActionMailer::Base.smtp_settings = {
|
114
|
+
:address => 'localhost',
|
115
|
+
:port => 1025,
|
116
|
+
:domain => 'localhost.localdomain',
|
117
|
+
:user_name => 'some.user',
|
118
|
+
:password => 'some.password',
|
119
|
+
:authentication => :plain,
|
120
|
+
:enable_starttls_auto => true
|
121
|
+
}
|
122
|
+
end
|
123
|
+
|
124
|
+
#
|
125
|
+
# @return [Array<Hash>] Message Meta-Data for all received emails
|
126
|
+
#
|
127
|
+
def received_emails
|
128
|
+
json = open('http://localhost:1080/messages')
|
129
|
+
JSON.load(json)
|
130
|
+
end
|
54
131
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ar_mailer_revised
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stefan Exner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: mailcatcher
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: rails
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -162,6 +176,7 @@ files:
|
|
162
176
|
- ".ruby-version"
|
163
177
|
- ".travis.yml"
|
164
178
|
- ".yardopts"
|
179
|
+
- CHANGELOG.md
|
165
180
|
- Gemfile
|
166
181
|
- LICENSE.txt
|
167
182
|
- MIT-LICENSE
|
@@ -252,7 +267,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
252
267
|
version: '0'
|
253
268
|
requirements: []
|
254
269
|
rubyforge_project:
|
255
|
-
rubygems_version: 2.
|
270
|
+
rubygems_version: 2.4.2
|
256
271
|
signing_key:
|
257
272
|
specification_version: 4
|
258
273
|
summary: Batch email sending for rails applications
|
@@ -309,3 +324,4 @@ test_files:
|
|
309
324
|
- test/dummy/test/mailers/test_mailer_test.rb
|
310
325
|
- test/generators/install_generator_test.rb
|
311
326
|
- test/test_helper.rb
|
327
|
+
has_rdoc:
|