module ActionMailer
Action Mailer — простая отправка и тестирование электронной почты
Action Mailer — это фреймворк для проектирования сервисных слоёв электронной почты. Эти слои используются для объединения кода отправки писем для сброса забытых паролей, приветствий при регистрации, счетов на оплату и любых других случаев, требующих отправки письменного уведомления человеку или другой системе.
По сути, Action Mailer — это обёртка над Action Controller и гемом Mail. Он позволяет создавать письма с помощью шаблонов так же, как Action Controller отображает представления с помощью шаблонов.
Кроме того, класс Action Mailer можно использовать для обработки входящих писем, например, чтобы блог мог принимать новые публикации по электронной почте (в том числе отправленные с телефона).
Подробнее об Action Mailer можно узнать в руководстве Основы Action Mailer.
Отправка писем
Фреймворк работает так: сначала инициализируются все переменные экземпляра, которые должны быть доступны в шаблоне письма, а затем вызывается mail для отправки письма.
Это может быть так просто:
class Notifier < ActionMailer::Base
default from: 'system@loudthinking.com'
def welcome(recipient)
@recipient = recipient
mail(to: recipient,
subject: "[Signed up] Welcome #{recipient}")
end
end
Тело письма создаётся с помощью шаблона Action View (обычный ERB) с переменными экземпляра, объявленными в действии почтового сервиса.
Таким образом, соответствующий шаблон тела письма для приведённого выше метода может выглядеть так:
Hello there, Mr. <%= @recipient %> Thank you for signing up!
Если в качестве получателя указать «david@loudthinking.com», сгенерированное письмо будет выглядеть так:
Date: Mon, 25 Jan 2010 22:48:09 +1100
From: system@loudthinking.com
To: david@loudthinking.com
Message-ID: <4b5d84f9dd6a5_7380800b81ac29578@void.loudthinking.com.mail>
Subject: [Signed up] Welcome david@loudthinking.com
Mime-Version: 1.0
Content-Type: text/plain;
charset="US-ASCII";
Content-Transfer-Encoding: 7bit
Hello there,
Mr. david@loudthinking.com
Thank you for signing up! Чтобы отправить письмо, достаточно вызвать метод, а затем вызвать deliver_now для возвращаемого значения.
Вызов метода возвращает объект сообщения Mail:
message = Notifier.welcome("david@loudthinking.com") # => Returns a Mail::Message object
message.deliver_now # => delivers the email
Или можно просто объединить вызовы методов в цепочку:
Notifier.welcome("david@loudthinking.com").deliver_now # Creates the email and sends it immediately
Настройка значений по умолчанию
Можно задать значения по умолчанию, которые будут использоваться в каждом методе класса Action Mailer. Чтобы воспользоваться этой возможностью, просто вызовите общедоступный метод класса default, который доступен вам благодаря ActionMailer::Base. Этот метод принимает в качестве параметра Hash. В качестве ключа можно использовать любой из заголовков писем, например :from. Также можно передать строку в качестве ключа, например «Content-Type», но Action Mailer делает это автоматически, поэтому беспокоиться об этом не нужно. Наконец, можно передать Proc, который будет вычислен при необходимости.
Обратите внимание: любое значение, заданное этим методом, будет перезаписано, если в методе почтового сервиса используется тот же ключ.
Пример:
class AuthenticationMailer < ActionMailer::Base
default from: "awesome@application.com", subject: Proc.new { "E-mail was generated at #{Time.now}" }
.....
end Конфигурация
Полный список параметров конфигурации приведён в классе Base. Вот пример:
ActionMailer::Base.smtp_settings = {
address: 'smtp.yourserver.com', # default: localhost
port: '25', # default: 25
user_name: 'user',
password: 'pass',
authentication: :plain # :plain, :login or :cram_md5
}
Загрузка и установка
Последнюю версию Action Mailer можно установить с помощью RubyGems:
$ gem install actionmailer
Исходный код можно скачать в составе проекта Rails на GitHub:
Лицензия
Action Mailer распространяется по лицензии MIT:
Поддержка
Документация API доступна по адресу
Сообщения об ошибках в проекте Ruby on Rails можно отправлять здесь:
Обсуждать запросы на добавление функций следует на форуме rubyonrails-core здесь:
Общедоступные методы класса
# File actionmailer/lib/action_mailer/message_delivery.rb, line 9
def deliver_all_later(*deliveries, **options)
_deliver_all_later("deliver_now", *deliveries, **options)
end Поставить в очередь сразу несколько писем для отправки через Active Job. Когда будет запущено отдельное задание, оно отправит письмо с помощью deliver_now.
# File actionmailer/lib/action_mailer/message_delivery.rb, line 17
def deliver_all_later!(*deliveries, **options)
_deliver_all_later("deliver_now!", *deliveries, **options)
end Поставить в очередь сразу несколько писем для отправки через Active Job. Когда будет запущено отдельное задание, оно отправит письмо с помощью deliver_now!. Это означает, что сообщение будет отправлено без проверки perform_deliveries и raise_delivery_errors, поэтому используйте этот метод с осторожностью.
# File actionmailer/lib/action_mailer.rb, line 61
def self.eager_load!
super
require "mail"
Mail.eager_autoload!
Base.descendants.each do |mailer|
mailer.eager_load! unless mailer.abstract?
end
end # File actionmailer/lib/action_mailer/gem_version.rb, line 5 def self.gem_version Gem::Version.new VERSION::STRING end
Возвращает текущую загруженную версию Action Mailer в виде Gem::Version.
# File actionmailer/lib/action_mailer/version.rb, line 8 def self.version gem_version end
Возвращает текущую загруженную версию Action Mailer в виде Gem::Version.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.