Почтовые рассыльщики (мэйлеры)
Введение
Рассылки остаются недооцененными из-за их некоторой сложности. Я не особо задумывался о них ровно до тех пор, пока не стало необходимым реализовать их в моих программах. И, надо сказать, что то, что происходит за кулисами после нажатия "отправить" - впечатляет. Пересылка письма через Интернет, учитывая его архитектуру, преодоление межсетевых экранов и спам фильтров. К счастью, все это реализуется надстройками Heroku или другими программами.
Здесь мы узнаем о примерах применения этого функционала... например, можно отправить пользователю письмо "спасибо за регистрацию на сайте". Создание и отправка почты подобны рендерингу представлений и отправке их в браузер, во всяком случае, с точки зрения Rails разработчика. В этом уроке мы разберем весь процесс и вы сами начнете отправлять письма в своих проектах.
Пункты для размышления
Просмотрите вопросы и проверьте, знаете ли на них ответы. Проверьте себя снова после выполнения задания.
- Что такое мэйлер?
- Как создать его из командной строки?
- Чем они похожи на контролллеры и модели?
- Как передать переменную экземпляра из мэйлера в его представление?
- Почему необходимы обе версии (текстовая и HTML) вашего письма?
- Как отправить письмо напрямую из консоли Rails?
- Как можно воспользоваться надстройками или сторонними программами для отправки писем?
- Чем хорош гем
letter_opener
? - Почему здесь не следует использовать помощник
*_path
в представлениях? - Как можно стилизовать HTML письма, чтобы оно выглядело красивым?
Краткий обзор
Для отправки почты Rails использует гем ActionMailer
(один из 7 основных гемов Rails). Мэйлер работает подобно модели и контроллеру, объединенным в одно целое. Вы создадите новый мэйлер также, как и обычный контроллер ($ rails generate mailer SomeName
). Затем вы создадите для него методы (например, email приветствия или поздравления с успешной покупкой). Звучит как действия контроллера, верно?
В каждом методе необходимо определить ключевые поля и все необходимые переменные (например имя пользователя). Письмо само по себе - это просто представление. Оно находится в папке app/views
, в подкаталоге, названном по имени мэйлера.
Есть одно различие между "нормальным" представлением и представлением мэйлера - последнее обычно имеет два различных формата - HTML и текст. Большинство людей увидят HTML версию, но у некоторых HTML может быть отключен, и им нужна будет текстовая версия письма. Наличие двух версий также помогает пройти спам-фильтры. Вы быстро поймете, как много надо сделать в отношении письма для того, чтобы оно успешно прошло спам-фильтры.
К примеру, вы настроили представления app/views/user_mailer/welcome_email.html.erb
и app/views/user_mailer/welcome_email.text.erb
. Конечно, неудобно возиться с двумя разными версиями одного и того же письма, но это плата за комфорт пользователя и борьба с антиспамом. Также вы заметите, что здесь можно использовать препроцессор ERB (или HAML). Как и в любом другом представлении, это позволяет динамически менять содержание, подставляя например имя пользователя или какую-то другую информацию о нем. Для этого вы должны передать в представление переменные из мэйлера, подобно тому, как передаются переменные из контроллера в представление.
Настройка мэйлеров состоит из двух этапов - сначала вы создаете шаблон письма, а затем вызываете метод #deliver
(или #deliver!
) для его отправки. Отличие от контролеров здесь в том, что вы вызываете их напрямую, а не через маршрутизатор. При вызове UserMailer.welcome_email(@user)
вам возвращается сам объект. А чтобы его отправить, надо вызвать на нем метод #deliver
- это будет выглядеть так - UserMailer.welcome_email(@user).deliver
.
Так как ваши представления (и текстовое, и HTML) называются согласно методам мэйлера, Rails их найдет и отправит, используя выбранную вами надстройку для отправки почты. В справочных материалах вы найдете подробную информацию о процессе отправки почты.
Коллбэки
Мэйлеры позволяют использовать обратные вызовы также, как и обычные контроллеры, например after_action
. Они запустятся после создания тела письма, а не после отправки, так что вы можете изменить письмо при желании. Вы получаете доступ к переменным экземпляра мэйлера, так что вы можете использовать переменную @user
для своих нужд.
Надстройки для отправки почты
Вы узнаете как отправить письмо, используя свою учетную запись на Gmail, но если вы создаете серьезное приложение, то, вероятно, вам потребуется что-то посолидней. Для этого существует несколько сервисов. Все, что от них требуется - это обеспечить доставку и открытие вашего письма, для того, чтобы вы могли сосредоточиться на создании приложения. Они обычно доступны как надстройки в Heroku (например мы видели New Relic в уроке по развертыванию), так что все, что вам необходимо - это правильно их настроить.
SendGrid одна из популярных надстроек, несложная в использовании. Посмотрите документацию, включающую инструкции по настройке файла config/environment.rb
, который будет использовать ActionMailer. Вам будет необходимо использовать переменные окружения (или гем figaro
) во избежания прописывания имени пользователя и пароля напрямую в вашем коде.
Все это бесплатно, за исключением некоторых отдельных возможностей. Для тренировочных приложений нам будет достаточно бесплатных возможностей. Пример другого функционала - MailGun и PostMark, которые доступны здесь.
В наших проектах вы будете использовать и мэйлеры, и надстройки.
Гем Letter Opener
Заметим, что не следует отправлять кучу писем при тестировании приложения в режиме разработки. Это не только пример плохого стиля, но и возможность попасть в спам-лист. Но при этом вам необходимо убедиться, что функционал отправки работает исправно. К счастью, есть решение.
Гем Letter Opener, включенный в девелоперскую группу вашего Gemfile, отобразит ваши письма напрямую в браузере после их отправки. Необходимо просто включить настройки в файл config/environments/development.rb
.
Полезная информация
- Email МЕДЛЕННЫЙ! Отправка письма может занимать 1-2 секунды, поэтому не включайте массовую рассылку в основное приложение, иначе другие пользователи приложения могут испытать проблемы.
- Убедитесь, что в мэйлерах вы используете полные URL (методы-помощники
_url
, а не_path
), чтобы получатель получал корректные ссылки на внешние ресурсы. В файлеconfig/environments/production.rb
следует прописать имя вашего сервера, напримерconfig.action_mailer.default_url_options = { host: 'yourapp.com' }
. Если этого не сделать, можете получить ошибки или некорректные ссылки. - Метод
#deliver!
выдаст ошибку при проблемах с отправкой письма, а#deliver
в таком случае просто возвращает false (в фоне). - при обрамлении стилями письма в формате HTML, у вас не будет доступа к таблицам стилей, так что придется либо стилизовать вручную, либо использовать тэги
<style>
. - Вложение изображений в письма (например логотипов в HTML версию) может быть очень непростой задачей. Почитайте рекомендуемую литературу по этому вопросу.
Ваши задания
- Прочтите главы 1 и 2 об ActionMailer.
- Просмотрите главу 3, в которой говорится о приеме почты. Впоследствии, при необходимости, вы можете ее изучить более подробно.
- Прочтите главы 4 и 5 об обратных вызовах и помощниках.
- Прочтите главу 6 об отправке писем через Gmail.
- Пробегите глазами главы 7-8 о тестировании и перехвате писем.
Завершение
Отправка писем это просто немного другой способ использования тех же принципов, которые вы уже использовали для контроллеров и представлений, так что вам будет несложно в этом разобраться. Вы столкнетесь с типичным набором ошибок, возникающих при освоении данного функционала (в основном касающихся вопроса конфигурации или именования файлов), но быстро с ними разберетесь.
Дополнительные ресурсы
Этот раздел содержит полезные ссылки на дополнительные материалы. Они не обязательны, так что расценивайте их как нечто полезное, если вы хотите поглубже погрузиться в тему