сайт в бете
нашли баг? напишите
левин. записаться
весь блог

Почта на своём домене за вечер: Mailcow, письма о заявках и подтверждение подписки

Порядок работ от чистого VPS до писем клиенту: что проверить до оплаты сервера, почему Mailcow ставится после сайта и как писать письма о заявках и подтверждении подписки ещё до того, как почта поднята.

Л
Проект Левин
автор

Ставил почту на домен проекта недвижимости — сайт, база, аналитика и Mailcow на одной машине. Сам Mailcow разворачивается быстро. Вечер уходит на то, что вокруг: проверки перед покупкой сервера, DNS, порядок запуска. Ниже — как я это делал и где чуть не потерял день.

Почему почта идёт последней

Портами 80 и 443 владеет nginx сайта. Он поднимается первым, держит домен и сертификаты. Mailcow тоже хочет эти порты — для веб-панели и выпуска TLS. Поставите его раньше — будете разбирать конфликт руками в тот момент, когда сайт уже должен отвечать посетителям.

Порядок такой: сайт в Docker Compose → TLS через certbot → почта. У меня в стеке Next.js, Postgres, Redis, Umami и nginx, поверх — GitHub Actions на push в main. Почта прикручивается к готовой конструкции.

Что проверить до оплаты VPS

Эти четыре пункта решают судьбу почтового сервера. Проверять их после оплаты бессмысленно — деньги уже ушли:

  • Исходящий порт 25 открыт. Многие провайдеры закрывают его молча, из антиспам-соображений. Узнаете об этом, когда письма перестанут уходить.
  • В панели можно прописать PTR-запись (обратный DNS) на mail.вашдомен. Без обратной записи крупные почтовики режут доставку.
  • IP чист по спам-листам. Проверить на mxtoolbox.com/blacklists.aspx — Spamhaus, Barracuda, SORBS. Провайдеры переиспользуют адреса, и вам может достаться чужая история.
  • От 16 ГБ оперативной памяти. Mailcow один просит от 6, остальное съедят сайт, база и аналитика. ОС — Ubuntu 24.04 LTS.

Последний пункт я недооценивал, пока не увидел потребление в проде. Мониторинг памяти на такой машине — обязательная часть деплоя.

Письма пишутся раньше, чем появляется почта

Самое полезное решение в этой задаче принимается до Mailcow. Заявка с сайта падала только в базу — никто не знал о новом клиенте, пока не откроет кабинет. На живом сайте это прямые потери.

Я сделал общий слой отправки: письмо всегда пишется в таблицу outbox. И когда почты ещё нет, и когда она уже есть. Реальная отправка включается переменной окружения MAIL_ENABLED. До Mailcow письма просто копятся — ничего не теряется, и по таблице видно, что именно ушло бы клиенту.

Что это даёт:

  • шаблоны и тексты пишутся параллельно с настройкой сервера, без ожидания;
  • в день включения почты вы меняете одну переменную;
  • есть журнал отправок для разбора «а письмо точно ушло?»;
  • повторную отправку делать по существующей записи, без выдумывания логики заново.

Два письма, которые нужны сразу

Уведомление о заявке. Уходит на внутренний ящик в момент создания заявки. Внутри — контакт клиента, объект интереса, ссылка на карточку в кабинете. Одно письмо закрывает разрыв между «форма отправлена» и «менеджер узнал».

Подтверждение подписки. В базе у меня уже генерировался subscribers.token и никуда не использовался — подписчики лежали неподтверждёнными. Рассылать по такой базе нельзя: это прямая дорога в спам-листы, и восстанавливать репутацию домена потом долго.

Схема стандартная, double opt-in: человек оставляет адрес → получает письмо со ссылкой с токеном → переход по ссылке помечает подписку подтверждённой. Рассылка уходит только по подтверждённым. Токен разовый, с ограниченным сроком жизни.

Обе задачи — одна работа. Общий слой отправки пишется один раз, дальше добавляется шаблон.

DNS и проверка

После установки Mailcow настраиваются MX, SPF, DKIM, DMARC и автодискавери. DKIM-ключ Mailcow генерирует сам — его нужно скопировать в DNS-панель домена. PTR прописывается на стороне хостера.

Приёмка простая: письмо на mail-tester.com должно дать 10/10. Балл ниже означает, что какая-то из записей не подхватилась или не разошлась по DNS. Разбирайтесь до включения MAIL_ENABLED, иначе первые же письма клиентам уедут в спам и подпортят репутацию свежего домена.

После этого создаются ящики из списка клиента. У меня раздел «Ящики» в кабинете создаёт и удаляет их через Mailcow API — клиент заводит сотруднику почту сам, без обращения ко мне.

Чего я советую избегать

Брать VPS «на попробовать», не проверив 25-й порт и PTR. Переезжать почтой потом дороже, чем выбрать нормального провайдера сразу.

Включать отправку в тот же момент, когда закончили DNS. Дайте записям разойтись, отправьте тестовые письма на разные почтовики, посмотрите заголовки — проходит ли DKIM.

Отправлять письмо прямо из обработчика формы, минуя таблицу. Первый же таймаут SMTP превратится в ошибку на форме у клиента и потерянную заявку.

Вечер — реалистичный срок для установки и настройки. Полное доверие к домену набирается дольше: репутация растёт от объёма нормальной переписки. Начинайте с транзакционных писем, массовые рассылки подключайте позже.

теги #mailcow#почта на домене#vps#dns#docker#автоматизация
разберём вашу задачу

Автоматизация для бизнеса

Вторая сторона исследования: собираю под бизнес ИИ-агентов и автоматизации, которые работают и с клиентами, и с командой. Система остаётся у вас в работе и под вашим управлением.

подробнее и записаться цена по запросу

один разговор — и поймём, чем я могу помочь.

В эпоху ИИ человеку нужен человек. Сяду рядом и доведу до результата — встреча длится столько, сколько нужно. Без скрипта продаж и пакетов «за 999 000 ₽». Если пойму, что помочь не смогу, — скажу сразу.