Основы ActionMailer в Ruby on Rails

Отправка электронной почты из вашего приложения Rails так же проста, как создание почтовой программы, настройка файлов вашей среды и создание некоторых представлений для форматирования текста электронной почты. Давайте рассмотрим процесс шаг за шагом.

Создание почтовой программы

Работая в Rails, вы, возможно, уже заметили следующую папку внутри вашей папки /app.

Если вы запустите rails generate mailer ExampleMailer, то rails создаст для вас файл, который выглядит следующим образом:

class ExampleMailer < ApplicationMailer
end

Кроме того, вы можете создать свой собственный файл почтовой программы — просто убедитесь, что он наследуется от ApplicationMailer. На протяжении всего этого руководства мы будем работать с почтовым приложением под названием ExampleMailer, но не стесняйтесь называть его как-нибудь подходящим для вашего приложения. Опять же, важно то, что наш почтовик наследуется от ApplicationMailer.

В этом классе поместите следующие строки кода:

class ExampleMailer < ApplicationMailer
  default from: '[email protected]'
  layout 'mailer'
end

Хранение информации о нашей учетной записи Gmail

Естественно, электронная почта выше (после default: from) — это та, которую вы хотите использовать для отправки почты. Тем не менее, откуда Rails знает, как получить доступ к нашей учетной записи g-mail? Естественно, нам нужно дать ему наш пароль. Убедитесь, что у вас установлен гем Figaro, чтобы вы могли безопасно хранить свой пароль в секретном файле yml. Figaro помогает нам сохранять безопасные переменные среды. Создайте файл yml в вашем файле конфигурации и назовите его application.yml. Внутри поместите код, подобный следующему:

gmail_username: [email protected]
gmail_password: examplepassword1

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

Настройка нашей среды

Не беспокойтесь слишком сильно о понимании всего кода здесь, если все, что вам нужно, это базовая функциональность. А пока просто скопируйте и вставьте следующий код в файлы config/environments/development.rb и/или config/environments/production.rb.

  config.action_mailer.perform_deliveries = true
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
   :address              => "smtp.gmail.com",
   :port                 => 587,
   :user_name            => ENV['gmail_username'],
   :password             => ENV['gmail_password'],
   :authentication       => "plain",
  :enable_starttls_auto => true
  }

Это настроит вашу среду для отправки электронных писем с помощью smtp из наших переменных среды gmail_username и gmail_password (которые мы объявили в нашем файле .yml).

Создание методов в нашем классе Mailer

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

def example_email(user)
    @user = user
    mail(to: @user.email, subject: "This is an example email")
  end

Это обрабатывает общий случай использования, когда вы хотите отправить электронное письмо определенному пользователю, который предположительно хранится в таблице Active Record со столбцом электронной почты. Конечно, вы можете просто передать необработанный адрес электронной почты в качестве параметра, а затем отправить письмо на него, если хотите. mail — это функция, включенная в ActionMailer, которая потенциально может принимать ряд параметров. Для получения более подробной информации о mail, в том числе о том, как копировать:, пожалуйста, обратитесь к документации здесь.

Связывание нашего метода с представлением

Частью магии Rails является его способность искать представления с соответствующими именами. Нам нужно только следовать соглашению Rails и разместить наше представление в правильном месте. В этом случае правильный вид будет в

app/views/example_mailer/example_email.html.erb

Здесь example_mailer — это имя нашего почтовика, а example_email — имя метода в нашем классе почтовика. Это похоже на создание представления для контроллера! Внутри него поместите любой контент, который вы хотите, чтобы ваше электронное письмо содержало, и отформатируйте его с помощью html. Это представление может даже получить доступ к нашей пользовательской переменной.

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

app/views/example_mailer/example_email.html.erb
app/views/example_mailer/example_email.text.erb

ActionMailer достаточно умен, чтобы предоставлять файл .html только тем провайдерам, которые могут с ним справиться. Всем остальным провайдерам он будет обслуживать наш текстовый файл.

Вывод

И теперь мы закончили! С этого момента мы можем просто вызвать

ExampleMailer.example_email(@user).deliver_now

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

Поздравляем! Теперь вы можете отправлять электронную почту с помощью Rails.