Отладка электронной почты при помощи MailCatcher

в 18:47, , рубрики: email, php, Веб-разработка, отладка

imageВы используете в своем приложении электронную почту, не так ли? Это, в общем-то, риторический вопрос, конечно используете. Ей уже больше 30 лет, а это по прежнему самое популярное средство коммуникации на планете. Вот некоторые статистические данные от Pingdom:

  • 2,2 млрд. — Количество пользователей электронной почты по всему миру
  • 144 млрд.- Объем отправляемых электронных писем ежедневно во всем мире
  • 4,3 млрд.- Количество почтовых клиентов во всем мире

Потрясающе!

Зачем нужна эта статья?

По одной простой причине, с которой мы все так или иначе сталкиваемся. Необходимо тестировать функционал как можно ближе к реальному применению, и любая ошибка может привести к тому, что наши клиенты получат тестовые письма, и это будет печально.

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

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

Было такое? Не хочется, чтобы повторилось? Есть решение — MailCatcher. Если вы не слышали о нем то вкратце:

… Супер-простой SMTP-сервер, который перехватывает любое отправленное сообщение и выводит его в веб-интерфейсе. Запустите mailcatcher, в настройках вашего приложения укажите smtp://127.0.0.1:1025 вместо SMTP-сервера по умолчанию, и затем просматривайте почту, которая была отправлена по адресу http://127.0.0.1:1080

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

Сейчас я хочу показать вам, как настроить, запустить и использовать MailCatcher.

Подготовленная виртуальная машина

Чтобы сэкономит немного вашего времени, я создал Vagrant box с уже настроенным MailCatcher. Убедитесь, что Vagrant и VirtualBox у вас установлены и клонируйте себе репозитарий, используя следующую команду:

git clone git@github.com:sitepoint-examples/mailcatcher-article.git

Затем, перейдя в полученный каталог исполните команду:

vagrant up

Будет запущен процесс инициализации виртуальной машины. Настройки её довольно минималистичны, в комплект входит MailCatcher, Sendmail и Nginx.

Прим. пер.: если вы используете puphpet (что это) для сборки виртуальных машин, то замечу, что установка MailCatcher доступна в нем как опция, ну и куча других плюшек, рекомендую.

Установка MailCatcher вручную

Если вы желаете установить MailCatcher сами, то вот последовательность команд:

sudo apt-get install -y vim curl python-software-properties lynx nginx
sudo apt-get install -y php5-fpm php5-memcache memcached php-apc
sudo apt-get install -y build-essential libsqlite3-dev ruby1.9.3
sudo gem install mailcatcher
sudo mailcatcher --http-ip 0.0.0.0

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

Примечание. При стандартном запуске MailCatcher будет слушать только ip 127.0.0.1 и порт 1025, в этом случае мы не увидели бы его извне. Я изменил конфигурацию так, чтобы она прослушивала все ip-адреса и добавил public ip 192.168.56.111.

Веб-интерфейс MailCatcher

Теперь, перейдя по http://192.168.56.111:1080 вы можете наблюдать веб-интерфейс, выглядеть это будет вот так:
Веб-интерфейс MailCatcher
Интерфейс довольно лаконичный, в верхней его части находится список электронных писем, полученным MailCatcher. Когда в списке есть письма, то в нижней части будет выведена информация о них, что мы увидем чуть позже.

Пример использования

Для этой статьи я создал простой php-скрипт, index.php, он присутствует в репозитарии, у нас он доступен по адресу http://192.168.56.111. Для отправки писем используется библиотека SwiftMailer. Взгляните на код ниже:

<?php require_once('mail-loader.php'); ?>
<html>
<head>
    <title>Simple MailCatcher PHP Example</title>
</head>
<body>
    <h1>Simple MailCatcher PHP Example</h1>
    <p>This application sends a number of emails which will be caught by MailCatcher. To check them, view them in <a href="http://192.168.56.111:1080/" target="_blank">the local MailCatcher installation</a></p>
</body>
</html>

Он, в свою очередь подключает mail-loader.php:

<?php
require('vendor/autoload.php');
$email = 'matthew@example.com';
$subject = 'testing';
$message = 'test message';

$transport = Swift_SmtpTransport::newInstance(
    "localhost", 1025
);

$message = Swift_Message::newInstance();
$message->setTo(array(
    "matthew@maltblue.com" => "Matthew Setter",
));
$message->setSubject(
    "This email is sent using Swift Mailer"
);
$message->setBody("You're our best client ever.");
$message->setFrom("matthew@localhost", "Your bank");

$mailer = Swift_Mailer::newInstance($transport);
$mailer->send($message, $failedRecipients);
print_r($failedRecipients);

Если вы не знакомы с SwiftMailer статья Аурелио на SitePoint будет хорошим стартом в её изучении. Кстати, это его код я использовал для этого примера. Спасибо, Аурелио.

Из приведенного скрипта для нас, в принципе, важна только одна строчка кода:

$transport = Swift_SmtpTransport::newInstance(
    "localhost", 1025
);

Здесь создается соединение с smtp-сервером MailCatcher, ничего сложного. Давайте перезагрузим страницу 3 раза, чтобы отправилось 3 письма. Вот они, на изображении ниже:
image
Выбрав первую запись мы видим информацию о письме а также его тело. Если мы перейдем на вкладку Source, как на изображении ниже, то увидем заголовки письма:
image
3-я вкладка позволит нам использовать Fractal для анализа содержимого письма. Её я пропущу, т.к. это немного выходит за рамки сегодняшней статьи.

Все готово для работы

Теперь, установив MailCatcher мы можем посылать электронный письма, установив получателей, тему, добавляя вложения и т.д. Можем писать тесты, проверяющие весь процесс работы приложения, зная, что реальные пользователи не получат письма, для них не предназначенные. Это не может не радовать.

Заключение

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

Может быть вы уже используете MailCatcher? Что вы можете сказать об итогах его интеграции, были ли какие-то вопросы, которые застали вас врасплох. Буду рад, если вы поделитесь своими мыслями.

Автор: kriptomen

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js