zendesk-ar_mailer 1.4.6 → 2.1.5
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/History.txt +54 -0
- data/README.rdoc +149 -0
- data/Rakefile +13 -19
- data/generators/ar_mailer/ar_mailer_generator.rb +25 -0
- data/generators/ar_mailer/templates/migration.rb +15 -0
- data/generators/ar_mailer/templates/model.rb +2 -0
- data/lib/action_mailer/ar_mailer.rb +9 -89
- data/lib/action_mailer/ar_sendmail.rb +65 -124
- data/lib/ar_sendmail_logger.rb +6 -1
- data/share/linux/ar_sendmail +6 -3
- data/test/{action_mailer.rb → resources/action_mailer.rb} +26 -15
- data/test/test_armailer.rb +6 -13
- data/test/test_arsendmail.rb +71 -191
- data/test/test_helper.rb +9 -0
- metadata +19 -13
- data/Manifest.txt +0 -15
- data/README.txt +0 -80
@@ -1,17 +1,9 @@
|
|
1
1
|
require 'optparse'
|
2
2
|
require 'net/smtp'
|
3
|
-
require 'smtp_tls'
|
3
|
+
require 'smtp_tls' unless Net::SMTP.instance_methods.include?("enable_starttls_auto")
|
4
4
|
require 'ar_sendmail_logger'
|
5
5
|
require 'rubygems'
|
6
6
|
|
7
|
-
class Object # :nodoc:
|
8
|
-
unless respond_to? :path2class then
|
9
|
-
def self.path2class(path)
|
10
|
-
path.split(/::/).inject self do |k,n| k.const_get n end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
7
|
##
|
16
8
|
# Hack in RSET
|
17
9
|
|
@@ -30,8 +22,6 @@ class SMTP # :nodoc:
|
|
30
22
|
end
|
31
23
|
end
|
32
24
|
|
33
|
-
module ActionMailer; end # :nodoc:
|
34
|
-
|
35
25
|
##
|
36
26
|
# ActionMailer::ARSendmail delivers email from the email table to the
|
37
27
|
# SMTP server configured in your application's config/environment.rb.
|
@@ -46,16 +36,15 @@ module ActionMailer; end # :nodoc:
|
|
46
36
|
# The interesting options are:
|
47
37
|
# * --daemon
|
48
38
|
# * --mailq
|
49
|
-
|
50
|
-
|
51
|
-
# * --table-name
|
39
|
+
|
40
|
+
module ActionMailer; end
|
52
41
|
|
53
42
|
class ActionMailer::ARSendmail
|
54
43
|
|
55
44
|
##
|
56
45
|
# The version of ActionMailer::ARSendmail you are running.
|
57
46
|
|
58
|
-
VERSION = '1.
|
47
|
+
VERSION = '2.1.5'
|
59
48
|
|
60
49
|
##
|
61
50
|
# Maximum number of times authentication will be consecutively retried
|
@@ -81,13 +70,7 @@ class ActionMailer::ARSendmail
|
|
81
70
|
# Be verbose
|
82
71
|
|
83
72
|
attr_accessor :verbose
|
84
|
-
|
85
|
-
##
|
86
|
-
# ActiveRecord class that holds emails
|
87
|
-
|
88
|
-
attr_reader :email_class
|
89
|
-
|
90
|
-
attr_reader :logger
|
73
|
+
|
91
74
|
|
92
75
|
##
|
93
76
|
# True if only one delivery attempt will be made per call to run
|
@@ -98,6 +81,11 @@ class ActionMailer::ARSendmail
|
|
98
81
|
# Times authentication has failed
|
99
82
|
|
100
83
|
attr_accessor :failed_auth_count
|
84
|
+
|
85
|
+
##
|
86
|
+
# Logs the value of this header for successfully sent emails
|
87
|
+
|
88
|
+
attr_accessor :log_header
|
101
89
|
|
102
90
|
@@pid_file = nil
|
103
91
|
|
@@ -109,41 +97,6 @@ class ActionMailer::ARSendmail
|
|
109
97
|
end
|
110
98
|
end
|
111
99
|
|
112
|
-
##
|
113
|
-
# Creates a new migration using +table_name+ and prints it on stdout.
|
114
|
-
|
115
|
-
def self.create_migration(table_name)
|
116
|
-
require 'active_support'
|
117
|
-
puts <<-EOF
|
118
|
-
class Add#{table_name.classify} < ActiveRecord::Migration
|
119
|
-
def self.up
|
120
|
-
create_table :#{table_name.tableize} do |t|
|
121
|
-
t.column :from, :string
|
122
|
-
t.column :to, :string
|
123
|
-
t.column :last_send_attempt, :integer, :default => 0
|
124
|
-
t.column :mail, :text
|
125
|
-
t.column :created_on, :datetime
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
def self.down
|
130
|
-
drop_table :#{table_name.tableize}
|
131
|
-
end
|
132
|
-
end
|
133
|
-
EOF
|
134
|
-
end
|
135
|
-
|
136
|
-
##
|
137
|
-
# Creates a new model using +table_name+ and prints it on stdout.
|
138
|
-
|
139
|
-
def self.create_model(table_name)
|
140
|
-
require 'active_support'
|
141
|
-
puts <<-EOF
|
142
|
-
class #{table_name.classify} < ActiveRecord::Base
|
143
|
-
end
|
144
|
-
EOF
|
145
|
-
end
|
146
|
-
|
147
100
|
##
|
148
101
|
# Prints a list of unsent emails and the last delivery attempt, if any.
|
149
102
|
#
|
@@ -151,9 +104,8 @@ end
|
|
151
104
|
# known. See http://api.rubyonrails.org/classes/ActiveRecord/Timestamp.html
|
152
105
|
# to learn how to enable ActiveRecord::Timestamp.
|
153
106
|
|
154
|
-
def self.mailq
|
155
|
-
|
156
|
-
emails = klass.find :all
|
107
|
+
def self.mailq
|
108
|
+
emails = ActionMailer::Base.email_class.find :all
|
157
109
|
|
158
110
|
if emails.empty? then
|
159
111
|
puts "Mail queue is empty"
|
@@ -202,9 +154,7 @@ end
|
|
202
154
|
options[:MaxAge] = 86400 * 7
|
203
155
|
options[:Once] = false
|
204
156
|
options[:RailsEnv] = ENV['RAILS_ENV']
|
205
|
-
options[:TableName] = 'Email'
|
206
157
|
options[:Pidfile] = options[:Chdir] + '/log/ar_sendmail.pid'
|
207
|
-
options[:LogFile] = nil
|
208
158
|
|
209
159
|
opts = OptionParser.new do |opts|
|
210
160
|
opts.banner = "Usage: #{name} [options]"
|
@@ -257,12 +207,6 @@ end
|
|
257
207
|
options[:Pidfile] = pidfile
|
258
208
|
end
|
259
209
|
|
260
|
-
opts.on("-l", "--logfile LOGFILE",
|
261
|
-
"Set the logfile location",
|
262
|
-
"Default: #{options[:Chdir]}#{options[:LogFile]}", String) do |logfile|
|
263
|
-
options[:LogFile] = logfile
|
264
|
-
end
|
265
|
-
|
266
210
|
opts.on( "--mailq",
|
267
211
|
"Display a list of emails waiting to be sent") do |mailq|
|
268
212
|
options[:MailQ] = true
|
@@ -271,18 +215,6 @@ end
|
|
271
215
|
opts.separator ''
|
272
216
|
opts.separator 'Setup Options:'
|
273
217
|
|
274
|
-
opts.on( "--create-migration",
|
275
|
-
"Prints a migration to add an Email table",
|
276
|
-
"to stdout") do |create|
|
277
|
-
options[:Migrate] = true
|
278
|
-
end
|
279
|
-
|
280
|
-
opts.on( "--create-model",
|
281
|
-
"Prints a model for an Email ActiveRecord",
|
282
|
-
"object to stdout") do |create|
|
283
|
-
options[:Model] = true
|
284
|
-
end
|
285
|
-
|
286
218
|
opts.separator ''
|
287
219
|
opts.separator 'Generic Options:'
|
288
220
|
|
@@ -294,20 +226,23 @@ end
|
|
294
226
|
options[:Chdir] = path
|
295
227
|
end
|
296
228
|
|
229
|
+
opts.on( "--log-file PATH_AND_FILE",
|
230
|
+
"Full path to the file the mailer should log to",
|
231
|
+
"Default: RAILS_ROOT/log/RAILS_ENV.log") do |log_file|
|
232
|
+
options[:LogFile] = log_file
|
233
|
+
end
|
234
|
+
|
235
|
+
opts.on( "--log-header SOME_HEADER",
|
236
|
+
"Logs the value of the specified header once an email gets sent") do |header|
|
237
|
+
options[:LogHeader] = header
|
238
|
+
end
|
239
|
+
|
297
240
|
opts.on("-e", "--environment RAILS_ENV",
|
298
241
|
"Set the RAILS_ENV constant",
|
299
242
|
"Default: #{options[:RailsEnv]}") do |env|
|
300
243
|
options[:RailsEnv] = env
|
301
244
|
end
|
302
245
|
|
303
|
-
opts.on("-t", "--table-name TABLE_NAME",
|
304
|
-
"Name of table holding emails",
|
305
|
-
"Used for both sendmail and",
|
306
|
-
"migration creation",
|
307
|
-
"Default: #{options[:TableName]}") do |name|
|
308
|
-
options[:TableName] = name
|
309
|
-
end
|
310
|
-
|
311
246
|
opts.on("-v", "--[no-]verbose",
|
312
247
|
"Be verbose",
|
313
248
|
"Default: #{options[:Verbose]}") do |verbose|
|
@@ -319,23 +254,26 @@ end
|
|
319
254
|
usage opts
|
320
255
|
end
|
321
256
|
|
257
|
+
opts.on("--version", "Version of ARMailer") do
|
258
|
+
usage "ar_mailer #{VERSION} (adzap fork)"
|
259
|
+
end
|
260
|
+
|
322
261
|
opts.separator ''
|
323
262
|
end
|
324
263
|
|
325
264
|
opts.parse! args
|
326
265
|
|
327
|
-
return options if options.include? :Migrate or options.include? :Model
|
328
|
-
|
329
266
|
ENV['RAILS_ENV'] = options[:RailsEnv]
|
330
267
|
|
331
268
|
Dir.chdir options[:Chdir] do
|
332
269
|
begin
|
333
270
|
require 'config/environment'
|
271
|
+
require 'action_mailer/ar_mailer'
|
334
272
|
rescue LoadError
|
335
273
|
usage opts, <<-EOF
|
336
274
|
#{name} must be run from a Rails application's root to deliver email.
|
337
275
|
#{Dir.pwd} does not appear to be a Rails application root.
|
338
|
-
|
276
|
+
EOF
|
339
277
|
end
|
340
278
|
end
|
341
279
|
|
@@ -348,14 +286,8 @@ end
|
|
348
286
|
def self.run(args = ARGV)
|
349
287
|
options = process_args args
|
350
288
|
|
351
|
-
if options.include? :
|
352
|
-
|
353
|
-
exit
|
354
|
-
elsif options.include? :Model then
|
355
|
-
create_model options[:TableName]
|
356
|
-
exit
|
357
|
-
elsif options.include? :MailQ then
|
358
|
-
mailq options[:TableName]
|
289
|
+
if options.include? :MailQ then
|
290
|
+
mailq
|
359
291
|
exit
|
360
292
|
end
|
361
293
|
|
@@ -410,24 +342,22 @@ end
|
|
410
342
|
# Valid options are:
|
411
343
|
# <tt>:BatchSize</tt>:: Maximum number of emails to send per delay
|
412
344
|
# <tt>:Delay</tt>:: Delay between deliver attempts
|
413
|
-
# <tt>:TableName</tt>:: Table name that stores the emails
|
414
345
|
# <tt>:Once</tt>:: Only attempt to deliver emails once when run is called
|
415
346
|
# <tt>:Verbose</tt>:: Be verbose.
|
416
347
|
|
417
348
|
def initialize(options = {})
|
418
349
|
options[:Delay] ||= 60
|
419
|
-
options[:TableName] ||= 'Email'
|
420
350
|
options[:MaxAge] ||= 86400 * 7
|
421
351
|
|
422
352
|
@batch_size = options[:BatchSize]
|
423
353
|
@delay = options[:Delay]
|
424
|
-
@email_class = Object.path2class options[:TableName]
|
425
354
|
@once = options[:Once]
|
426
355
|
@verbose = options[:Verbose]
|
427
356
|
@max_age = options[:MaxAge]
|
428
|
-
|
357
|
+
@log_header = options[:LogHeader]
|
358
|
+
|
429
359
|
@failed_auth_count = 0
|
430
|
-
@logger =
|
360
|
+
@logger = options[:LogFile] ? ARSendmailLogger.new(options[:LogFile]) : ActionMailer::Base.logger
|
431
361
|
end
|
432
362
|
|
433
363
|
##
|
@@ -438,7 +368,7 @@ end
|
|
438
368
|
return if @max_age == 0
|
439
369
|
timeout = Time.now - @max_age
|
440
370
|
conditions = ['last_send_attempt > 0 and created_on < ?', timeout]
|
441
|
-
mail =
|
371
|
+
mail = ActionMailer::Base.email_class.destroy_all conditions
|
442
372
|
|
443
373
|
log "expired #{mail.length} emails from the queue"
|
444
374
|
end
|
@@ -447,29 +377,40 @@ end
|
|
447
377
|
# Delivers +emails+ to ActionMailer's SMTP server and destroys them.
|
448
378
|
|
449
379
|
def deliver(emails)
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
380
|
+
settings = [
|
381
|
+
smtp_settings[:domain],
|
382
|
+
(smtp_settings[:user] || smtp_settings[:user_name]),
|
383
|
+
smtp_settings[:password],
|
384
|
+
smtp_settings[:authentication]
|
385
|
+
]
|
386
|
+
|
387
|
+
smtp = Net::SMTP.new(smtp_settings[:address], smtp_settings[:port])
|
388
|
+
if smtp.respond_to?(:enable_starttls_auto)
|
389
|
+
smtp.enable_starttls_auto unless smtp_settings[:tls] == false
|
390
|
+
else
|
391
|
+
settings << smtp_settings[:tls]
|
392
|
+
end
|
393
|
+
|
394
|
+
smtp.start(*settings) do |session|
|
457
395
|
@failed_auth_count = 0
|
458
396
|
until emails.empty? do
|
459
397
|
email = emails.shift
|
460
398
|
begin
|
461
|
-
res =
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
log "sent email %011d from %s to %s: %p" % [email.id, email.from, email.to, res]
|
399
|
+
res = session.send_message email.mail, email.from, email.to
|
400
|
+
hdr = ''
|
401
|
+
|
402
|
+
if @log_header && email.mail =~ /#{@log_header}: (.+)/
|
403
|
+
hdr = "[#{$1.chomp}] "
|
467
404
|
end
|
405
|
+
|
406
|
+
email.destroy
|
407
|
+
log "sent email %011d %sfrom %s to %s: %p" %
|
408
|
+
[email.id, hdr, email.from, email.to, res]
|
468
409
|
rescue Net::SMTPFatalError => e
|
469
410
|
log "5xx error sending email %d, removing from queue: %p(%s):\n\t%s" %
|
470
411
|
[email.id, e.message, e.class, e.backtrace.join("\n\t")]
|
471
412
|
email.destroy
|
472
|
-
|
413
|
+
session.reset
|
473
414
|
rescue Net::SMTPServerBusy => e
|
474
415
|
log "server too busy, sleeping #{@delay} seconds"
|
475
416
|
sleep delay
|
@@ -479,7 +420,7 @@ end
|
|
479
420
|
email.save rescue nil
|
480
421
|
log "error sending email %d: %p(%s):\n\t%s" %
|
481
422
|
[email.id, e.message, e.class, e.backtrace.join("\n\t")]
|
482
|
-
|
423
|
+
session.reset
|
483
424
|
end
|
484
425
|
end
|
485
426
|
end
|
@@ -512,7 +453,7 @@ end
|
|
512
453
|
def find_emails
|
513
454
|
options = { :conditions => ['last_send_attempt < ?', Time.now.to_i - 300] }
|
514
455
|
options[:limit] = batch_size unless batch_size.nil?
|
515
|
-
mail =
|
456
|
+
mail = ActionMailer::Base.email_class.find :all, options
|
516
457
|
|
517
458
|
log "found #{mail.length} emails to send"
|
518
459
|
mail
|
@@ -532,7 +473,7 @@ end
|
|
532
473
|
def log(message)
|
533
474
|
message = "ar_sendmail #{Time.now}: #{message}"
|
534
475
|
$stderr.puts message if @verbose
|
535
|
-
logger.info
|
476
|
+
@logger.info message
|
536
477
|
end
|
537
478
|
|
538
479
|
##
|
@@ -546,7 +487,8 @@ end
|
|
546
487
|
now = Time.now
|
547
488
|
begin
|
548
489
|
cleanup
|
549
|
-
|
490
|
+
emails = find_emails
|
491
|
+
deliver(emails) unless emails.empty?
|
550
492
|
rescue ActiveRecord::Transactions::TransactionError
|
551
493
|
end
|
552
494
|
break if @once
|
@@ -567,4 +509,3 @@ end
|
|
567
509
|
end
|
568
510
|
|
569
511
|
end
|
570
|
-
|
data/lib/ar_sendmail_logger.rb
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
require 'logger'
|
2
2
|
|
3
|
-
class
|
3
|
+
class ARSendmailLogger < ::Logger
|
4
|
+
|
5
|
+
def initialize(path)
|
6
|
+
FileUtils.mkdir_p(File.dirname(path))
|
7
|
+
super(path)
|
8
|
+
end
|
4
9
|
|
5
10
|
def format_message(severity, timestamp, progname, message)
|
6
11
|
"#{message}\n"
|
data/share/linux/ar_sendmail
CHANGED
@@ -11,7 +11,11 @@ require 'yaml'
|
|
11
11
|
config_file = '/etc/ar_sendmail.conf'
|
12
12
|
|
13
13
|
begin
|
14
|
-
config = YAML::load(IO.read(config_file))
|
14
|
+
config = YAML::load(IO.read(config_file)) || {}
|
15
|
+
if config.empty? || (config.has_key?('defaults') && config.size == 1)
|
16
|
+
puts "No mailers defined. Exiting."
|
17
|
+
exit
|
18
|
+
end
|
15
19
|
rescue Errno::ENOENT
|
16
20
|
puts "Config file not found at '#{config_file}'!"
|
17
21
|
exit
|
@@ -30,8 +34,7 @@ def start(app, options)
|
|
30
34
|
end
|
31
35
|
|
32
36
|
def stop(app, options)
|
33
|
-
|
34
|
-
pid_file = File.expand_path(options['pidfile'], path)
|
37
|
+
pid_file = File.expand_path(options['pidfile'], options['chdir'])
|
35
38
|
if File.exist? pid_file
|
36
39
|
begin
|
37
40
|
pid = open(pid_file).read.to_i
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'net/smtp'
|
2
|
-
require 'smtp_tls'
|
2
|
+
require 'smtp_tls' unless Net::SMTP.instance_methods.include?("enable_starttls_auto")
|
3
3
|
require 'time'
|
4
4
|
|
5
5
|
class Net::SMTP
|
@@ -18,13 +18,7 @@ class Net::SMTP
|
|
18
18
|
attr_reader :send_message_block
|
19
19
|
attr_accessor :reset_called
|
20
20
|
|
21
|
-
send :remove_method, :start
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.start(*args)
|
26
|
-
@start_block.call if @start_block
|
27
|
-
yield new(nil)
|
21
|
+
# send :remove_method, :start
|
28
22
|
end
|
29
23
|
|
30
24
|
def self.on_send_message(&block)
|
@@ -32,7 +26,15 @@ class Net::SMTP
|
|
32
26
|
end
|
33
27
|
|
34
28
|
def self.on_start(&block)
|
35
|
-
|
29
|
+
if block_given?
|
30
|
+
@start_block = block
|
31
|
+
else
|
32
|
+
@start_block
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.clear_on_start
|
37
|
+
@start_block = nil
|
36
38
|
end
|
37
39
|
|
38
40
|
def self.reset
|
@@ -42,6 +44,11 @@ class Net::SMTP
|
|
42
44
|
@reset_called = 0
|
43
45
|
end
|
44
46
|
|
47
|
+
def start(*args)
|
48
|
+
self.class.on_start.call if self.class.on_start
|
49
|
+
yield self
|
50
|
+
end
|
51
|
+
|
45
52
|
alias test_old_reset reset if instance_methods.include? 'reset'
|
46
53
|
|
47
54
|
def reset
|
@@ -68,6 +75,11 @@ class ActionMailer::Base
|
|
68
75
|
|
69
76
|
@server_settings = {}
|
70
77
|
|
78
|
+
class << self
|
79
|
+
cattr_accessor :email_class
|
80
|
+
attr_accessor :delivery_method
|
81
|
+
end
|
82
|
+
|
71
83
|
def self.logger
|
72
84
|
o = Object.new
|
73
85
|
def o.info(arg) end
|
@@ -82,6 +94,7 @@ class ActionMailer::Base
|
|
82
94
|
|
83
95
|
def self.reset
|
84
96
|
server_settings.clear
|
97
|
+
self.email_class = Email
|
85
98
|
end
|
86
99
|
|
87
100
|
def self.server_settings
|
@@ -105,7 +118,7 @@ class Email
|
|
105
118
|
|
106
119
|
START = Time.parse 'Thu Aug 10 2006 11:19:48'
|
107
120
|
|
108
|
-
attr_accessor :from, :to, :mail, :last_send_attempt, :created_on, :id
|
121
|
+
attr_accessor :from, :to, :mail, :last_send_attempt, :created_on, :id
|
109
122
|
|
110
123
|
@records = []
|
111
124
|
@id = 0
|
@@ -114,7 +127,7 @@ class Email
|
|
114
127
|
|
115
128
|
def self.create(record)
|
116
129
|
record = new record[:from], record[:to], record[:mail],
|
117
|
-
record[:last_send_attempt]
|
130
|
+
record[:last_send_attempt]
|
118
131
|
records << record
|
119
132
|
return record
|
120
133
|
end
|
@@ -147,14 +160,13 @@ class Email
|
|
147
160
|
records.clear
|
148
161
|
end
|
149
162
|
|
150
|
-
def initialize(from, to, mail, last_send_attempt = nil
|
163
|
+
def initialize(from, to, mail, last_send_attempt = nil)
|
151
164
|
@from = from
|
152
165
|
@to = to
|
153
166
|
@mail = mail
|
154
167
|
@id = self.class.id += 1
|
155
168
|
@created_on = START + @id
|
156
169
|
@last_send_attempt = last_send_attempt || 0
|
157
|
-
@context = context
|
158
170
|
end
|
159
171
|
|
160
172
|
def destroy
|
@@ -171,7 +183,7 @@ class Email
|
|
171
183
|
|
172
184
|
end
|
173
185
|
|
174
|
-
|
186
|
+
Newsletter = Email
|
175
187
|
|
176
188
|
class String
|
177
189
|
def classify
|
@@ -183,4 +195,3 @@ class String
|
|
183
195
|
end
|
184
196
|
|
185
197
|
end
|
186
|
-
|
data/test/test_armailer.rb
CHANGED
@@ -1,20 +1,13 @@
|
|
1
|
-
require '
|
2
|
-
require 'action_mailer'
|
3
|
-
require 'action_mailer/ar_mailer'
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/test_helper')
|
4
2
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
class Mailer < ActionMailer::ARMailer
|
3
|
+
class Mailer < ActionMailer::Base
|
4
|
+
self.delivery_method = :activerecord
|
9
5
|
|
10
6
|
def mail
|
11
7
|
@mail = Object.new
|
12
8
|
def @mail.encoded() 'email' end
|
13
9
|
def @mail.from() ['nobody@example.com'] end
|
14
10
|
def @mail.destinations() %w[user1@example.com user2@example.com] end
|
15
|
-
def @mail.header_string(header_name, default = nil)
|
16
|
-
default
|
17
|
-
end
|
18
11
|
end
|
19
12
|
|
20
13
|
end
|
@@ -25,15 +18,15 @@ class TestARMailer < Test::Unit::TestCase
|
|
25
18
|
Mailer.email_class = Email
|
26
19
|
|
27
20
|
Email.records.clear
|
28
|
-
|
21
|
+
Newsletter.records.clear
|
29
22
|
end
|
30
23
|
|
31
24
|
def test_self_email_class_equals
|
32
|
-
Mailer.email_class =
|
25
|
+
Mailer.email_class = Newsletter
|
33
26
|
|
34
27
|
Mailer.deliver_mail
|
35
28
|
|
36
|
-
assert_equal 2,
|
29
|
+
assert_equal 2, Newsletter.records.length
|
37
30
|
end
|
38
31
|
|
39
32
|
def test_perform_delivery_activerecord
|