跳至内容 跳至搜索

Action Mailer MessageDelivery

ActionMailer::MessageDelivery 类在创建新邮件时由 ActionMailer::Base 使用。MessageDelivery 是一个围绕延迟创建的 Mail::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