ynw-ar_mailer 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,563 @@
1
+ require 'optparse'
2
+ require 'net/smtp'
3
+ require File.join(File.dirname(__FILE__), '..', 'smtp_tls') unless Net::SMTP.instance_methods.include?("enable_starttls_auto")
4
+ require 'rubygems'
5
+
6
+ ##
7
+ # Hack in RSET
8
+
9
+ module Net # :nodoc:
10
+ class SMTP # :nodoc:
11
+
12
+ unless instance_methods.include? 'reset' then
13
+ ##
14
+ # Resets the SMTP connection.
15
+
16
+ def reset
17
+ getok 'RSET'
18
+ end
19
+ end
20
+
21
+ end
22
+ end
23
+
24
+ ##
25
+ # ActionMailer::ARSendmail delivers email from the email table to the
26
+ # SMTP server configured in your application's config/environment.rb.
27
+ # ar_sendmail does not work with sendmail delivery.
28
+ #
29
+ # ar_mailer can deliver to SMTP with TLS using smtp_tls.rb borrowed from Kyle
30
+ # Maxwell's action_mailer_optional_tls plugin. Simply set the :tls option in
31
+ # ActionMailer::Base's smtp_settings to true to enable TLS.
32
+ #
33
+ # See ar_sendmail -h for the full list of supported options.
34
+ #
35
+ # The interesting options are:
36
+ # * --daemon
37
+ # * --mailq
38
+
39
+ module ActionMailer; end
40
+
41
+ class ActionMailer::ARSendmail
42
+
43
+ ##
44
+ # The version of ActionMailer::ARSendmail you are running.
45
+
46
+ VERSION = '2.1.5'
47
+
48
+ ##
49
+ # Maximum number of times authentication will be consecutively retried
50
+
51
+ MAX_AUTH_FAILURES = 2
52
+
53
+ ##
54
+ # Email delivery attempts per run
55
+
56
+ attr_accessor :batch_size
57
+
58
+ ##
59
+ # Seconds to delay between runs
60
+
61
+ attr_accessor :delay
62
+
63
+ ##
64
+ # Maximum age of emails in seconds before they are removed from the queue.
65
+
66
+ attr_accessor :max_age
67
+
68
+ ##
69
+ # Be verbose
70
+
71
+ attr_accessor :verbose
72
+
73
+
74
+ ##
75
+ # True if only one delivery attempt will be made per call to run
76
+
77
+ attr_reader :once
78
+
79
+ ##
80
+ # Times authentication has failed
81
+
82
+ attr_accessor :failed_auth_count
83
+
84
+ @@pid_file = nil
85
+
86
+ def self.remove_pid_file
87
+ if @@pid_file
88
+ require 'shell'
89
+ sh = Shell.new
90
+ sh.rm @@pid_file
91
+ end
92
+ end
93
+
94
+ ##
95
+ # Prints a list of unsent emails and the last delivery attempt, if any.
96
+ #
97
+ # If ActiveRecord::Timestamp is not being used the arrival time will not be
98
+ # known. See http://api.rubyonrails.org/classes/ActiveRecord/Timestamp.html
99
+ # to learn how to enable ActiveRecord::Timestamp.
100
+
101
+ def self.mailq
102
+ emails = ActionMailer::Base.email_class.find :all
103
+
104
+ if emails.empty? then
105
+ puts "Mail queue is empty"
106
+ return
107
+ end
108
+
109
+ total_size = 0
110
+
111
+ puts "-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------"
112
+ emails.each do |email|
113
+ size = email.mail.length
114
+ total_size += size
115
+
116
+ create_timestamp = email.created_on rescue
117
+ email.created_at rescue
118
+ Time.at(email.created_date) rescue # for Robot Co-op
119
+ nil
120
+
121
+ created = if create_timestamp.nil? then
122
+ ' Unknown'
123
+ else
124
+ create_timestamp.strftime '%a %b %d %H:%M:%S'
125
+ end
126
+
127
+ puts "%10d %8d %s %s" % [email.id, size, created, email.from]
128
+ if email.last_send_attempt > 0 then
129
+ puts "Last send attempt: #{Time.at email.last_send_attempt}"
130
+ end
131
+ puts " #{email.to}"
132
+ puts
133
+ end
134
+
135
+ puts "-- #{total_size/1024} Kbytes in #{emails.length} Requests."
136
+ end
137
+
138
+ ##
139
+ # Processes command line options in +args+
140
+
141
+ def self.process_args(args)
142
+ name = File.basename $0
143
+
144
+ options = {}
145
+ options[:Chdir] = '.'
146
+ options[:Daemon] = false
147
+ options[:Delay] = 60
148
+ options[:MaxAge] = 86400 * 7
149
+ options[:Once] = false
150
+ options[:RailsEnv] = ENV['RAILS_ENV']
151
+ options[:Pidfile] = options[:Chdir] + '/log/ar_sendmail.pid'
152
+
153
+ opts = OptionParser.new do |opts|
154
+ opts.banner = "Usage: #{name} [options]"
155
+ opts.separator ''
156
+
157
+ opts.separator "#{name} scans the email table for new messages and sends them to the"
158
+ opts.separator "website's configured SMTP host."
159
+ opts.separator ''
160
+ opts.separator "#{name} must be run from a Rails application's root."
161
+
162
+ opts.separator ''
163
+ opts.separator 'Sendmail options:'
164
+
165
+ opts.on("-b", "--batch-size BATCH_SIZE",
166
+ "Maximum number of emails to send per delay",
167
+ "Default: Deliver all available emails", Integer) do |batch_size|
168
+ options[:BatchSize] = batch_size
169
+ end
170
+
171
+ opts.on( "--delay DELAY",
172
+ "Delay between checks for new mail",
173
+ "in the database",
174
+ "Default: #{options[:Delay]}", Integer) do |delay|
175
+ options[:Delay] = delay
176
+ end
177
+
178
+ opts.on( "--max-age MAX_AGE",
179
+ "Maxmimum age for an email. After this",
180
+ "it will be removed from the queue.",
181
+ "Set to 0 to disable queue cleanup.",
182
+ "Default: #{options[:MaxAge]} seconds", Integer) do |max_age|
183
+ options[:MaxAge] = max_age
184
+ end
185
+
186
+ opts.on("-o", "--once",
187
+ "Only check for new mail and deliver once",
188
+ "Default: #{options[:Once]}") do |once|
189
+ options[:Once] = once
190
+ end
191
+
192
+ opts.on("-d", "--daemonize",
193
+ "Run as a daemon process",
194
+ "Default: #{options[:Daemon]}") do |daemon|
195
+ options[:Daemon] = true
196
+ end
197
+
198
+ opts.on("-p", "--pidfile PIDFILE",
199
+ "Set the pidfile location",
200
+ "Default: #{options[:Chdir]}#{options[:Pidfile]}", String) do |pidfile|
201
+ options[:Pidfile] = pidfile
202
+ end
203
+
204
+ opts.on( "--mailq",
205
+ "Display a list of emails waiting to be sent") do |mailq|
206
+ options[:MailQ] = true
207
+ end
208
+
209
+ opts.separator ''
210
+ opts.separator 'Setup Options:'
211
+
212
+ opts.separator ''
213
+ opts.separator 'Generic Options:'
214
+
215
+ opts.on("-c", "--chdir PATH",
216
+ "Use PATH for the application path",
217
+ "Default: #{options[:Chdir]}") do |path|
218
+ usage opts, "#{path} is not a directory" unless File.directory? path
219
+ usage opts, "#{path} is not readable" unless File.readable? path
220
+ options[:Chdir] = path
221
+ end
222
+
223
+ opts.on("-e", "--environment RAILS_ENV",
224
+ "Set the RAILS_ENV constant",
225
+ "Default: #{options[:RailsEnv]}") do |env|
226
+ options[:RailsEnv] = env
227
+ end
228
+
229
+ opts.on("-v", "--[no-]verbose",
230
+ "Be verbose",
231
+ "Default: #{options[:Verbose]}") do |verbose|
232
+ options[:Verbose] = verbose
233
+ end
234
+
235
+ opts.on("-h", "--help",
236
+ "You're looking at it") do
237
+ usage opts
238
+ end
239
+
240
+ opts.on("--version", "Version of ARMailer") do
241
+ usage "ar_mailer #{VERSION} (adzap fork)"
242
+ end
243
+
244
+ opts.separator ''
245
+ end
246
+
247
+ opts.parse! args
248
+
249
+ ENV['RAILS_ENV'] = options[:RailsEnv]
250
+
251
+ Dir.chdir options[:Chdir] do
252
+ begin
253
+ require 'config/environment'
254
+ require 'action_mailer/ar_mailer'
255
+ rescue LoadError
256
+ usage opts, <<-EOF
257
+ #{name} must be run from a Rails application's root to deliver email.
258
+ #{Dir.pwd} does not appear to be a Rails application root.
259
+ EOF
260
+ end
261
+ end
262
+
263
+ return options
264
+ end
265
+
266
+ ##
267
+ # Processes +args+ and runs as appropriate
268
+
269
+ def self.run(args = ARGV)
270
+ options = process_args args
271
+
272
+ if options.include? :MailQ then
273
+ mailq
274
+ exit
275
+ end
276
+
277
+ if options[:Daemon] then
278
+ require 'webrick/server'
279
+ @@pid_file = File.expand_path(options[:Pidfile], options[:Chdir])
280
+ if File.exists? @@pid_file
281
+ # check to see if process is actually running
282
+ pid = ''
283
+ File.open(@@pid_file, 'r') {|f| pid = f.read.chomp }
284
+ if system("ps -p #{pid} | grep #{pid}") # returns true if process is running, o.w. false
285
+ $stderr.puts "Warning: The pid file #{@@pid_file} exists and ar_sendmail is running. Shutting down."
286
+ exit
287
+ else
288
+ # not running, so remove existing pid file and continue
289
+ self.remove_pid_file
290
+ $stderr.puts "ar_sendmail is not running. Removing existing pid file and starting up..."
291
+ end
292
+ end
293
+ WEBrick::Daemon.start
294
+ File.open(@@pid_file, 'w') {|f| f.write("#{Process.pid}\n")}
295
+ end
296
+
297
+ new(options).run
298
+
299
+ rescue SystemExit
300
+ raise
301
+ rescue SignalException
302
+ exit
303
+ rescue Exception => e
304
+ $stderr.puts "Unhandled exception #{e.message}(#{e.class}):"
305
+ $stderr.puts "\t#{e.backtrace.join "\n\t"}"
306
+ exit 1
307
+ end
308
+
309
+ ##
310
+ # Prints a usage message to $stderr using +opts+ and exits
311
+
312
+ def self.usage(opts, message = nil)
313
+ if message then
314
+ $stderr.puts message
315
+ $stderr.puts
316
+ end
317
+
318
+ $stderr.puts opts
319
+ exit 1
320
+ end
321
+
322
+ ##
323
+ # Creates a new ARSendmail.
324
+ #
325
+ # Valid options are:
326
+ # <tt>:BatchSize</tt>:: Maximum number of emails to send per delay
327
+ # <tt>:Delay</tt>:: Delay between deliver attempts
328
+ # <tt>:Once</tt>:: Only attempt to deliver emails once when run is called
329
+ # <tt>:Verbose</tt>:: Be verbose.
330
+
331
+ def initialize(options = {})
332
+ options[:Delay] ||= 60
333
+ options[:MaxAge] ||= 86400 * 7
334
+
335
+ @batch_size = options[:BatchSize]
336
+ @delay = options[:Delay]
337
+ @once = options[:Once]
338
+ @verbose = options[:Verbose]
339
+ @max_age = options[:MaxAge]
340
+ @smtp_settings = options[:smtp_settings]
341
+
342
+ @failed_auth_count = 0
343
+ end
344
+
345
+ ##
346
+ # Removes emails that have lived in the queue for too long. If max_age is
347
+ # set to 0, no emails will be removed.
348
+
349
+ def cleanup
350
+ return if @max_age == 0
351
+ timeout = Time.now - @max_age
352
+ conditions = ['last_send_attempt > 0 and created_on < ?', timeout]
353
+ mail = ActionMailer::Base.email_class.destroy_all conditions
354
+
355
+ log "expired #{mail.length} emails from the queue"
356
+ end
357
+
358
+ ##
359
+ # Delivers +emails+ to ActionMailer's SMTP server and destroys them.
360
+
361
+ def deliver(emails)
362
+ settings = [
363
+ smtp_settings[:domain],
364
+ (smtp_settings[:user] || smtp_settings[:user_name]),
365
+ smtp_settings[:password],
366
+ smtp_settings[:authentication]
367
+ ]
368
+
369
+ smtp = Net::SMTP.new(smtp_settings[:address], smtp_settings[:port])
370
+ if smtp.respond_to?(:enable_starttls_auto)
371
+ smtp.enable_starttls_auto unless smtp_settings[:tls] == false
372
+ else
373
+ settings << smtp_settings[:tls]
374
+ end
375
+
376
+ smtp.start(*settings) do |session|
377
+ @failed_auth_count = 0
378
+ until emails.empty? do
379
+ email = emails.shift
380
+ begin
381
+ res = session.send_message email.mail, email.from, email.to
382
+ email.destroy
383
+ log "sent email %011d from %s to %s: %p" %
384
+ [email.id, email.from, email.to, res]
385
+ rescue Net::SMTPFatalError => e
386
+ log "5xx error sending email %d, removing from queue: %p(%s):\n\t%s" %
387
+ [email.id, e.message, e.class, e.backtrace.join("\n\t")]
388
+ email.destroy
389
+ session.reset
390
+ rescue Net::SMTPServerBusy => e
391
+ log "server too busy, sleeping #{@delay} seconds"
392
+ sleep delay
393
+ return
394
+ rescue Net::SMTPUnknownError, Net::SMTPSyntaxError, TimeoutError => e
395
+ email.last_send_attempt = Time.now.to_i
396
+ email.save rescue nil
397
+ log "error sending email %d: %p(%s):\n\t%s" %
398
+ [email.id, e.message, e.class, e.backtrace.join("\n\t")]
399
+ session.reset
400
+ end
401
+ end
402
+ end
403
+ rescue Net::SMTPAuthenticationError => e
404
+ @failed_auth_count += 1
405
+ if @failed_auth_count >= MAX_AUTH_FAILURES then
406
+ log "authentication error, giving up: #{e.message}"
407
+ raise e
408
+ else
409
+ log "authentication error, retrying: #{e.message}"
410
+ end
411
+ sleep delay
412
+ rescue Net::SMTPServerBusy, SystemCallError, OpenSSL::SSL::SSLError
413
+ # ignore SMTPServerBusy/EPIPE/ECONNRESET from Net::SMTP.start's ensure
414
+ end
415
+
416
+ ##
417
+ # Prepares ar_sendmail for exiting
418
+
419
+ def do_exit
420
+ log "caught signal, shutting down"
421
+ self.class.remove_pid_file
422
+ exit
423
+ end
424
+
425
+ ##
426
+ # Returns emails in email_class that haven't had a delivery attempt in the
427
+ # last 300 seconds.
428
+
429
+ def find_emails
430
+ options = { :conditions => ['last_send_attempt < ? and ready', Time.now.to_i - 300] }
431
+ options[:limit] = batch_size unless batch_size.nil?
432
+ mail = ActionMailer::Base.email_class.find :all, options
433
+
434
+ log "found #{mail.length} emails to send"
435
+ mail
436
+ end
437
+
438
+ ##
439
+ # Installs signal handlers to gracefully exit.
440
+
441
+ def install_signal_handlers
442
+ trap 'TERM' do do_exit end
443
+ trap 'INT' do do_exit end
444
+ end
445
+
446
+ ##
447
+ # Logs +message+ if verbose
448
+
449
+ def log(message)
450
+ $stderr.puts message if @verbose
451
+ ActionMailer::Base.logger.info "ar_sendmail: #{message}"
452
+ end
453
+
454
+ ##
455
+ # Scans for emails and delivers them every delay seconds. Only returns if
456
+ # once is true.
457
+
458
+ def run
459
+ install_signal_handlers
460
+
461
+ loop do
462
+ now = Time.now
463
+ deliver_emails
464
+ break if @once
465
+ sleep @delay if now + @delay > Time.now
466
+ end
467
+ end
468
+
469
+ def deliver_emails
470
+ begin
471
+ cleanup
472
+ emails = find_emails
473
+ deliver(emails) unless emails.empty?
474
+ rescue ActiveRecord::Transactions::TransactionError
475
+ end
476
+ end
477
+
478
+ ##
479
+ # Proxy to ActionMailer::Base::smtp_settings. See
480
+ # http://api.rubyonrails.org/classes/ActionMailer/Base.html
481
+ # for instructions on how to configure ActionMailer's SMTP server.
482
+ #
483
+ # Falls back to ::server_settings if ::smtp_settings doesn't exist for
484
+ # backwards compatibility.
485
+
486
+ def smtp_settings
487
+ @smtp_settings ||= ActionMailer::Base.smtp_settings rescue ActionMailer::Base.server_settings
488
+ end
489
+
490
+ ##
491
+ # Packs non-digested messages into digests, and send them
492
+ # options: (see default values in first lines of code)
493
+ # :dump_path - dir in which to dump full digest message in case it needs to be truncated.
494
+ # :subj_prefix - specifies subject prefix that is already set to all the messages. If it's specified it's removed from subjects when combining them into digest's subject.
495
+ # :max_subj_size - maximum subject size of digest email
496
+ # :mail_body_size_limit - maximum body size of digest email
497
+ # :smtp_settings - what smtp settings to use. Hash is expected described in http://api.rubyonrails.org/classes/ActionMailer/Base.html, +setting :tls to false will work. If omitted asks it from #smtp_settings method
498
+ def self.digest_error_emails(options = {})
499
+ options.reverse_merge! :dump_path => 'log', :max_subj_size => 150, :mail_body_size_limit => 1.megabyte
500
+
501
+ subj_prefix = options[:subj_prefix]
502
+ max_subj_size = options[:max_subj_size]
503
+ mail_body_size_limit = options[:mail_body_size_limit]
504
+
505
+ email_class = ActionMailer::Base.email_class
506
+ #Email.count(:group => :to) doesn't work because to is reserved word in MySQL
507
+ counts = email_class.connection.select_rows("select `to`, count(*) AS count_all FROM `emails` where !ready GROUP BY `to`")
508
+ counts.each do |to, count|
509
+ if count.to_i == 1
510
+ email_class.update_all(['ready = ?', true], ['`to` = ?', to])
511
+ next
512
+ end
513
+ subjects = []
514
+ mails = []
515
+ from = nil
516
+ email_class.transaction do
517
+ emails = email_class.find(:all, :conditions => {:to => to, :ready => false}, :order => 'created_on')
518
+ msg = nil
519
+ email = nil
520
+ last_date = nil
521
+ emails.each do |email|
522
+ msg = TMail::Mail.parse(email.mail)
523
+ subject = msg.subject
524
+ subject = subject[subj_prefix.length..-1] if subject.starts_with?(subj_prefix)
525
+ subjects << subject
526
+ mail = msg.header.select {|key, value| ['date', 'from', 'subject'].include?(key)}.
527
+ map {|key, value| '%s: %s' % [key.capitalize, value.to_s]}.join("\n")
528
+ mail += "\n\n" + msg.body
529
+ mails << mail
530
+ from = msg.header['from'].to_s
531
+ last_date = msg.date
532
+ email.destroy
533
+ end
534
+ new = TMail::Mail.new
535
+ new.to = to
536
+ new.from = from
537
+ subject = subj_prefix + subjects.uniq.join("; ")
538
+ new.subject = subject.size > max_subj_size ? subject[0..max_subj_size] + '... (and more)' : subject
539
+ new.mime_version = msg.mime_version
540
+ new.content_type = "text/plain" #this code doesn't really support anything else
541
+ new.charset = msg.charset
542
+ new.date = last_date
543
+ splitter = "\n" + '=' * 70 + "\n"
544
+ body = splitter + mails.join(splitter)
545
+ if body.size > mail_body_size_limit
546
+ email_dump_path = options[:dump_path] + "/err.emails.#{Time.now.to_i}"
547
+ File.open(email_dump_path, 'w') do |f|
548
+ f.write(body)
549
+ end
550
+ old_size = body.size
551
+ body = body[0..mail_body_size_limit] #yeah it will be bit more considering the header, but we don't care
552
+ new_num = body.split(splitter).size
553
+ body = ("WARNING: not all the messages made it into this digest - some are lost in truncation. " +
554
+ "Original number of messages - #{mails.size} (here only #{new_num}); original size - #{old_size} " +
555
+ "(here only #{body.size}). Full dump of original emails is placed in #{email_dump_path} @#{`hostname`.strip}.\n\n") + body
556
+ end
557
+ new.body = body
558
+ email = email_class.create!(:from => email.from, :to => to, :mail => new.to_s, :ready => true)
559
+ end
560
+ end
561
+ self.new(:smtp_settings => options[:smtp_settings]).deliver_emails
562
+ end
563
+ end
data/lib/smtp_tls.rb ADDED
@@ -0,0 +1,105 @@
1
+ # Original code believed public domain from ruby-talk or ruby-core email.
2
+ # Modifications by Kyle Maxwell <kyle@kylemaxwell.com> used under MIT license.
3
+
4
+ require "openssl"
5
+ require "net/smtp"
6
+
7
+ # :stopdoc:
8
+
9
+ class Net::SMTP
10
+
11
+ class << self
12
+ send :remove_method, :start
13
+ end
14
+
15
+ def self.start( address, port = nil,
16
+ helo = 'localhost.localdomain',
17
+ user = nil, secret = nil, authtype = nil, use_tls = false,
18
+ &block) # :yield: smtp
19
+ new(address, port).start(helo, user, secret, authtype, use_tls, &block)
20
+ end
21
+
22
+ alias tls_old_start start
23
+
24
+ def start( helo = 'localhost.localdomain',
25
+ user = nil, secret = nil, authtype = nil, use_tls = false ) # :yield: smtp
26
+ start_method = use_tls ? :do_tls_start : :do_start
27
+ if block_given?
28
+ begin
29
+ send start_method, helo, user, secret, authtype
30
+ return yield(self)
31
+ ensure
32
+ do_finish
33
+ end
34
+ else
35
+ send start_method, helo, user, secret, authtype
36
+ return self
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ def do_tls_start(helodomain, user, secret, authtype)
43
+ raise IOError, 'SMTP session already started' if @started
44
+ check_auth_args user, secret, authtype if user or secret
45
+
46
+ sock = timeout(@open_timeout) { TCPSocket.open(@address, @port) }
47
+ @socket = Net::InternetMessageIO.new(sock)
48
+ @socket.read_timeout = 60 #@read_timeout
49
+ @socket.debug_output = STDERR #@debug_output
50
+
51
+ check_response(critical { recv_response() })
52
+ do_helo(helodomain)
53
+
54
+ raise 'openssl library not installed' unless defined?(OpenSSL)
55
+ starttls
56
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
57
+ ssl.sync_close = true
58
+ ssl.connect
59
+ @socket = Net::InternetMessageIO.new(ssl)
60
+ @socket.read_timeout = 60 #@read_timeout
61
+ @socket.debug_output = STDERR #@debug_output
62
+ do_helo(helodomain)
63
+
64
+ authenticate user, secret, authtype if user
65
+ @started = true
66
+ ensure
67
+ unless @started
68
+ # authentication failed, cancel connection.
69
+ @socket.close if not @started and @socket and not @socket.closed?
70
+ @socket = nil
71
+ end
72
+ end
73
+
74
+ def do_helo(helodomain)
75
+ begin
76
+ if @esmtp
77
+ ehlo helodomain
78
+ else
79
+ helo helodomain
80
+ end
81
+ rescue Net::ProtocolError
82
+ if @esmtp
83
+ @esmtp = false
84
+ @error_occured = false
85
+ retry
86
+ end
87
+ raise
88
+ end
89
+ end
90
+
91
+ def starttls
92
+ getok('STARTTLS')
93
+ end
94
+
95
+ alias tls_old_quit quit
96
+
97
+ def quit
98
+ begin
99
+ getok('QUIT')
100
+ rescue EOFError
101
+ end
102
+ end
103
+
104
+ end unless Net::SMTP.private_method_defined? :do_tls_start or
105
+ Net::SMTP.method_defined? :tls?
@@ -0,0 +1,30 @@
1
+ #!/bin/sh
2
+ # PROVIDE: ar_sendmail
3
+ # REQUIRE: DAEMON
4
+ # BEFORE: LOGIN
5
+ # KEYWORD: FreeBSD shutdown
6
+
7
+ #
8
+ # Add the following lines to /etc/rc.conf to enable ar_sendmail:
9
+ #
10
+ #ar_sendmail_enable="YES"
11
+
12
+ . /etc/rc.subr
13
+
14
+ name="ar_sendmail"
15
+ rcvar=`set_rcvar`
16
+
17
+ command="/usr/local/bin/ar_sendmail"
18
+ command_interpreter="/usr/local/bin/ruby18"
19
+
20
+ # set defaults
21
+
22
+ ar_sendmail_rails_env=${ar_sendmail_rails_env:-"production"}
23
+ ar_sendmail_chdir=${ar_sendmail_chdir:-"/"}
24
+ ar_sendmail_enable=${ar_sendmail_enable:-"NO"}
25
+ ar_sendmail_flags=${ar_sendmail_flags:-"-d"}
26
+
27
+ load_rc_config $name
28
+ export RAILS_ENV=$ar_sendmail_rails_env
29
+ run_rc_command "$1"
30
+