Вы используете электронную почту в своих приложениях, верно? Хорошо, это риторический вопрос. Конечно, вы делаете. Несмотря на то, что электронной почте уже более 30 лет, она по-прежнему остается самым популярным приложением на планете. Вот некоторые статистические данные из Pingdom за 2012 год:
- 2,2 миллиарда — количество пользователей электронной почты по всему миру
- 144 миллиарда — общий почтовый трафик в день по всему миру
- 4,3 миллиарда — количество почтовых клиентов по всему миру в 2012 году
Шатаясь!
Но почему еще одна статья по электронной почте?
По одной простой причине, которую мы, вероятно, все поймали в тот или иной момент. Потому что нам нужно тестировать, как можно ближе к производству, но без случайного отправления электронных писем нашим клиентам, и, следовательно, они запутываются, расстраиваются или смущаются тем, что их клиенты получили тестовые электронные письма.
Я уверен, что вы понимаете, о чем я. Вы думаете, что установили ваше приложение в какой-то режим отладки. Учитывая это, вы запускаете тест, который отправляет множество писем из вашего приложения. Все это время вы чувствуете себя комфортно, зная, что никто, кроме вас, никогда не увидит их.
Ваши тесты проходят, вы поздравляете себя и идете дальше. Некоторое время спустя вы получаете довольно, скажем так, краткий звонок по Skype от вашего клиента. Она довольно раздражена, когда ее клиенты звонят, спрашивая, почему они получают странные электронные письма от ее компании. Она не счастлива и хочет получить ответы?
Был там? Не хочешь быть там снова? Я предполагаю, что нет. Вот решение — MailCatcher . Если вы не знакомы с этим, MailCatcher
… Работает очень простой SMTP-сервер, который перехватывает любое отправленное ему сообщение для отображения в веб-интерфейсе. Запустите mailcatcher, установите ваше любимое приложение для доставки по адресу smtp: //127.0.0.1: 1025 вместо SMTP-сервера по умолчанию, а затем проверьте http://127.0.0.1:1080, чтобы увидеть почту, которая уже получена.
Звучит как хорошее решение? Независимо от того, устали ли вы, находитесь под давлением, новички в команде или просто хотите запускать тесты — MailCatcher гарантирует, что электронное письмо никогда не будет отправлено за пределы вашей сети или даже за пределы вашей виртуальной машины разработки.
В этом посте я собираюсь показать вам, как его настроить и запустить через интерфейс, когда он перехватывает электронные письма.
Предварительно подготовленная виртуальная машина
Чтобы избавить вас от хлопот по настройке MailCatcher, я создал пользовательский ящик Vagrant, который сделает все за вас. Убедитесь, что у вас установлены VirtualBox и Vagrant, а затем клонируйте копию репозитория статьи, используя следующую команду:
git clone [email protected]:sitepoint-examples/mailcatcher-article.git
Затем в каталоге клонированного проекта выполните следующую команду:
vagrant up
Это запустит процесс инициализации виртуальной машины, отображая довольно много выходных данных при запуске процесса инициализации. Настроенная виртуальная машина довольно минималистична. На нем установлены MailCatcher , Sendmail и Nginx .
Nginx имеет простую настройку VHost, которая отображает каталог проекта в /var/www/
Если вы хотите точно знать, что происходит во время инициализации, просмотрите файл provision.sh
Установка MailCatcher вручную
Если вы хотите установить MailCatcher самостоятельно и у вас есть виртуальная машина (или машина с Linux), выполните следующие действия:
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
Вы можете или не можете запустить третью команду. Я сделал так, как использую очень минималистичный образ Ubuntu Precise 64 Vagrant, для которого нужны пакеты для сборки MailCatcher. Помните, что если вы используете другой дистрибутив или версию Linux, имена отдельных пакетов могут отличаться.
Примечание: если вы будете следовать стандартному процессу запуска MailCatcher, он будет прослушивать только IP 127.0.0.1
1025
С этой настройкой мы не могли видеть это с хост-машины. Поэтому я добавил общедоступный IP-адрес на виртуальной машине 192.168.56.111
Веб-интерфейс MailCatcher
Теперь вы сможете увидеть веб-интерфейс MailCatcher по адресу http://192.168.56.111:1080
Это будет выглядеть как на картинке ниже:
Это довольно простой интерфейс, перечисляющий электронные письма в очереди MailCatcher, если они доступны, вверху. Когда в списке есть электронные письма, нижняя панель хорошо показывает информацию о них, которую мы увидим позже.
Образец кода
Для этой статьи я создал простой PHP-скрипт index.php
http://192.168.56.111
Он использует SwiftMailer для подключения к MailCatcher и отправки электронной почты при загрузке. Вы можете увидеть в коде ниже довольно стандартную страницу HTML.
<?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 = '[email protected]';
$subject = 'testing';
$message = 'test message';
$transport = Swift_SmtpTransport::newInstance(
"localhost", 1025
);
$message = Swift_Message::newInstance();
$message->setTo(array(
"[email protected]" => "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 Aurelio здесь, на SitePoint, это отличное введение. Кстати, это его код, который я использовал для этого примера. Спасибо Аурелио.
По сути, для нас важно отметить только одну строчку:
$transport = Swift_SmtpTransport::newInstance(
"localhost", 1025
);
Это создает соединение с сервером MailCatcher, который мы только что настроили. Ничего особенного! Я теперь перезагрузил страницу три раза, которая отправила три электронных письма. Вы можете видеть, что они перечислены в MailCatcher на изображении ниже.
Я нажал на первую запись, которая показывает полученные, от, до и детали темы, а также тело письма. Если мы перейдем на вкладку «Источник», как показано на рисунке ниже, мы увидим необработанные данные электронной почты:
Через третью вкладку мы можем использовать Fractal для анализа содержимого нашей электронной почты. Я пропущу это сегодня, поскольку это выходит за рамки этой статьи.
Мы все готово
Сделав это, мы можем теперь создавать электронные письма, как это было бы иначе, устанавливая получателей, темы, вложения и так далее, как я описал выше, и знать, что они никогда не пойдут на реальные адреса.
Мы можем написать тесты, чтобы убедиться, что код работает как надо. Мы можем проверить рабочий процесс отправки почты, проверить содержимое сообщения, получателей, заголовки и так далее. Это настолько практично, насколько это возможно, без фактической отправки чего-либо за пределы нашей среды.
Теперь мы можем быть уверены, что наши клиенты (и их клиенты) никогда не получат электронных писем, которые никогда не предназначались для них. Какое облегчение.
Завершение
Теперь, это довольно тривиальный пример, использующий только простой фрагмент кода SwiftMailer для примера. Я уверен, что ваши кодовые базы намного сложнее и сложнее, чем этот пример.
Но я уверен, что в ваших приложениях вам будут доступны конфигурации для отладки и тестирования, где вы сможете соответственно настроить хост и порт, отличая их от живых. Таким образом, никакой другой код никогда не потребуется изменять, и вы можете воспользоваться преимуществами душевного спокойствия, которые дает MailCatcher.
Вы уже используете MailCatcher? Какой у вас опыт интеграции? Были ли какие-то проблемы, которые застали вас врасплох? Поделитесь своими мыслями в комментариях.