Основы 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.