Рано или поздно каждая команда случайно отправляет письма настоящим клиентам: в 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) и проверьте тему, получателей и тело. Тест останется быстрым, детерминированным и безопасным.

Что дальше