Spec-Zone.ru › Ruby on Rails 5.0

класс ActionMailer::Base

Родитель:
AbstractController::Base
Включенные модули:
ActionMailer::DeliveryMethods, ActionMailer::Rescuable, ActionMailer::Previews, AbstractController::Rendering, AbstractController::Helpers, AbstractController::Translation, AbstractController::Callbacks, AbstractController::Caching, ActionView::Layouts

Action Mailer позволяет отправлять электронные письма из вашего приложения с использованием модели почтового отправителя и представлений.

Модели почтовых отправителей

Для использования Action Mailer необходимо создать модель почтового отправителя.

$ rails generate mailer Notifier

Сгенерированная модель наследуется от ApplicationMailer, которая в свою очередь наследуется от ActionMailer::Base. Модель почтового отправителя определяет методы, используемые для создания электронного сообщения. В этих методах вы можете настроить переменные, которые будут использоваться в представлениях почтового отправителя, параметры самого письма, такие как адрес :from , и вложения.

class ApplicationMailer < ActionMailer::Base
  default from: 'from@example.com'
  layout 'mailer'
end

class NotifierMailer < ApplicationMailer
  default from: 'no-reply@example.com',
          return_path: 'system@example.com'

  def welcome(recipient)
    @account = recipient
    mail(to: recipient.email_address_with_name,
         bcc: ["bcc@example.com", "Order Watcher <watcher@example.com>"])
  end
end

Внутри метода почтового отправителя у вас есть доступ к следующим методам:

  • attachments[]= - Позволяет добавлять вложения к вашему письму интуитивно; attachments['filename.png'] = File.read('path/to/filename.png')

  • attachments.inline[]= - Позволяет добавлять встроенное вложение в ваше письмо таким же образом, как attachments[]=

  • headers[]= - Позволяет указать любой заголовок поля в вашем письме, например headers['X-No-Spam'] = 'True'. Обратите внимание, что объявление заголовка несколько раз добавит несколько полей с одинаковым именем. Прочитайте документацию headers для получения дополнительной информации.

  • headers(hash) - Позволяет указать несколько заголовков в вашем письме, таких как headers({'X-No-Spam' => 'True', 'In-Reply-To' => '1234@message.id'})

  • mail - Позволяет указать электронное письмо для отправки.

Передаваемый в метод mail хэш позволяет указать любой заголовок, который примет Mail::Message (любой допустимый заголовок электронной почты, включая необязательные поля).

Метод mail, если ему не передан блок, проверит ваши представления и отправит все представления с тем же именем, что и метод, поэтому вышеуказанное действие также отправит файл представления welcome.text.erb, а также файл представления welcome.html.erb в письме multipart/alternative.

Если вы хотите явно отобразить только определенные шаблоны, передайте блок:

mail(to: user.email) do |format|
  format.text
  format.html
end

Синтаксис блока также полезен для предоставления информации, специфичной для определенной части:

mail(to: user.email) do |format|
  format.text(content_transfer_encoding: "base64")
  format.html
end

Или даже для отображения специального представления:

mail(to: user.email) do |format|
  format.text
  format.html { render "some_other_template" }
end

Представления почтовых отправителей

Как и Action Controller, каждый класс почтового отправителя имеет соответствующий каталог представлений, в котором каждый метод класса ищет шаблон с его именем.

Для определения шаблона, используемого с почтовым отправителем, создайте файл .erb с тем же именем, что и метод в вашей модели почтового отправителя. Например, в определенном выше почтовом отправителе шаблон в app/views/notifier_mailer/welcome.text.erb будет использоваться для создания письма.

Переменные, определенные в методах вашей модели почтового отправителя, доступны как переменные экземпляра в соответствующем представлении.

Письма по умолчанию отправляются в формате обычного текста, поэтому пример представления для нашей модели может выглядеть следующим образом:

Hi <%= @account.name %>,
Thanks for joining our service! Please check back often.

Вы даже можете использовать вспомогательные методы Action View в этих представлениях. Например:

You got a new note!
<%= truncate(@note.body, length: 25) %>

Если вам нужно получить доступ к теме, отправителю или получателям в представлении, вы можете сделать это через объект сообщения:

You got a new note from <%= message.from %>!
<%= truncate(@note.body, length: 25) %>

Генерация URL-адресов

URL-адреса можно генерировать в представлениях почтовых отправителей, используя url_for или именованные маршруты. В отличие от контроллеров из Action Pack, у экземпляра почтового отправителя нет никакого контекста относительно входящего запроса, поэтому вам нужно предоставить все необходимые данные для генерации URL-адреса.

При использовании url_for вам необходимо предоставить :host, :controller и :action.

<%= url_for(host: "example.com", controller: "welcome", action: "greeting") %>

При использовании именованных маршрутов вам нужно указать только :host.

<%= users_url(host: "example.com") %>

Вы должны использовать стиль named_route_url (который генерирует абсолютные URL-адреса) и избегать использования стиля named_route_path (который генерирует относительные URL-адреса), так как клиенты, читающие письмо, не будут иметь представления о текущем URL-адресе, для определения относительного пути.

Также можно установить хост по умолчанию, который будет использоваться во всех почтовых отправителях, установив опцию :host в качестве конфигурационного параметра в config/application.rb.

config.action_mailer.default_url_options = { host: "example.com" }

По умолчанию, когда config.force_ssl равно true, сгенерированные для хостов URL-адреса будут использовать протокол HTTPS.

Отправка почты

После определения действия почтового отправителя и шаблона вы можете доставить ваше сообщение или отложить его создание и доставку на более поздний срок:

NotifierMailer.welcome(User.first).deliver_now # sends the email
mail = NotifierMailer.welcome(User.first)      # => an ActionMailer::MessageDelivery object
mail.deliver_now                               # generates and sends the email now

Класс ActionMailer::MessageDelivery — это обёртка вокруг делегата, который вызовет ваш метод для генерации письма. Если вам нужен прямой доступ к делегату или Mail::Message, вы можете вызвать метод message объекта ActionMailer::MessageDelivery.

NotifierMailer.welcome(User.first).message     # => a Mail::Message object

Action Mailer хорошо интегрирован с Active Job, поэтому вы можете генерировать и отправлять электронные письма в фоновом режиме (например, вне цикла запроса-ответа, чтобы пользователь не должен был ждать этого):

NotifierMailer.welcome(User.first).deliver_later # enqueue the email sending to Active Job

Обратите внимание, что deliver_later выполнит ваш метод из фонового задания.

Вы никогда не создаёте экземпляр класса почтового отправителя. Вместо этого просто вызывайте метод, который вы определили в классе. Все методы экземпляров должны возвращать объект сообщения для отправки.

Письма с несколькими частями

Письма с несколькими частями также могут использоваться неявно, потому что Action Mailer автоматически обнаруживает и использует шаблоны с несколькими частями, где каждый шаблон имеет имя действия, за которым следует тип содержимого. Каждый такой обнаруженный шаблон будет добавлен в сообщение как отдельная часть.

Например, если существуют следующие шаблоны:

  • signup_notification.text.erb

  • signup_notification.html.erb

  • signup_notification.xml.builder

  • signup_notification.yml.erb

Каждый из них будет отображён и добавлен как отдельная часть в сообщение с соответствующим типом содержимого. Тип содержимого для всего сообщения автоматически устанавливается в multipart/alternative, что указывает на то, что письмо содержит несколько различных представлений одного и того же тела письма. Те же переменные экземпляра, определённые в действии, передаются всем шаблонам электронных писем.

Неявное отображение шаблонов не выполняется, если какие-либо вложения или части были добавлены в электронное письмо. Это означает, что вам нужно вручную добавить каждую часть в письмо и установить тип содержимого письма в multipart/alternative.

Вложения

Отправка вложений в электронные письма проста:

class NotifierMailer < ApplicationMailer
  def welcome(recipient)
    attachments['free_book.pdf'] = File.read('path/to/file.pdf')
    mail(to: recipient, subject: "New account information")
  end
end

Что будет (если в каталоге представлений будут и шаблон welcome.text.erb, и шаблон welcome.html.erb), отправлять полное письмо multipart/mixed с двумя частями: первая часть — multipart/alternative с текстовыми и HTML-частями письма внутри, а вторая — application/pdf с Base64-кодированной копией книги file.pdf с именем файла free_book.pdf.

Если вам нужно отправить вложения без содержимого, вам нужно создать для них пустое представление или добавить пустой параметр тела, как в этом примере:

class NotifierMailer < ApplicationMailer
  def welcome(recipient)
    attachments['free_book.pdf'] = File.read('path/to/file.pdf')
    mail(to: recipient, subject: "New account information", body: "")
  end
end

Встроенные вложения

Вы также можете указать, что файл должен отображаться встроенным образом вместе с другими HTML-элементами. Это полезно, если вы хотите отобразить корпоративный логотип или фото.

class NotifierMailer < ApplicationMailer
  def welcome(recipient)
    attachments.inline['photo.png'] = File.read('path/to/photo.png')
    mail(to: recipient, subject: "Here is what we look like")
  end
end

А затем, чтобы сослаться на изображение в представлении, вы создаёте файл welcome.html.erb и вызываете image_tag, передавая в него вложение, которое вы хотите отобразить, а затем вызываете url на вложении, чтобы получить относительный путь идентификатора содержимого для источника изображения:

<h1>Please Don't Cringe</h1>

<%= image_tag attachments['photo.png'].url -%>

Поскольку мы используем метод image_tag Action View, вы можете передать любые другие желаемые параметры:

<h1>Please Don't Cringe</h1>

<%= image_tag attachments['photo.png'].url, alt: 'Our Photo', class: 'photo' -%>

Наблюдение и перехват почты

Action Mailer предоставляет крючки в методы наблюдателя и перехватчика Mail. Они позволяют вам регистрировать классы, которые вызываются на протяжении жизненного цикла доставки почты.

Класс наблюдателя должен реализовать метод :delivered_email(message), который будет вызываться один раз для каждого отправленного письма после отправки письма.

Класс перехватчика должен реализовать метод :delivering_email(message), который будет вызываться перед отправкой письма, позволяя вам вносить изменения в письмо до достижения агентов доставки. Ваш класс должен вносить необходимые изменения напрямую в переданный экземпляр Mail::Message.

Значения по умолчанию для Hash

Action Mailer предоставляет некоторые интеллектуальные значения по умолчанию для ваших писем, которые обычно указываются в методе по умолчанию внутри определения класса:

class NotifierMailer < ApplicationMailer
  default sender: 'system@example.com'
end

Вы можете передать любое значение заголовка, которое принимает Mail::Message. По умолчанию, ActionMailer::Base устанавливает следующее:

  • mime_version: "1.0"

  • charset: "UTF-8"

  • content_type: "text/plain"

  • parts_order: [ "text/plain", "text/enriched", "text/html" ]

parts_order и charset фактически не являются допустимыми полями заголовка Mail::Message, но Action Mailer переводит их должным образом и устанавливает правильные значения.

Поскольку вы можете передать любое значение заголовка, вам нужно либо заключить заголовок в кавычки как строку, либо передать его в виде символа с подчеркиванием, поэтому следующее будет работать:

class NotifierMailer < ApplicationMailer
  default 'Content-Transfer-Encoding' => '7bit',
          content_description: 'This is a description'
end

Наконец, Action Mailer также поддерживает передачу объектов Proc в хэш по умолчанию, так что вы можете определить методы, которые оцениваются по мере генерации сообщения:

class NotifierMailer < ApplicationMailer
  default 'X-Special-Header' => Proc.new { my_method }

  private

    def my_method
      'some complex call'
    end
end

Обратите внимание, что процедура оценивается в самом начале генерации сообщения, поэтому, если вы установили что-то в хэше по умолчанию с помощью процедуры, а затем установили то же самое внутри вашего метода почтового отправителя, это будет перезаписано методом почтового отправителя.

Также можно установить эти параметры по умолчанию, которые будут использоваться во всех почтовых отправителях, через конфигурацию default_options= в config/application.rb:

config.action_mailer.default_options = { from: "no-reply@example.org" }

Обработчики

Вы можете указать обработчики, используя before_action и after_action для настройки ваших сообщений. Это может быть полезно, например, когда вы хотите добавить встроенные вложения по умолчанию для всех отправляемых сообщений определённым классом почтового отправителя:

class NotifierMailer < ApplicationMailer
  before_action :add_inline_attachment!

  def welcome
    mail
  end

  private

    def add_inline_attachment!
      attachments.inline["footer.jpg"] = File.read('/path/to/filename.jpg')
    end
end

Обработчики в Action Mailer реализованы с использованием AbstractController::Callbacks, поэтому вы можете определять и настраивать обработчики таким же образом, как вы бы использовали обработчики в классах, унаследованных от ActionController::Base.

Обратите внимание, что если у вас нет особой причины для этого, вы должны предпочесть использовать before_action вместо after_action в ваших классах Action Mailer, чтобы заголовки обрабатывались правильно.

Предварительный просмотр писем

Вы можете визуально просмотреть свои шаблоны писем, добавив файл предварительного просмотра почтового отправителя в ActionMailer::Base.preview_path. Поскольку большинство писем что-то делают с данными базы данных, вам нужно будет написать несколько сценариев для загрузки сообщений с фиктивными данными:

class NotifierMailerPreview < ActionMailer::Preview
  def welcome
    NotifierMailer.welcome(User.first)
  end
end

Методы должны возвращать объект Mail::Message, который можно сгенерировать, вызвав метод mailer без дополнительных deliver_now / deliver_later. Путь к каталогу предварительных просмотров mailer можно настроить с помощью опции preview_path, у которой значение по умолчанию test/mailers/previews.

config.action_mailer.preview_path = "#{Rails.root}/lib/mailer_previews"

Обзор всех предварительных просмотров доступен по адресу http://localhost:3000/rails/mailers на экземпляре работающего сервера разработки.

Предварительные просмотры также можно перехватить аналогичным образом, как и доставки, зарегистрировав обработчик предварительного просмотра, имеющий метод previewing_email:

class CssInlineStyler
  def self.previewing_email(message)
    # inline CSS styles
  end
end

config.action_mailer.preview_interceptors :css_inline_styler

Обратите внимание, что обработчики необходимо регистрировать как с register_interceptor, так и с register_preview_interceptor, если они должны работать как при отправке, так и при просмотре писем.

Параметры конфигурации

Эти параметры задаются на уровне класса, например, ActionMailer::Base.raise_delivery_errors = true

  • default_options - Вы можете передать его как на уровне класса, так и внутри самого класса, как описано в предыдущем разделе.

  • logger - логгер используется для генерирования информации о выполнении рассылки, если он доступен. Может быть установлен в nil для отключения ведения журнала. Совместим как с собственным логгером Ruby Logger, так и с логгерами Log4r.

  • smtp_settings - Разрешает подробную настройку метода доставки :smtp:

    • :address - Позволяет использовать удалённый почтовый сервер. Просто измените его с значения по умолчанию «localhost».

    • :port - В случае, если ваш почтовый сервер работает не на порту 25, вы можете изменить его.

    • :domain - Если необходимо указать домен HELO, вы можете сделать это здесь.

    • :user_name - Если ваш почтовый сервер требует аутентификации, установите имя пользователя в этом параметре.

    • :password - Если ваш почтовый сервер требует аутентификации, установите пароль в этом параметре.

    • :authentication - Если ваш почтовый сервер требует аутентификации, укажите тип аутентификации здесь. Это символ, и один из :plain (будет отправлять пароль в кодировке Base64), :login (будет отправлять пароль в кодировке Base64) или :cram_md5 (объединяет механизм Challenge/Response для обмена информацией и алгоритм Message Digest 5 для хэширования важной информации).

    • :enable_starttls_auto - Определяет, включён ли STARTTLS на вашем SMTP-сервере, и начинает использовать его. По умолчанию true.

    • :openssl_verify_mode - При использовании TLS вы можете настроить, как OpenSSL проверяет сертификат. Это очень полезно, если вам нужно валидировать самозаверяемый и/или сертификат с подстановочными знаками. Вы можете использовать имя константы проверки OpenSSL ('none', 'peer', 'client_once', 'fail_if_no_peer_cert') или напрямую саму константу (OpenSSL::SSL::VERIFY_NONE, OpenSSL::SSL::VERIFY_PEER, …).

  • sendmail_settings - Позволяет переопределить параметры для метода доставки :sendmail.

    • :location - Путь к исполняемому файлу sendmail. По умолчанию /usr/sbin/sendmail.

    • :arguments - Аргументы командной строки. По умолчанию -i с -f sender@address добавленным автоматически перед отправкой сообщения.

  • file_settings - Позволяет переопределить параметры для метода доставки :file.

    • :location - Каталог, в который будут записаны письма. По умолчанию, tmp/mails приложения.

  • raise_delivery_errors - Указывает, следует ли генерировать ошибки, если письмо не было доставлено.

  • delivery_method - Определяет метод доставки. Возможные значения: :smtp (по умолчанию), :sendmail, :test, и :file. Или вы можете указать объект пользовательского метода доставки, например, MyOwnDeliveryMethodClass. См. документацию по интерфейсу Mail gem для реализации пользовательского агента доставки.

  • perform_deliveries - Определяет, отправляются ли письма из Action Mailer при вызове .deliver на сообщение об электронной почте или методе Action Mailer. Это включено по умолчанию, но может быть отключено для упрощения функциональных тестов.

  • deliveries - Хранит массив всех отправленных писем через Action Mailer с delivery_method :test. Наиболее полезно для модульных и функциональных тестов.

  • deliver_later_queue_name - Имя очереди, используемой с deliver_later.

Константы

PROTECTED_IVARS

Атрибуты

mailer_name[W]

Позволяет установить имя текущего почтового клиента.

Методы публичного класса

controller_path()
Псевдоним для: mailer_name
default(value = nil) Показать исходный код
# File actionmailer/lib/action_mailer/base.rb, line 504
def default(value = nil)
  self.default_params = default_params.merge(value).freeze if value
  default_params
end

Устанавливает значения по умолчанию через конфигурацию приложения:

config.action_mailer.default(from: "no-reply@example.org")

Имеет псевдоним ::default_options=

Также имеет псевдоним: default_options=
default_options=(value = nil)

Позволяет установить значения по умолчанию через конфигурацию приложения:

config.action_mailer.default_options = { from: "no-reply@example.org" }
Псевдоним для: default
mailer_name() Показать исходный код
# File actionmailer/lib/action_mailer/base.rb, line 492
def mailer_name
  @mailer_name ||= anonymous? ? "anonymous" : name.underscore
end

Возвращает имя текущего почтового клиента. Этот метод также используется в качестве пути для поиска представления. Если это анонимный почтовый клиент, этот метод вернёт anonymous вместо этого.

Также имеет псевдоним: controller_path
new() Показать исходный код
# File actionmailer/lib/action_mailer/base.rb, line 582
def initialize
  super()
  @_mail_was_called = false
  @_message = Mail.new
end

Инициализирует новый объект почтового клиента. Если method_name не nil, почтовый клиент будет инициализирован в соответствии с указанным методом. В противном случае почтовый клиент останется неинициализированным (полезно, когда вам нужно только вызвать метод «receive», например).

Вызывает метод суперкласса
receive(raw_mail) Показать исходный код
# File actionmailer/lib/action_mailer/base.rb, line 526
def receive(raw_mail)
  ActiveSupport::Notifications.instrument("receive.action_mailer") do |payload|
    mail = Mail.new(raw_mail)
    set_payload_for_mail(payload, mail)
    new.receive(mail)
  end
end

Получает сырое электронное письмо, парсит его в объект электронной почты, декодирует его, создаёт новый почтовый клиент и передаёт объект электронной почты методу receive объекта почтового клиента.

Если вы хотите, чтобы ваш почтовый клиент мог обрабатывать входящие сообщения, вам нужно реализовать метод receive, который принимает строку сырого электронного письма в качестве параметра:

class MyMailer < ActionMailer::Base
  def receive(mail)
    # ...
  end
end
register_interceptor(interceptor) Показать исходный код
# File actionmailer/lib/action_mailer/base.rb, line 476
def register_interceptor(interceptor)
  Mail.register_interceptor(observer_class_for(interceptor))
end

Регистрирует перехватчик, который будет вызываться перед отправкой письма. В качестве перехватчика можно передать класс, строку или символ. Если передаётся строка или символ, он будет преобразован в camelCase и переведён в имя класса.

register_interceptors(*interceptors) Показать исходный код
# File actionmailer/lib/action_mailer/base.rb, line 462
def register_interceptors(*interceptors)
  interceptors.flatten.compact.each { |interceptor| register_interceptor(interceptor) }
end

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

register_observer(observer) Показать исходный код
# File actionmailer/lib/action_mailer/base.rb, line 469
def register_observer(observer)
  Mail.register_observer(observer_class_for(observer))
end

Регистрирует наблюдателя, который будет уведомлен при доставке письма. В качестве наблюдателя можно передать класс, строку или символ. Если передаётся строка или символ, он будет преобразован в camelCase и переведён в имя класса.

register_observers(*observers) Показать исходный код
# File actionmailer/lib/action_mailer/base.rb, line 457
def register_observers(*observers)
  observers.flatten.compact.each { |observer| register_observer(observer) }
end

Регистрирует одного или несколько наблюдателей, которые будут уведомлены при доставке письма.

Защищённые методы класса

supports_path?() Показать исходный код
# File actionmailer/lib/action_mailer/base.rb, line 872
def self.supports_path?
  false
end

Электронные письма не поддерживают относительные пути ссылок.

Публичные методы экземпляра

attachments() Показать исходный код
# File actionmailer/lib/action_mailer/base.rb, line 690
def attachments
  if @_mail_was_called
    LateAttachmentsProxy.new(@_message.attachments)
  else
    @_message.attachments
  end
end

Позволяет добавлять вложения к электронной почте, например:

mail.attachments['filename.jpg'] = File.read('/path/to/filename.jpg')

Если вы это сделаете, Mail определит тип MIME файла по его имени. Также он установит заголовки Content-Type, Content-Disposition, Content-Transfer-Encoding и закодирует содержимое вложения в Base64.

Вы также можете указать переопределения, передав хэш вместо строки:

mail.attachments['filename.jpg'] = {mime_type: 'application/gzip',
                                    content: File.read('/path/to/filename.jpg')}

Если вы хотите использовать кодировку, отличную от Base64, вам необходимо передать тип кодировки вместе с предварительно закодированным содержимым, так как Mail не знает, как декодировать данные:

file_content = SpecialEncode(File.read('/path/to/filename.jpg'))
mail.attachments['filename.jpg'] = {mime_type: 'application/gzip',
                                    encoding: 'SpecialEncoding',
                                    content: file_content }

Вы также можете искать определенные вложения:

# By Filename
mail.attachments['filename.jpg']   # => Mail::Part object or nil

# or by index
mail.attachments[0]                # => Mail::Part (first attachment)
headers(args = nil) Показать исходный код
# File actionmailer/lib/action_mailer/base.rb, line 652
def headers(args = nil)
  if args
    @_message.headers(args)
  else
    @_message
  end
end

Позволяет передавать произвольные и необычные заголовки новому Mail::Message объекту, который добавит их к себе.

headers['X-Special-Domain-Specific-Header'] = "SecretValue"

Вы также можете передать хэш с именами и значениями полей заголовка, которые затем будут установлены в объекте Mail::Message.

headers 'X-Special-Domain-Specific-Header' => "SecretValue",
        'In-Reply-To' => incoming.message_id

Результат Mail::Message будет иметь следующие заголовки:

X-Special-Domain-Specific-Header: SecretValue

Примечания по замене уже определённых заголовков:

  • subject

  • sender

  • from

  • to

  • cc

  • bcc

  • reply-to

  • orig-date

  • message-id

  • references

Поля могут появляться только один раз в заголовках электронной почты, в то время как другие поля, такие как X-Anything, могут появляться несколько раз.

Если вы хотите заменить уже существующий заголовок, сначала установите его в nil, чтобы сбросить значение; в противном случае будет добавлено другое поле для того же заголовка.

mail(headers = {}, &block) Показать исходный код
# File actionmailer/lib/action_mailer/base.rb, line 799
def mail(headers = {}, &block)
  return message if @_mail_was_called && headers.blank? && !block

  # At the beginning, do not consider class default for content_type
  content_type = headers[:content_type]

  headers = apply_defaults(headers)

  # Apply charset at the beginning so all fields are properly quoted
  message.charset = charset = headers[:charset]

  # Set configure delivery behavior
  wrap_delivery_behavior!(headers[:delivery_method], headers[:delivery_method_options])

  assign_headers_to_message(message, headers)

  # Render the templates and blocks
  responses = collect_responses(headers, &block)
  @_mail_was_called = true

  create_parts_from_responses(message, responses)

  # Setup content type, reapply charset and handle parts order
  message.content_type = set_content_type(message, content_type, headers[:content_type])
  message.charset      = charset

  if message.multipart?
    message.body.set_sort_order(headers[:parts_order])
    message.body.sort_parts!
  end

  message
end

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

Он принимает хэш заголовков. Этот хэш позволяет указать наиболее часто используемые заголовки в сообщении электронной почты:

  • :subject - Тема сообщения. Если она опущена, Action Mailer запросит у класса Rails I18n переведённую :subject в рамках области [mailer_scope, action_name], или, если это отсутствует, переведёт человекочитаемый вариант action_name.

  • :to - Получатели сообщения. Может быть строкой адресов или массивом адресов.

  • :from - Отправитель сообщения.

  • :cc - Копии. Может быть строкой адресов или массивом адресов.

  • :bcc - Скрытые копии. Может быть строкой адресов или массивом адресов.

  • :reply_to - Адрес ответа.

  • :date - Дата отправки.

Вы можете установить значения по умолчанию для любого из вышеперечисленных заголовков (кроме :date) с помощью метода класса ::default:

class Notifier < ActionMailer::Base
  default from: 'no-reply@test.lindsaar.net',
          bcc: 'email_logger@test.lindsaar.net',
          reply_to: 'bounces@test.lindsaar.net'
end

Если вам нужны другие заголовки, не указанные выше, вы можете либо передать их в качестве части хэша заголовков, либо использовать метод headers['name'] = value.

Если в качестве заголовка задан :return_path, это значение будет использоваться как адрес «отправителя» для сообщения Mail. Это полезно, когда вы хотите, чтобы уведомления об доставке отправлялись на другой адрес, чем тот, который указан в :from. Mail фактически будет использовать :return_path в приоритете перед :sender и :from для значения «отправителя».

Если вы не передаёте блок в метод mail, он найдёт все шаблоны в путях представлений, используя по умолчанию имя почтового клиента и имя метода, из которого он вызван. Затем он интеллектуально создаст части для каждого из этих шаблонов, сделав обоснованные предположения о правильном типе и последовательности содержимого, и вернёт полностью подготовленное Mail::Message , готовое к вызову метода :deliver для отправки.

Например:

class Notifier < ActionMailer::Base
  default from: 'no-reply@test.lindsaar.net'

  def welcome
    mail(to: 'mikel@test.lindsaar.net')
  end
end

Будет искать все шаблоны в «app/views/notifier» с именем «welcome». Если шаблон welcome не существует, будет возбуждено исключение ActionView::MissingTemplate.

Но это можно настроить:

mail(template_path: 'notifications', template_name: 'another')

И теперь он будет искать все шаблоны в «app/views/notifications» с именем «another».

Если вы передаёте блок, вы можете рендерить конкретные шаблоны по своему выбору:

mail(to: 'mikel@test.lindsaar.net') do |format|
  format.text
  format.html
end

Вы даже можете рендерить простой текст напрямую без использования шаблона:

mail(to: 'mikel@test.lindsaar.net') do |format|
  format.text { render plain: "Hello Mikel!" }
  format.html { render html: "<h1>Hello Mikel!</h1>".html_safe }
end

Это отобразит электронное письмо с multipart/alternative и text/plain частями.

Синтаксис блоков также позволяет настраивать заголовки частей, если это необходимо:

mail(to: 'mikel@test.lindsaar.net') do |format|
  format.text(content_transfer_encoding: "base64")
  format.html
end
mailer_name() Показать исходный код
# File actionmailer/lib/action_mailer/base.rb, line 614
def mailer_name
  self.class.mailer_name
end

Возвращает имя объекта почтового клиента.

Защищённые методы экземпляра

default_i18n_subject(interpolations = {}) Показать исходный код
# File actionmailer/lib/action_mailer/base.rb, line 866
def default_i18n_subject(interpolations = {})
  mailer_scope = self.class.mailer_name.tr('/', '.')
  I18n.t(:subject, interpolations.merge(scope: [mailer_scope, action_name], default: action_name.humanize))
end

Переводит subject с помощью класса Rails I18n в области [mailer_scope, action_name]. Если перевод для subject в указанной области не найден, используется человекочитаемая версия action_name. Если тема содержит интерполяции, вы можете передать их через параметр interpolations.

set_content_type(m, user_content_type, class_default) Показать исходный код
# File actionmailer/lib/action_mailer/base.rb, line 844
def set_content_type(m, user_content_type, class_default)
  params = m.content_type_parameters || {}
  case
  when user_content_type.present?
    user_content_type
  when m.has_attachments?
    if m.attachments.detect(&:inline?)
      ["multipart", "related", params]
    else
      ["multipart", "mixed", params]
    end
  when m.multipart?
    ["multipart", "alternative", params]
  else
    m.content_type || class_default
  end
end

Используется методом mail для установки типа содержимого сообщения.

Использует предоставленный user_content_type, или multipart, если сообщение содержит вложения. Если вложения являются встроенными, тип содержимого будет «multipart/related», в противном случае «multipart/mixed».

Если тип содержимого не передан в заголовках, и нет вложений, или сообщение является multipart, используется тип содержимого по умолчанию.

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

Spec-Zone.ru

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