
Почтовые серверы сломаны не потому что сломан Postfix. Чаще всего письма летят в спам или не доходят вовсе из-за неправильных DNS-записей. MX, SPF, DKIM и DMARC - четыре типа записей, которые вместе определяют, будет ли ваша почта доставлена. Разберём каждую по порядку: что за что отвечает, как выглядит реальная запись, как проверить и что будет если сделать неправильно.
Как работает доставка письма
Когда сервер mail.example.com отправляет письмо на user@gmail.com, происходит следующее:
Получающий сервер делает DNS-запрос MX для домена
gmail.comПолучает список MX-серверов с приоритетами
Подключается к MX-серверу и передаёт письмо по SMTP
MX-сервер Gmail проверяет SPF - разрешён ли IP отправителя
Проверяет DKIM-подпись в заголовке письма
Проверяет DMARC-политику домена отправителя
Принимает письмо или отправляет в спам
Если любой из этих шагов даёт ошибку, письмо либо отклоняется, либо помечается как подозрительное.
MX-запись: куда принимать почту
MX (Mail Exchanger) говорит другим серверам, куда направлять входящую почту для вашего домена.
Структура записи
example.com. IN MX 10 mail.example.com.
example.com. IN MX 20 mail2.example.com.10и20- приоритет. Сервер с меньшим числом используется первым.mail.example.com.- точка в конце обязательна при прямом указании в зонном файле BIND. В панелях управления точку обычно добавляют автоматически.MX-запись должна указывать на A-запись (hostname), а не напрямую на IP.
Пример с одним MX
Если у вас один почтовый сервер на IP 203.0.113.5:
mail.example.com. IN A 203.0.113.5
example.com. IN MX 10 mail.example.com.Проверка MX
dig MX example.com
dig MX example.com +short

Ожидаемый вывод:
10 mail.example.com.
Через веб: checnode.io → RECORDS → Фильтр MX.
Типичные ошибки MX
MX указывает на CNAME. RFC 2181 запрещает это. Некоторые серверы принимают такие письма, другие нет. Всегда указывайте на A-запись.
Нет обратной PTR-записи. Многие серверы проверяют, что PTR-запись IP совпадает с HELO-именем сервера. Попросите хостинг-провайдера выставить PTR для вашего IP.
TTL слишком высокий при смене. Перед переездом почты снизьте TTL до 300 секунд за сутки. После переезда верните к 3600.
SPF: кто имеет право отправлять
SPF (Sender Policy Framework) - это TXT-запись, которая перечисляет IP-адреса и серверы, имеющие право отправлять почту от имени вашего домена.
Синтаксис SPF
example.com. IN TXT "v=spf1 механизмы qualifier"
Механизмы:
ip4:203.0.113.5- конкретный IPv4-адресip4:203.0.113.0/24- подсетьip6:2001:db8::1- IPv6-адресmx- все серверы, указанные в MX-записях доменаa- A-запись самого доменаinclude:_spf.google.com- включить SPF другого домена (например, Google Workspace)all- все остальные серверы
Квалификаторы перед механизмами:
+- разрешить (по умолчанию, можно не писать)-- отклонить (жёсткий запрет)~- мягкий запрет (softfail, письмо принято, но помечено)?- нейтрально
Примеры реальных SPF-записей
Только свой сервер:
"v=spf1 ip4:203.0.113.5 -all"
Свой сервер плюс Google Workspace:
"v=spf1 ip4:203.0.113.5 include:_spf.google.com -all"
Если отправляете только через SendGrid:
"v=spf1 include:sendgrid.net -all"Лимит lookup-операций
SPF разрешает не более 10 DNS-запросов при проверке. Каждый include:, mx, a - это отдельный запрос. Если превысить лимит, проверка вернёт permerror и письмо может быть отклонено.
Проверить количество запросов: mxtoolbox.com → SPF Record Lookup → смотрите на "SPF Lookup Count".
Проверка SPF
dig TXT example.com | grep spf

DKIM: цифровая подпись письма
DKIM (DomainKeys Identified Mail) подписывает исходящие письма приватным ключом. Получающий сервер проверяет подпись по публичному ключу из DNS.
Как это работает
При отправке Postfix/OpenDKIM добавляет в заголовок письма подпись
DKIM-SignatureПодпись содержит хеш части заголовков и тела письма
Получающий сервер извлекает из подписи имя домена и селектор (
s=default)Делает запрос
default._domainkey.example.comи получает публичный ключПроверяет подпись. Если совпадает - письмо не было изменено в пути
Генерация ключей (OpenDKIM)
mkdir -p /etc/opendkim/keys/example.com
opendkim-genkey -D /etc/opendkim/keys/example.com/ -d example.com -s mail2026
chown -R opendkim:opendkim /etc/opendkim/
Файл публичного ключа /etc/opendkim/keys/example.com/mail2026.txt:
mail2026._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA..." )
Это содержимое копируют в DNS как TXT-запись.
DNS-запись DKIM
mail2026._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=ПУБЛИЧНЫЙ_КЛЮЧ"
Формат имени: СЕЛЕКТОР._domainkey.ДОМЕН. Селектор может быть любым словом (mail, default, 2026). Он же указывается в конфигурации OpenDKIM.
Проверка DKIM
dig TXT mail2026._domainkey.example.com
Через веб: mxtoolbox.com → DKIM Lookup → ввести домен и селектор.
Самый точный способ - отправить письмо и посмотреть заголовки. Gmail показывает результат прямо в интерфейсе: "Отправлено через: / Подписано:".
Частые проблемы DKIM
Перенос строк в DNS. Публичный ключ длинный. Некоторые DNS-панели не разбивают его на части автоматически. Разбейте на строки по 255 символов, каждую в кавычках.
Неправильный селектор в Postfix. В /etc/opendkim.conf параметр Selector должен совпадать с именем в DNS.
Ключ 512 бит. Генерируйте ключи минимум 2048 бит. 512- и 1024-битные ключи не принимаются Google и Microsoft.
DMARC: политика обработки ошибок
DMARC (Domain-based Message Authentication, Reporting and Conformance) определяет, что делать с письмами, не прошедшими SPF или DKIM. Также настраивает получение отчётов.
Структура DMARC-записи
_dmarc.example.com. IN TXT "v=DMARC1; p=none; rua=mailto:dmarc@example.com"
Параметры:
p=none- только мониторинг, письма не блокироватьp=quarantine- подозрительные письма в спамp=reject- отклонять письма, не прошедшие проверкуrua=mailto:- адрес для сводных отчётов (XML-файлы)ruf=mailto:- адрес для детальных отчётов о сбояхpct=50- применять политику к 50% писем (полезно при переходе)adkim=s- строгое выравнивание для DKIM (домен в подписи должен точно совпадать)aspf=r- мягкое выравнивание для SPF (по умолчанию)
Стратегия внедрения DMARC
Не ставьте сразу p=reject. Можно заблокировать легитимную почту.
Шаг 1 - начните с p=none, добавьте rua:
"v=DMARC1; p=none; rua=mailto:dmarc@example.com; ruf=mailto:dmarc@example.com"
Шаг 2 - две-четыре недели читайте отчёты. Инструменты для разбора: dmarcanalyzer.com, postmarkapp.com/dmarc.
Шаг 3 - перейдите на p=quarantine; pct=10, постепенно увеличивайте процент.
Шаг 4 - когда ошибок нет, переключайтесь на p=reject.
Проверка DMARC
dig TXT _dmarc.example.com

Полная проверка через mail-tester.com
Сервис mail-tester.com даёт итоговый балл от 1 до 10:
Откройте mail-tester.com - получите временный адрес
Отправьте письмо с вашего сервера на этот адрес
Нажмите "Check your score"
Сервис проверяет SPF, DKIM, DMARC, наличие в чёрных списках, содержимое письма. Балл 9–10 означает, что всё настроено правильно.
Порядок настройки с нуля
Если вы только разворачиваете почтовый сервер:
Настройте A-запись для
mail.example.comДобавьте MX-запись, указывающую на
mail.example.comПопросите провайдера добавить PTR-запись (обратная зона)
Установите и настройте OpenDKIM, сгенерируйте ключи
Добавьте DKIM TXT-запись в DNS
Добавьте SPF TXT-запись для домена
Добавьте DMARC с
p=noneдля начала мониторингаОтправьте тестовое письмо, проверьте заголовки и mail-tester.com
Через 2–4 недели ужесточьте DMARC-политику
Что произойдёт без этих записей
- Без MX: входящие письма не придут, сервер для приёма не определён.
- Без SPF: письма часто попадают в спам у крупных провайдеров. Gmail и Outlook помечают такие письма как "не прошедшие проверку".
- Без DKIM: нет доказательства, что письмо не было изменено в пути. Репутация домена ниже.
- Без DMARC: Google с февраля 2024 года требует DMARC от отправителей более 5000 писем в день. Без него массовые рассылки отклоняются Gmail полностью.
Итог
Четыре типа записей работают в паре: MX принимает почту, SPF разрешает отправителей, DKIM подписывает письма, DMARC задаёт политику и собирает отчёты. Настройка занимает 30–60 минут, зато письма перестают теряться. Начните с p=none в DMARC, читайте отчёты две недели, затем переходите к reject. Проверяйте результат через mail-tester.com после каждого изменения.