class ActionMailbox::Base
Базовый класс Action Mailbox
Базовый класс для всех почтовых ящиков приложения. Не предназначен для прямого наследования. Наследуйте от 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.
Исключения можно обрабатывать на уровне класса, используя знакомый подход ActiveSupport::Rescuable:
class ForwardsMailbox < ApplicationMailbox
rescue_from(ApplicationSpecificVerificationError) { bounced! }
end
Атрибуты
Публичные методы класса
# File actionmailbox/lib/action_mailbox/base.rb, line 79 def initialize(inbound_email) @inbound_email = inbound_email end
# File actionmailbox/lib/action_mailbox/base.rb, line 75 def self.receive(inbound_email) new(inbound_email).perform_processing end
Публичные методы экземпляра
# File actionmailbox/lib/action_mailbox/base.rb, line 111 def bounce_now_with(message) inbound_email.bounced! message.deliver_now end
Немедленно отправляет указанное message и изменяет статус входящего письма на :bounced.
# File actionmailbox/lib/action_mailbox/base.rb, line 105 def bounce_with(message) inbound_email.bounced! message.deliver_later end
Отправляет в очередь указанное message для доставки и изменяет статус входящего письма на :bounced.
# File actionmailbox/lib/action_mailbox/base.rb, line 96 def process # Override in subclasses end
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.