Spec-Zone.ru › Ruby on Rails 8.1

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:

  • github.com/rails/rails/tree/main/actionmailer

Лицензия

Action Mailer распространяется по лицензии MIT:

  • opensource.org/licenses/MIT

Поддержка

Документация API доступна по адресу

  • api.rubyonrails.org

Сообщения об ошибках в проекте Ruby on Rails можно отправлять здесь:

  • github.com/rails/rails/issues

Обсуждать запросы на добавление функций следует на форуме rubyonrails-core здесь:

  • discuss.rubyonrails.org/c/rubyonrails-core

Общедоступные методы класса

deliver_all_later (*deliveries, **options) Показать исходный код
# 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.

deliver_all_later! (*deliveries, **options) Показать исходный код
# 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, поэтому используйте этот метод с осторожностью.

eager_load! () Показать исходный код
# 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
Вызывает метод суперкласса
gem_version () Показать исходный код
# File actionmailer/lib/action_mailer/gem_version.rb, line 5
def self.gem_version
  Gem::Version.new VERSION::STRING
end

Возвращает текущую загруженную версию Action Mailer в виде Gem::Version.

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.

Spec-Zone.ru

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