class Smser::SmsDelivery
The ActionMailer::MessageDelivery
class is used by ActionMailer::Base
when creating a new mailer. MessageDelivery
is a wrapper (Delegator
subclass) around a lazy created Mail::Message
. You can get direct access to the Mail::Message
, deliver the email or schedule the email to be sent through Active Job.
Notifier.welcome(User.first) # an ActionMailer::MessageDelivery object Notifier.welcome(User.first).deliver_now # sends the email Notifier.welcome(User.first).deliver_later # enqueue email delivery as a job through Active Job Notifier.welcome(User.first).message # a Mail::Message object
Public Instance Methods
Enqueues the esms to be delivered through Active Job. When the job runs it will send the esms using deliver_now
.
Notifier.welcome(User.first).deliver_later Notifier.welcome(User.first).deliver_later(wait: 1.hour) Notifier.welcome(User.first).deliver_later(wait_until: 10.hours.from_now)
Options:
-
:wait
- Enqueue the esms to be delivered with a delay. -
:wait_until
- Enqueue the esms to be delivered at (after) a specific date / time. -
:queue
- Enqueue the esms on the specified queue.
# File lib/smser/sms_delivery.rb, line 76 def deliver_later(options={}) enqueue_delivery :deliver_now, options end
Enqueues the esms to be delivered through Active Job. When the job runs it will send the esms using deliver_now!
. That means that the message will be sent bypassing checking perform_deliveries
and raise_delivery_errors
, so use with caution.
Notifier.welcome(User.first).deliver_later! Notifier.welcome(User.first).deliver_later!(wait: 1.hour) Notifier.welcome(User.first).deliver_later!(wait_until: 10.hours.from_now)
Options:
-
:wait
- Enqueue the esms to be delivered with a delay -
:wait_until
- Enqueue the esms to be delivered at (after) a specific date / time -
:queue
- Enqueue the esms on the specified queue
# File lib/smser/sms_delivery.rb, line 60 def deliver_later!(options={}) enqueue_delivery :deliver_now!, options end
Delivers an esms:
Notifier.welcome(User.first).deliver_now
# File lib/smser/sms_delivery.rb, line 95 def deliver_now processed_smser.handle_exceptions do message.deliver end end
Delivers an esms without checking perform_deliveries
and raise_delivery_errors
, so use with caution.
Notifier.welcome(User.first).deliver_now!
# File lib/smser/sms_delivery.rb, line 85 def deliver_now! processed_smser.handle_exceptions do message.deliver! end end
Returns the resulting Mail::Message
# File lib/smser/sms_delivery.rb, line 37 def message __getobj__ end
Was the delegate loaded, causing the smser action to be processed?
# File lib/smser/sms_delivery.rb, line 42 def processed? @processed_smser || @sms_message end
Private Instance Methods
# File lib/smser/sms_delivery.rb, line 110 def enqueue_delivery(delivery_method, options={}) if processed? ::Kernel.raise "You've accessed the message before asking to " \ "deliver it later, so you may have made local changes that would " \ "be silently lost if we enqueued a job to deliver it. Why? Only " \ "the smser method *arguments* are passed with the delivery job! " \ "Do not access the message in any way if you mean to deliver it " \ "later. Workarounds: 1. don't touch the message before calling " \ "#deliver_later, 2. only touch the message *within your smser " \ "method*, or 3. use a custom Active Job instead of #deliver_later." else args = @smser_class.name, @action.to_s, delivery_method.to_s, *@args ::Smser::DeliveryJob.set(options).perform_later(*args) end end
Returns the processed Mailer instance. We keep this instance on hand so we can delegate exception handling to it.
# File lib/smser/sms_delivery.rb, line 104 def processed_smser @processed_smser ||= @smser_class.new.tap do |smser| smser.process @action, *@args end end