Spec-Zone.ru › Ruby on Rails 6.0

класс ActionMailer::Base

Родитель:
AbstractController::Base
Включенные модули:
ActionMailer::DeliveryMethods, ActionMailer::Rescuable, ActionMailer::Parameterized, 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" }

Вы также можете определить метод default_url_options в отдельных почтовых рассылках, чтобы переопределить эти параметры по умолчанию для каждой почтовой рассылки.

По умолчанию, когда 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 копией файла book.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["free_book.pdf"] = File.read("path/to/file.pdf")
    mail(to: recipient,
         subject: "New account information",
         content_type: "text/html",
         body: "<html><body>Hello there</body></html>")
  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.

По умолчанию Хэш

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 и Lambda в хэш по умолчанию, поэтому вы можете определять методы, которые будут оцениваться при генерации сообщения:

class NotifierMailer < ApplicationMailer
  default 'X-Special-Header' => Proc.new { my_method }, to: -> { @inviter.email_address }

  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, который можно сгенерировать, вызвав метод почтового клиента без дополнительных deliver_now / deliver_later. Путь к каталогу предварительных просмотров почтового клиента можно настроить, используя параметр 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') или напрямую константу (OpenSSL::SSL::VERIFY_NONE или OpenSSL::SSL::VERIFY_PEER).

    • :ssl/:tls Включает использование SMTP/TLS (SMTPS: SMTP через прямое TLS-соединение) для SMTP-соединения.

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

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

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

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

Константы

PROTECTED_IVARS

Атрибуты

mailer_name[W]

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

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

controller_path()
Псевдоним для: mailer_name
default(value = nil) Show source
# File actionmailer/lib/action_mailer/base.rb, line 545
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() Show source
# File actionmailer/lib/action_mailer/base.rb, line 533
def mailer_name
  @mailer_name ||= anonymous? ? "anonymous" : name.underscore
end

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

Также является псевдонимом для: controller_path
new() Show source
# File actionmailer/lib/action_mailer/base.rb, line 623
def initialize
  super()
  @_mail_was_called = false
  @_message = Mail.new
end
Вызывает метод суперкласса
receive(raw_mail) Show source
# File actionmailer/lib/action_mailer/base.rb, line 567
      def receive(raw_mail)
        ActiveSupport::Deprecation.warn(<<~MESSAGE.squish)
          ActionMailer::Base.receive is deprecated and will be removed in Rails 6.1.
          Use Action Mailbox to process inbound email.
        MESSAGE

        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) Show source
# File actionmailer/lib/action_mailer/base.rb, line 510
def register_interceptor(interceptor)
  Mail.register_interceptor(observer_class_for(interceptor))
end

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

register_interceptors(*interceptors) Show source
# File actionmailer/lib/action_mailer/base.rb, line 484
def register_interceptors(*interceptors)
  interceptors.flatten.compact.each { |interceptor| register_interceptor(interceptor) }
end

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

register_observer(observer) Show source
# File actionmailer/lib/action_mailer/base.rb, line 496
def register_observer(observer)
  Mail.register_observer(observer_class_for(observer))
end

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

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

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

unregister_interceptor(interceptor) Show source
# File actionmailer/lib/action_mailer/base.rb, line 517
def unregister_interceptor(interceptor)
  Mail.unregister_interceptor(observer_class_for(interceptor))
end

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

unregister_interceptors(*interceptors) Show source
# File actionmailer/lib/action_mailer/base.rb, line 489
def unregister_interceptors(*interceptors)
  interceptors.flatten.compact.each { |interceptor| unregister_interceptor(interceptor) }
end

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

unregister_observer(observer) Show source
# File actionmailer/lib/action_mailer/base.rb, line 503
def unregister_observer(observer)
  Mail.unregister_observer(observer_class_for(observer))
end

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

unregister_observers(*observers) Show source
# File actionmailer/lib/action_mailer/base.rb, line 479
def unregister_observers(*observers)
  observers.flatten.compact.each { |observer| unregister_observer(observer) }
end

Отменяет регистрацию одного или нескольких ранее зарегистрированных наблюдателей.

Приватные методы класса

supports_path?() Show source
# File actionmailer/lib/action_mailer/base.rb, line 914
def self.supports_path? # :doc:
  false
end

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

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

attachments() Показать исходный код
# File actionmailer/lib/action_mailer/base.rb, line 732
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 694
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 841
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 и text/html частями.

Синтаксис блока также позволяет настраивать заголовки частей по желанию:

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 656
def mailer_name
  self.class.mailer_name
end

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

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

default_i18n_subject(interpolations = {}) Показать исходный код
# File actionmailer/lib/action_mailer/base.rb, line 908
def default_i18n_subject(interpolations = {}) # :doc:
  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 886
def set_content_type(m, user_content_type, class_default) # :doc:
  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, если сообщение содержит вложения. Если вложения inline, тип содержимого «multipart/related», в противном случае «multipart/mixed».

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

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

Spec-Zone.ru

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