класс ActionMailbox::Base
Базовый класс для всех почтовых ящиков приложения. Не предназначен для прямого наследования. Нужно наследоваться от 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. Если происходит отправка уведомления об ошибке (bounce), тогда bounced. Если возникает необработанное исключение, тогда failed.
Исключения можно обрабатывать на уровне класса, используя знакомый подход Rescuable:
class ForwardsMailbox < ApplicationMailbox
rescue_from(ApplicationSpecificVerificationError) { bounced! }
end
Атрибуты
Публичные методы класса
# File actionmailbox/lib/action_mailbox/base.rb, line 76 def initialize(inbound_email) @inbound_email = inbound_email end
# File actionmailbox/lib/action_mailbox/base.rb, line 72 def self.receive(inbound_email) new(inbound_email).perform_processing end
Публичные методы экземпляра
# File actionmailbox/lib/action_mailbox/base.rb, line 101 def bounce_with(message) inbound_email.bounced! message.deliver_later end
Добавляет указанное message в очередь доставки и меняет состояние входящей электронной почты на :bounced.
# File actionmailbox/lib/action_mailbox/base.rb, line 91 def process # Overwrite in subclasses end
© 2004–2020 David Heinemeier Hansson
Licensed under the MIT License.