Spec-Zone.ru › Ruby on Rails 4.1

класс ActionMailer::Base

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

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

Модели рассылки

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

$ rails generate mailer Notifier

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

class Notifier < ActionMailer::Base
  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'. Обратите внимание, что, хотя большинство полей, таких как To: From:, могут появляться только один раз в заголовке письма, другие поля, такие как X-Anything, могут появляться несколько раз. Если вы хотите изменить поле, которое может появляться несколько раз, необходимо сначала установить его в значение nil, чтобы Mail понял, что вы его заменяете, а не добавляете ещё одно поле с таким же именем.

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

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

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

Метод mail, если ему не передан блок, просмотрит ваши представления и отправит все представления с тем же именем, что и метод, поэтому вышеуказанное действие также отправит файл представления welcome.text.erb, а также файл представления welcome.text.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/welcome.text.erb будет использоваться для создания письма.

Переменные, определенные в модели, доступны как переменные экземпляра в представлении.

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

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

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

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" }

Если вы решите установить значение хоста по умолчанию для рассылок, вам необходимо убедиться, что используете параметр only_path: false при использовании url_for. Поскольку помощник представления url_for генерирует относительные URL-адреса по умолчанию, когда параметр :host не указан явно, передача only_path: false гарантирует генерацию абсолютных URL-адресов.

Отправка письма

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

Notifier.welcome(david).deliver # sends the email
mail = Notifier.welcome(david)  # => a Mail::Message object
mail.deliver                    # sends the email

Вы никогда не создаете экземпляр своего класса рассылки. Вместо этого просто вызываете метод, который вы определили для самого класса.

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

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

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

  • signup_notification.text.erb

  • signup_notification.html.erb

  • signup_notification.xml.builder

  • signup_notification.yaml.erb

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

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

Вложения

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

class ApplicationMailer < ActionMailer::Base
  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 копией файла.pdf книги с именем файла free_book.pdf.

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

class ApplicationMailer < ActionMailer::Base
  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 ApplicationMailer < ActionMailer::Base
  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 Notifier < ActionMailer::Base
  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 Notifier < ActionMailer::Base
  default 'Content-Transfer-Encoding' => '7bit',
          content_description: 'This is a description'
end

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

class Notifier < ActionMailer::Base
  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 Notifier < ActionMailer::Base
  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

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

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

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

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

class NotifierPreview < ActionMailer::Preview
  def welcome
    Notifier.welcome(User.first)
  end
end

Методы должны возвращать объект Mail::Message, который может быть сгенерирован вызовом метода mailer без дополнительных deliver. Путь к каталогу предварительных просмотров 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 - Позволяет использовать удаленный SMTP-сервер. Просто измените его значение с установленного по умолчанию “localhost”.

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

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

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

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

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

    • :enable_starttls_auto - Если установлено в true, обнаруживает, включен ли STARTTLS на вашем SMTP-сервере, и начинает его использовать.

    • :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 -t, с автоматически добавленным значением -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. Наиболее полезно для модульного и функционального тестирования.

Константы

PROTECTED_IVARS

Атрибуты

mailer_name[W]

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

Публичные методы класса

controller_path()
Псевдоним для: mailer_name
default(value = nil) Показать исходный код

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

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

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

# File actionmailer/lib/action_mailer/base.rb, line 488
def default(value = nil)
  self.default_params = default_params.merge(value).freeze if value
  default_params
end
Также имеет псевдоним: default_options=
default_options=(value = nil)

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

config.action_mailer.default_options = { from: "no-reply@example.org" }
Псевдоним для: default
mailer_name() Показать исходный код

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

# File actionmailer/lib/action_mailer/base.rb, line 476
def mailer_name
  @mailer_name ||= anonymous? ? "anonymous" : name.underscore
end
Также имеет псевдоним: controller_path
new(method_name=nil, *args) Показать исходный код

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

Вызывает метод суперкласса
# File actionmailer/lib/action_mailer/base.rb, line 564
def initialize(method_name=nil, *args)
  super()
  @_mail_was_called = false
  @_message = Mail.new
  process(method_name, *args) if method_name
end
receive(raw_mail) Показать исходный код

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

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

class MyMailer < ActionMailer::Base
  def receive(mail)
    # ...
  end
end
# File actionmailer/lib/action_mailer/base.rb, line 510
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
register_interceptor(interceptor) Показать исходный код

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

# File actionmailer/lib/action_mailer/base.rb, line 463
def register_interceptor(interceptor)
  delivery_interceptor = case interceptor
    when String, Symbol
      interceptor.to_s.camelize.constantize
    else
      interceptor
    end

  Mail.register_interceptor(delivery_interceptor)
end
register_interceptors(*interceptors) Показать исходный код

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

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

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

# File actionmailer/lib/action_mailer/base.rb, line 449
def register_observer(observer)
  delivery_observer = case observer
    when String, Symbol
      observer.to_s.camelize.constantize
    else
      observer
    end

  Mail.register_observer(delivery_observer)
end
register_observers(*observers) Показать исходный код

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

# File actionmailer/lib/action_mailer/base.rb, line 437
def register_observers(*observers)
  observers.flatten.compact.each { |observer| register_observer(observer) }
end

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

attachments() Показать исходный код

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

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/x-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/x-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)
# File actionmailer/lib/action_mailer/base.rb, line 651
def attachments
  if @_mail_was_called
    LateAttachmentsProxy.new(@_message.attachments)
  else
    @_message.attachments
  end
end
headers(args = nil) Показать исходный код

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

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

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

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

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

X-Special-Domain-Specific-Header: SecretValue
# File actionmailer/lib/action_mailer/base.rb, line 613
def headers(args = nil)
  if args
    @_message.headers(args)
  else
    @_message
  end
end
mail(headers = {}, &block) Показать исходный код

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

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

  • :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 или использовать метод 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 и text/html частями.

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

mail(to: 'mikel@test.lindsaar.net') do |format|
  format.text(content_transfer_encoding: "base64")
  format.html
end
# File actionmailer/lib/action_mailer/base.rb, line 760
def mail(headers = {}, &block)
  return @_message if @_mail_was_called && headers.blank? && !block

  m = @_message

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

  # Call all the procs (if any)
  default_values = {}
  self.class.default.each do |k,v|
    default_values[k] = v.is_a?(Proc) ? instance_eval(&v) : v
  end

  # Handle defaults
  headers = headers.reverse_merge(default_values)
  headers[:subject] ||= default_i18n_subject

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

  # Set configure delivery behavior
  wrap_delivery_behavior!(headers.delete(:delivery_method), headers.delete(:delivery_method_options))

  # Assign all headers except parts_order, content_type and body
  assignable = headers.except(:parts_order, :content_type, :body, :template_name, :template_path)
  assignable.each { |k, v| m[k] = v }

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

  create_parts_from_responses(m, responses)

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

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

  m
end
mailer_name() Показать исходный код

Возвращает имя объекта макера.

# File actionmailer/lib/action_mailer/base.rb, line 595
def mailer_name
  self.class.mailer_name
end

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

default_i18n_subject(interpolations = {}) Показать исходный код

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

# File actionmailer/lib/action_mailer/base.rb, line 839
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
set_content_type(m, user_content_type, class_default) Показать исходный код

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

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

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

# File actionmailer/lib/action_mailer/base.rb, line 817
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 { |a| a.inline? }
      ["multipart", "related", params]
    else
      ["multipart", "mixed", params]
    end
  when m.multipart?
    ["multipart", "alternative", params]
  else
    m.content_type || class_default
  end
end

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

Spec-Zone.ru

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