Тестирование Email с Mailcatcher и MailTrap

В соседней теме было упомянуто как тестировать email, если вы работаете с python. Если Python не ваш родной язык, если вы вообще не хотите писать свой #smtp сервер, а смотрите в сторону готовых решений, то самые лучшие из известны мне это Mailcatcher и MailTrap. Оба являются эмуляторами #smtp сервера + веб интерфейс к нему. Отличия в том, что Mailcatcher устанавливается локально, а mailtrap работает как сервис. Как следствие - mailtrap проще для старта, а mailcatcher лучше для стабильности тестов.

А ещё оба сервиса предоставляют #rest #api для доступа к текущим имейлам. С помощью него можно автоматизировать тестирование имейлов. Например, можно в селениум тесте проверить форму восстановления пароля и тут же посмотреть был ли отправлен имейл на нужный адрес. Затем взять из имейла новый пароль и попробовать с ним войти на сайт. Круто, не правда ли?

Итак, я опишу как работает Mailcatcher через #rest и приведу простую реализацию для работы с ним на #php :


GET: http://127.0.0.1:1080/messages получить список всех имейлов в json формате. Мы получаем id и subject.
GET: http://127.0.0.1:1080/messages/1.json получить дательную информацию о сообщении с id=1. В том числе sender и recipients (массив)
GET: http://127.0.0.1:1080/messages/1.html получить html часть сообщения (если есть)
GET: http://127.0.0.1:1080/messages/1.plain получить текстовую часть сообщения (если есть)
DELETE: http://127.0.0.1:1080/messages очистить имейлы. Самая важная и недокументиированая команда.


Для #phpunit я написал класс EmailTestCase, который расширяет стандартный, и использует библиотеку Guzzle для выполнения #rest запросов.

С Guzzle запросы к mailcatcher будут выглядеть так:

<?php
$this->mailcatcher = new \Guzzle\Http\Client('http://127.0.0.1:1080');
$this->mailcatcher->get('/messages')->send();
$this->mailcatcher->get("/messages/{$email->id}.html")->send();
$this->mailcatcher->delete('/messages')->send();
?>

Аналогичным образом можете реализовать взаимодействие своих тестов с mailcatcher с помощью любого другого #rest клиента в любом другом языке программирования.

8 лайков

Отличная тулза. Жалко не было этой статьи несколько месяцев назад. Изобрели свой велосипед. Правда наш api поддерживает так же поиск писем, чего не вижу в кэтчере.

Хорошая штука. Залил Java REST client под нее в местный GitHub. Детальное описание в блоге.

1 лайк

Похожий инструмент на вышеупомянутые – emailvoid.com. mailtrap, с недавних пор просит плату за использование. emailvoid пока бесплатный.

если мейл приходит всегда по разному ? один раз через 10 сек, один раз многвенно что делать ?

Такое обычно решается просто:

  1. задаете таймаут на ожидание письма (скажем 15 секунд)
  2. повторяете попытки найти письмо через API до тех пор пока таймаут не сработал или письмо было найдено.

Если кому интересно, могу выложить мою реализацию ruby mail клиента который работает с gmail и mailcatcher и успешно используется на большом проекте.

Конечно выкладывайте → GitHub.

да я так и делаю через кастомний вейтер, но gmail если ти его пингуешь поллингом с интервалом секуюрити включает вот например после 5 попитки где то, а иногда у меня письмо приходит через минути 2 (((

Код показывайте. Тыкаюсь в инбокс по IMAP с дефолтовым pollingEvery в FluentWait (500ms): никаких проблем - может и часами ждать

1 лайк

а какой мейл сервис ? тоже gmail ?

я по smtp делаю

[quote=“Taras, post:11, topic:3870, full:true”]
тоже gmail ?
[/quote]Ну да - в противном случае я бы не вам не отвечал.

[quote=“Taras, post:12, topic:3870, full:true”]
я по smtp делаю
[/quote]Попробуйте по имап - без реконнекта - просто рефрешить инбокс.

Подойдет ли данная тулза для тестирования продакшена? То есть, я не могу задать пропертей, чтобы все письма шли на smtp://localhost:1025. У меня есть набор тестов, которые каждую ночь прогоняются на проде и было бы здорово заюзать что-то подобное, например, для теста регистрации с верификацией почты(сейчас пользуюсь временной почтой).

Для тестирования продакшена вам Mailcatcher не нужен. Потому как на продакшене у вас реальный SMTP сервер, который шлет реальные письмо. Вам нужно например на Gmail завести тестовый аккаунт и использовать его тестов которые рассылают письма (your-test-account+[unique-id]@gmail.com). Во время теста через Gmail IMAP API проверять почту и вытягивать нужное письмо с сервера (обычно для этого есть уже готовые решения, нужно поискать только).

Используйте циклы с задержкой:

message *m = null;
for ( int i = 0; i < 10; i++ ) {
    int result = checkMailBox();
    if (result) {
         m = receiveMessage();
         break;
    }
    Thread.sleep( 10 ); // TODO - prepare thius ...
}

if (m == null) {
   raise new Exception("No message receive");
}

// TODO implement working with `m` ...

Есть еще одно решение http://www.mesghub.com/. Мы создавали его для внутренних нужда, и пока не сделали платными, но честно говоря планируем, так как нужно отбить хотя бы стоимость хостинга (я думаю, что это будет что-то символическое вроде $10 в год), а так же думаем над личным кабинетом с различными полезными удобными инструментами мониторинга.

1 лайк