跳到內容 跳到搜尋

Action Mailer MessageDelivery

當建立新的郵件寄送裝置時,ActionMailer::Base 類別會使用到 ActionMailer::MessageDelivery 類別。MessageDeliveryMail::Message 延遲建立的包裝器(Delegator 子類別)。你可以直接存取 Mail::Message、寄送電子郵件或排定電子郵件透過 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
方法
D
M
P

共用執行個體方法

deliver_later(options = {})

將電子郵件入佇透過 Active Job 寄送。當工作執行時,會使用 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)
Notifier.welcome(User.first).deliver_later(priority: 10)

選項

  • :wait - 將電子郵件入佇以便延遲寄送。

  • :wait_until - 將電子郵件入佇以便在特定時間之後寄送。

  • :queue - 將電子郵件入佇到指定的佇列。

  • :priority - 將電子郵件與指定的優先順序入佇

預設情況下,電子郵件將使用 ActionMailer::MailDeliveryJob 在預設佇列中入佇。郵件寄送器類別可以透過指定 deliver_later_queue_name 類別變數自訂預設工作使用的佇列名稱,或透過指定 delivery_job 提供自訂的工作。如果使用自訂的工作,該工作會控制佇列名稱。

class AccountRegistrationMailer < ApplicationMailer
  self.delivery_job = RegistrationDeliveryJob
end
# File actionmailer/lib/action_mailer/message_delivery.rb, line 102
def deliver_later(options = {})
  enqueue_delivery :deliver_now, options
end

deliver_later!(options = {})

將電子郵件入佇透過 Active Job 寄送。當工作執行時,會使用 deliver_now! 寄送信件。這表示該訊息會繞過檢查 perform_deliveriesraise_delivery_errors 並寄送,所以請小心使用。

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)
Notifier.welcome(User.first).deliver_later!(priority: 10)

選項

  • :wait - 將電子郵件入佇以便延遲寄送

  • :wait_until - 將電子郵件入佇以便在特定時間之後寄送

  • :queue - 將電子郵件入佇到指定的佇列

  • :priority - 將電子郵件與指定的優先順序入佇

預設情況下,電子郵件將使用 ActionMailer::MailDeliveryJob 在預設佇列中入佇。郵件寄送器類別可以透過指定 deliver_later_queue_name 類別變數自訂預設工作使用的佇列名稱,或透過指定 delivery_job 提供自訂的工作。如果使用自訂的工作,該工作會控制佇列名稱。

class AccountRegistrationMailer < ApplicationMailer
  self.delivery_job = RegistrationDeliveryJob
end
# File actionmailer/lib/action_mailer/message_delivery.rb, line 75
def deliver_later!(options = {})
  enqueue_delivery :deliver_now!, options
end

deliver_now()

寄送電子郵件

Notifier.welcome(User.first).deliver_now
# File actionmailer/lib/action_mailer/message_delivery.rb, line 123
def deliver_now
  processed_mailer.handle_exceptions do
    processed_mailer.run_callbacks(:deliver) do
      message.deliver
    end
  end
end

deliver_now!()

寄送電子郵件,而不需要檢查 perform_deliveriesraise_delivery_errors,所以請小心使用。

Notifier.welcome(User.first).deliver_now!
# File actionmailer/lib/action_mailer/message_delivery.rb, line 111
def deliver_now!
  processed_mailer.handle_exceptions do
    processed_mailer.run_callbacks(:deliver) do
      message.deliver!
    end
  end
end

message()

傳回結果的 Mail::Message

# File actionmailer/lib/action_mailer/message_delivery.rb, line 41
def message
  __getobj__
end

processed?()

委派已載入,導致處理郵件寄送動作?

# File actionmailer/lib/action_mailer/message_delivery.rb, line 46
def processed?
  @processed_mailer || @mail_message
end