MiniSMTP: self-hosted SMTP-relay с HTTP API в Docker
Практика · SMTP · Docker · HTTP API · deliverability
Транзакционные письма нужны почти каждому backend-проекту, но внешний почтовый сервис подходит не всегда. MiniSMTP закрывает узкую задачу: разворачивает собственный SMTP-relay на VPS и даёт приложению простой HTTP-интерфейс для отправки писем.
Коротко: MiniSMTP — не платформа для маркетинговых рассылок и не попытка заново написать почтовый сервер. Это компактная прослойка между приложением и проверенным почтовым стеком: понятный HTTP-контракт снаружи, SMTP и настройки доставляемости внутри.
Какую проблему решает MiniSMTP
Подтверждение регистрации, восстановление пароля, счёт, чек или системное уведомление обычно отправляют через SendGrid, Mailgun, Postmark, Amazon SES и похожие сервисы. Для большого продукта это удобный путь, но у небольших и закрытых систем появляются дополнительные ограничения.
Цена и зависимость
Бесплатный лимит заканчивается, стоимость меняется вместе с объёмом, а код и эксплуатационные процессы начинают зависеть от правил конкретного провайдера.
Передача данных наружу
Адреса получателей и содержимое писем проходят через стороннюю инфраструктуру. Для внутренних, юридических, медицинских и финансовых систем это может быть неприемлемо.
Лишняя сложность
Маркетинговая аналитика, визуальные редакторы и управление кампаниями не нужны, если проект отправляет только несколько типов служебных писем.
Сложный self-hosting
Собственный Postfix — это не только установка пакета. Нужны DKIM, SPF, DMARC, PTR, TLS, контроль доступа и диагностика попадания в спам.
MiniSMTP занимает место между этими вариантами: сохраняет контроль self-hosted-решения, но прячет рутинную SMTP-интеграцию за небольшим API.
Что находится внутри
Основой служит docker-mailserver — готовый стек Postfix, Dovecot и DKIM. MiniSMTP добавляет конфигурацию Docker Compose, HTTP API с Bearer-токеном и практический сценарий публикации через Nginx и Let's Encrypt.
-
Backend формирует письмо
Приложение передаёт получателя, тему и текст в обычном JSON-запросе.
-
Nginx принимает HTTPS
Reverse proxy завершает TLS и передаёт запрос локальному API.
-
API проверяет токен
Запрос без корректного
Authorization: Bearerне попадает в почтовый контур. -
SMTP-relay отправляет письмо
Postfix доставляет сообщение, используя доменные настройки и DKIM-подпись.
Для вызывающего приложения весь маршрут выглядит как один стабильный HTTP-контракт. Ему не нужен SDK почтового провайдера и не приходится хранить SMTP-логику в каждом проекте.
Отправка письма одним запросом
curl -X POST https://mail.example.com/send \
-H "Authorization: Bearer API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"to": "client@example.net",
"subject": "Подтверждение регистрации",
"text": "Спасибо! Ваш аккаунт создан."
}'
Такой интерфейс одинаково просто вызвать из Laravel, Symfony, Node.js, Python, Go или небольшого shell-скрипта. При смене языка приложения почтовая инфраструктура остаётся прежней.
Развёртывание — это только половина задачи
Работающий контейнер ещё не означает, что письма будут попадать во «Входящие». Поэтому документация MiniSMTP охватывает не только docker compose up, но и базовую доставляемость.
DNS и подпись
Нужно сгенерировать DKIM-ключ, опубликовать SPF и DMARC, а также проверить PTR/rDNS для IP-адреса сервера.
Постепенное включение DMARC
Политику разумно переводить от наблюдения p=none к более строгому quarantine после проверки реального трафика.
HTTPS и закрытый API
Сам API слушает 127.0.0.1. Во внешний интернет выходит только Nginx с TLS-сертификатом Let's Encrypt.
Проверка результата
После настройки домена доставляемость проверяется тестовым письмом, заголовками сообщения и сервисом mail-tester.com.
Главная сложность собственного SMTP — не отправить письмо, а доказать принимающим серверам, что отправителю можно доверять.
Безопасная схема публикации
HTTP API не должен быть доступен напрямую из интернета: иначе токен и endpoint становятся единственным барьером для злоупотреблений. Базовая схема оставляет сервис на loopback-интерфейсе и публикует только reverse proxy.
Интернет
│ HTTPS :443
▼
Nginx + Let's Encrypt
│ localhost
▼
MiniSMTP API : внутренний порт
│ SMTP
▼
docker-mailserver → сервер получателя
- длинный случайный API-токен хранится в секретах приложения, а не в репозитории;
- наружу открываются только действительно необходимые порты;
- логи и лимиты запросов контролируются на уровне Nginx и приложения;
- доступ к VPS, DNS и резервным копиям рассматривается как часть почтовой безопасности.
Кому подходит такой relay
Небольшим SaaS и внутренним сервисам
Когда писем немного, набор шаблонов ограничен, а отдельная маркетинговая платформа не нужна.
Проектам с требованиями к приватности
Когда адреса и содержание сообщений должны оставаться в контролируемой инфраструктуре.
Агентствам и разработчикам
Когда для нескольких приложений нужен единый способ отправки без разных SDK, аккаунтов и тарифов.
Тем, кто осваивает эксплуатацию почты
Репозиторий связывает настройки DKIM, SPF, DMARC, PTR и TLS с работающим контейнерным окружением.
Где проходит граница решения
MiniSMTP рассчитан на транзакционную почту умеренного объёма. Он не заменяет полноценный ESP, если бизнесу нужны массовые рассылки, визуальный редактор, сегментация, статистика кампаний и автоматическое управление репутацией.
| Задача | MiniSMTP | Внешний ESP |
|---|---|---|
| Служебные письма небольшого проекта | Подходит | Подходит, но может быть избыточен |
| Контроль инфраструктуры и данных | На вашей стороне | Зависит от провайдера |
| Маркетинговые кампании | Не предназначен | Подходит |
| Bounce, complaint и unsubscribe | Нужно реализовать отдельно | Обычно встроены |
| Резкий рост объёма | Требует ручного контроля | Проще масштабировать |
В минимальной версии нет очереди с повторными попытками, автоматической обработки bounce/complaint и unsubscribe-комплаенса для маркетинговых сообщений. Если эти функции обязательны, их нужно добавить вокруг relay или выбрать специализированного провайдера.
Что получилось в итоге
MiniSMTP превращает сложную, но типовую инфраструктурную задачу в воспроизводимую конфигурацию. Приложение отправляет JSON по HTTPS, API проверяет токен, а почтовый стек отвечает за SMTP и DKIM. Команда при этом сохраняет контроль над сервером, доменом и данными.
Смысл решения не в том, чтобы отказаться от внешних сервисов любой ценой. Оно полезно там, где объём невелик, требования понятны, а контроль и предсказуемость важнее встроенной маркетинговой экосистемы.
Нужна интеграция без зависимости от лишних сервисов?
Я проектирую API-интеграции и внутренние сервисы под реальный процесс: с авторизацией, очередями, журналированием, безопасной публикацией и понятным сценарием эксплуатации.
MiniSMTP · Docker · Postfix · Dovecot · DKIM · SPF · DMARC · Nginx · Let's Encrypt · HTTP API
