跳至内容 跳至搜索

Action Mailer MessageDelivery

ActionMailer::MessageDelivery 类由 ActionMailer::Base 在创建新邮件发送器时使用。 MessageDelivery 是一个包装器(Delegator 的子类),围绕一个惰性创建的 Mail::Message。您可以直接访问 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 136
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 109
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 157
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 145
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 75
def message
  __getobj__
end

processed?()

代理是否已加载,导致邮件发送器操作被处理?

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