MiniSMTP: self-hosted SMTP-relay с HTTP API в Docker

Практика · SMTP · Docker · HTTP API · deliverability

Транзакционные письма нужны почти каждому backend-проекту, но внешний почтовый сервис подходит не всегда. MiniSMTP закрывает узкую задачу: разворачивает собственный SMTP-relay на VPS и даёт приложению простой HTTP-интерфейс для отправки писем.

1 запросотправка письма по HTTP
1 командазапуск через Docker Compose
3 записиSPF, DKIM и DMARC
127.0.0.1API закрыт от прямого доступа

Коротко: 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.

  1. Backend формирует письмо

    Приложение передаёт получателя, тему и текст в обычном JSON-запросе.

  2. Nginx принимает HTTPS

    Reverse proxy завершает TLS и передаёт запрос локальному API.

  3. API проверяет токен

    Запрос без корректного Authorization: Bearer не попадает в почтовый контур.

  4. 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 и внешним email-сервисом
Задача MiniSMTP Внешний ESP
Служебные письма небольшого проекта Подходит Подходит, но может быть избыточен
Контроль инфраструктуры и данных На вашей стороне Зависит от провайдера
Маркетинговые кампании Не предназначен Подходит
Bounce, complaint и unsubscribe Нужно реализовать отдельно Обычно встроены
Резкий рост объёма Требует ручного контроля Проще масштабировать

В минимальной версии нет очереди с повторными попытками, автоматической обработки bounce/complaint и unsubscribe-комплаенса для маркетинговых сообщений. Если эти функции обязательны, их нужно добавить вокруг relay или выбрать специализированного провайдера.

Что получилось в итоге

MiniSMTP превращает сложную, но типовую инфраструктурную задачу в воспроизводимую конфигурацию. Приложение отправляет JSON по HTTPS, API проверяет токен, а почтовый стек отвечает за SMTP и DKIM. Команда при этом сохраняет контроль над сервером, доменом и данными.

Смысл решения не в том, чтобы отказаться от внешних сервисов любой ценой. Оно полезно там, где объём невелик, требования понятны, а контроль и предсказуемость важнее встроенной маркетинговой экосистемы.

Нужна интеграция без зависимости от лишних сервисов?

Я проектирую API-интеграции и внутренние сервисы под реальный процесс: с авторизацией, очередями, журналированием, безопасной публикацией и понятным сценарием эксплуатации.

Подробнее об интеграциях API →

MiniSMTP · Docker · Postfix · Dovecot · DKIM · SPF · DMARC · Nginx · Let's Encrypt · HTTP API