Рано или поздно каждая команда случайно отправляет письма настоящим клиентам: в staging попал боевой конфиг, в цикле остался реальный адрес, крон, который должен был быть отключён. Жалобы и баунсы бьют по репутации отправляющего домена, и кнопки «отменить» здесь нет.
Песочница для почты убирает этот риск: она принимает письмо по SMTP, сохраняет его и показывает в дашборде. Она никогда не пересылает и не доставляет письма и принимает любого получателя.
Что песочница делает, а что нет
- Принимает SMTP на порту из вашего инбокса, с выданными логином и паролем.
- Разбирает письмо: тему, From/To/Cc/Bcc, конверты, все заголовки, текст, HTML и вложения.
- Хранит его заданный срок и удаляет автоматически.
- Никуда не отправляет: очереди и релея нет, поэтому даже адрес реального клиента останется внутри песочницы.
Шаг 1. Создайте инбокс и сохраните креды
Зарегистрируйтесь, создайте инбокс и откройте его. Вы получите хост, порт, логин и пароль. Пароль показывается один раз — сохраните его сразу; при перегенерации старый перестанет работать.
Шаг 2. Направьте на песочницу своё приложение
Laravel (.env):
MAIL_MAILER=smtp
MAIL_HOST=sandbox-host
MAIL_PORT=2525
MAIL_USERNAME=inbox_xxxxxxxx
MAIL_PASSWORD=скопированный-пароль
MAIL_ENCRYPTION=null
Python:
import smtplib
from email.message import EmailMessage
msg = EmailMessage()
msg["Subject"] = "Привет из песочницы"
msg["From"] = "app@example.com"
msg["To"] = "anyone@example.com"
msg.set_content("Проверка тестового сценария")
with smtplib.SMTP("sandbox-host", 2525) as server:
server.login("inbox_xxxxxxxx", "скопированный-пароль")
server.send_message(msg)
Любой SMTP-клиент работает так же: Symfony Mailer, Django, nodemailer, swaks, msmtp, плагины WordPress или устройство, которое умеет только SMTP.
Шаг 3. Посмотрите результат
Отправьте письмо и откройте инбокс: оно появится сразу — с отрендеренным HTML (показывается в изолированном iframe со отключёнными скриптами), текстовой частью, всеми заголовками и вложениями. Доставки не было, поэтому один и тот же сценарий можно прогнать сотню раз.
Шаг 4. Проверьте то, что обычно ломается в продакшене
- Ссылки и картинки должны быть абсолютными. Относительные пути локально работают, а в реальном клиенте — нет.
- Ссылка на отписку и физический адрес обязательны для рассылок.
- Reply-To должен указывать на живую почту, а не на
noreply@. - Кодировка темы для кириллицы и эмодзи.
- Вложения: лимиты размера, корректные content-type, имена файлов без пробелов.
- SPF, DKIM и DMARC боевого отправителя — песочница их не проверит, но покажет точные заголовки, которые формирует ваше приложение.
Подсказка: автоматизируйте
В интеграционных тестах проверяйте перехваченное письмо, а не реальный ящик: отправьте через песочницу, затем прочитайте его обратно (у read-only ссылки есть экспорт в JSON) и проверьте тему, получателей и тело. Тест останется быстрым, детерминированным и безопасным.