Spec-Zone.ru › Ruby on Rails 6.0

класс ActionMailbox::Base

Родитель:
Object
Включенные модули:
ActiveSupport::Rescuable, ActionMailbox::Callbacks, ActionMailbox::Routing

Базовый класс для всех почтовых ящиков приложения. Не предназначен для прямого наследования. Наследуйтесь от ApplicationMailbox вместо этого, так как именно там настраивается маршрутизация, специфичная для приложения. Эта маршрутизация задается следующим образом:

class ApplicationMailbox < ActionMailbox::Base
  # Any of the recipients of the mail (whether to, cc, bcc) are matched against the regexp.
  routing /^replies@/i => :replies

  # Any of the recipients of the mail (whether to, cc, bcc) needs to be an exact match for the string.
  routing "help@example.com" => :help

  # Any callable (proc, lambda, etc) object is passed the inbound_email record and is a match if true.
  routing ->(inbound_email) { inbound_email.mail.to.size > 2 } => :multiple_recipients

  # Any object responding to #match? is called with the inbound_email record as an argument. Match if true.
  routing CustomAddress.new => :custom

  # Any inbound_email that has not been already matched will be sent to the BackstopMailbox.
  routing :all => :backstop
end

Приложениям необходимо переопределить метод #process, который вызывается фреймворком после выполнения обратных вызовов. Доступные обратные вызовы: before_processing, after_processing, и around_processing. Основной сценарий использования — обеспечение выполнения определённых предварительных условий для обработки с помощью обратных вызовов before_processing.

Если предварительное условие не выполняется, обработку можно прервать с помощью метода #bounced!, который будет молча предотвращать дальнейшую обработку, но не будет отправлять никакого уведомления об ошибке. Вы также можете использовать это поведение в паре с вызовом класса Action Mailer, ответственного за отправку фактического электронного письма об ошибке. Это делается с помощью метода #bounce_with, который принимает объект почты, возвращаемый методом Action Mailer, примерно так:

class ForwardsMailbox < ApplicationMailbox
  before_processing :ensure_sender_is_a_user

  private
    def ensure_sender_is_a_user
      unless User.exist?(email_address: mail.from)
        bounce_with UserRequiredMailer.missing(inbound_email)
      end
    end
end

Во время обработки входящего письма отслеживается состояние. До начала обработки письмо обычно имеет статус pending. После начала обработки, непосредственно перед вызовами обратных вызовов и методом #process, статус изменяется на processing. Если обработка завершается успешно, статус изменяется на delivered. Если возникает ошибка, то bounced. Если возникает необработанное исключение, то failed.

Исключения можно обрабатывать на уровне класса, используя знакомый подход Rescuable.

class ForwardsMailbox < ApplicationMailbox
  rescue_from(ApplicationSpecificVerificationError) { bounced! }
end

Атрибуты

inbound_email[R]

Публичные Классовые Методы

new(inbound_email) Показать исходный код
# File actionmailbox/lib/action_mailbox/base.rb, line 76
def initialize(inbound_email)
  @inbound_email = inbound_email
end
receive(inbound_email) Показать исходный код
# File actionmailbox/lib/action_mailbox/base.rb, line 72
def self.receive(inbound_email)
  new(inbound_email).perform_processing
end

Публичные Методы Экземпляров

bounce_with(message) Показать исходный код
# File actionmailbox/lib/action_mailbox/base.rb, line 101
def bounce_with(message)
  inbound_email.bounced!
  message.deliver_later
end

Добавляет указанное message в очередь для доставки и изменяет статус входящего письма на :bounced.

process() Показать исходный код
# File actionmailbox/lib/action_mailbox/base.rb, line 91
def process
  # Overwrite in subclasses
end

© 2004–2019 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API