Я вижу две разные вещи, которые вы хотели бы проверить здесь. Тестирование сгенерированного содержимого электронной почты - это одно, и вы должны иметь возможность реорганизовать свой код, чтобы можно было выполнить модульное тестирование только этой части. Вы можете написать функцию или класс, который обрабатывает только генерацию электронной почты, а затем написать модульные тесты для разных входных данных, которые вас интересуют.
Если содержимое электронной почты является частью вашего кода, у вас должен быть какой-то тест вокруг него. Но, возможно, вам нужна более тщательная проверка, чем проверка того, что содержание электронной почты в точности соответствует «Поздравляем, {ИМЯ}, вы только что выиграли нигерийскую лотерею ...». Возможно, просто проверьте, что содержимое превышает определенный порог размера и содержит имя получателя (или какой-либо динамический контент, вставленный) где-то в теле?
Второе - тестирование машин для отправки почты. Это не совсем юнит тест; Я считаю, что это функциональный или интеграционный тест. Если у вас уже есть команда QA или процесс, который уже занимается этим типом крупномасштабного тестирования, вы, вероятно, можете смело его использовать. Если нет, то нетрудно написать небольшой SMTP-сервер-заглушку для приема входящей почты и запустить его как часть вашего функционального набора тестов. SMTP - довольно простой протокол, и вам нужно всего лишь реализовать около полудюжины команд для приема почтовых сообщений. Я написал один недавно с использованием Ruby примерно за день. Вы должны будете иметь возможность перенастроить хост и порт SMTP, которые использует ваше приложение, чтобы вы могли установить один для тестирования, а другой для производства.