2012-02-17 18:54:11 -05:00
require 'sidekiq/extensions/generic_proxy'
module Sidekiq
module Extensions
##
2013-06-01 03:06:15 -04:00
# Adds 'delay', 'delay_for' and `delay_until` methods to ActionMailer to offload arbitrary email
2012-02-17 18:54:11 -05:00
# delivery to Sidekiq. Example:
#
# UserMailer.delay.send_welcome_email(new_user)
2012-05-25 23:21:42 -04:00
# UserMailer.delay_for(5.days).send_welcome_email(new_user)
2012-11-14 23:54:43 -05:00
# UserMailer.delay_until(5.days.from_now).send_welcome_email(new_user)
2012-02-17 18:54:11 -05:00
class DelayedMailer
include Sidekiq :: Worker
def perform ( yml )
( target , method_name , args ) = YAML . load ( yml )
2014-09-03 18:57:55 -04:00
msg = target . public_send ( method_name , * args )
2012-10-19 13:50:44 -04:00
# The email method can return nil, which causes ActionMailer to return
# an undeliverable empty message.
2015-01-23 14:19:59 -05:00
if msg
deliver ( msg )
else
2015-01-23 14:42:58 -05:00
raise " #{ target . name } # #{ method_name } returned an undeliverable mail object "
2015-01-23 14:19:59 -05:00
end
2014-09-28 15:41:40 -04:00
end
private
def deliver ( msg )
if msg . respond_to? ( :deliver_now )
2014-10-02 18:30:01 -04:00
ActiveSupport :: Deprecation . warn ( '`ActionMailer.delay.method` is deprecated. Use `ActionMailer.method.deliver_later` instead and configure ActiveJob to use Sidekiq.' )
2014-09-28 15:41:40 -04:00
# Rails 4.2/5.0
msg . deliver_now
else
# Rails 3.2/4.0/4.1
msg . deliver
end
2012-02-17 18:54:11 -05:00
end
end
module ActionMailer
2013-12-15 17:16:31 -05:00
def sidekiq_delay ( options = { } )
2012-10-17 13:17:19 -04:00
Proxy . new ( DelayedMailer , self , options )
2012-02-17 18:54:11 -05:00
end
2013-12-15 17:16:31 -05:00
def sidekiq_delay_for ( interval , options = { } )
2012-10-17 13:17:19 -04:00
Proxy . new ( DelayedMailer , self , options . merge ( 'at' = > Time . now . to_f + interval . to_f ) )
2012-05-25 23:21:42 -04:00
end
2013-12-15 17:16:31 -05:00
def sidekiq_delay_until ( timestamp , options = { } )
2012-11-08 12:05:11 -05:00
Proxy . new ( DelayedMailer , self , options . merge ( 'at' = > timestamp . to_f ) )
end
2013-12-15 17:16:31 -05:00
alias_method :delay , :sidekiq_delay
alias_method :delay_for , :sidekiq_delay_for
alias_method :delay_until , :sidekiq_delay_until
2012-02-17 18:54:11 -05:00
end
end
2012-03-10 15:30:15 -05:00
end