Почтовые рассыльщики (мэйлеры)

Введение

Рассылки остаются недооцененными из-за их некоторой сложности. Я не особо задумывался о них ровно до тех пор, пока не стало необходимым реализовать их в моих программах. И, надо сказать, что то, что происходит за кулисами после нажатия "отправить" - впечатляет. Пересылка письма через Интернет, учитывая его архитектуру, преодоление межсетевых экранов и спам фильтров. К счастью, все это реализуется надстройками 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. Прочтите главы 1 и 2 об ActionMailer.
  2. Просмотрите главу 3, в которой говорится о приеме почты. Впоследствии, при необходимости, вы можете ее изучить более подробно.
  3. Прочтите главы 4 и 5 об обратных вызовах и помощниках.
  4. Прочтите главу 6 об отправке писем через Gmail.
  5. Пробегите глазами главы 7-8 о тестировании и перехвате писем.

Завершение

Отправка писем это просто немного другой способ использования тех же принципов, которые вы уже использовали для контроллеров и представлений, так что вам будет несложно в этом разобраться. Вы столкнетесь с типичным набором ошибок, возникающих при освоении данного функционала (в основном касающихся вопроса конфигурации или именования файлов), но быстро с ними разберетесь.

Дополнительные ресурсы

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

Поделиться уроком: