Как написать SPF политику
Узнайте, как правильно написать/настроить SPF политику для отправки электронных писем от имени вашего домена
Каждая SPF-запись должна начинаться с v=spf1, затем последовательность механизмов (слева → направо), затем при необходимости модификаторы; проверка останавливается на первом совпадающем механизме, и итоговое действие обычно определяется механизмом all (-all, ~all, ?all).
Общая структура (порядок важен)
Каждый механизм может иметь префикс квалификатора:
- + : Pass (по умолчанию, если опущено) — принять.
- - : Fail (жёсткий отказ) — отклонить/запретить.
- ~ : SoftFail — принять, но пометить как подозрительное.
- ? : Neutral — нет политики.
Примеры: -all, ~mx, ?include:example.uz.
1. Начало: версия (обязательно)
Любая SPF-запись всегда начинается с:
Это сообщает получателям: «это SPF версия 1». Если отсутствует — запись недействительна.
2. Механизмы — строительные блоки (синтаксис, назначение, поведение DNS-запросов)
ip4:<ip4/cidr>
- Пример: ip4:203.0.113.5 или ip4:203.0.113.0/24.
- Проверяет, входит ли подключающийся IPv4 в эту сеть. Если с IP 203.0.113.5 отправляется письмо от you@example.uz — оно принимается.
- Не выполняет DNS-запросы (не учитывается в лимите 10).
Пример:
ip6:<ip6/cidr>
- То же самое, но для IPv6. DNS-запросы не делает.
Пример:
a или a:<домен>
- Пример:
aилиa:mail.example.uz(можно с CIDR). - Разрешает A/AAAA записи домена и сравнивает IP отправителя.
- Лучше указывать адрес почтового сервера, например
mail.example.uz. - Выполняет DNS-запросы (учитывается в лимите). Используйте ip4/ip6, если возможно.
Пример:
или просто a (проверяет A/AAAA записи зоны).
mx или mx:<домен>
- Пример:
mxилиmx:example.uz. - Проверяет MX записи, затем их A/AAAA. Совпадение = разрешено.
- Лучше указывать корневой домен (
example.uz). - Выполняет DNS-запросы.
include:<домен>
- Пример:
include:_spf.google.com. - Подтягивает SPF указанного домена. Если тот даёт Pass — совпадение.
- Делает DNS-запросы, может раскрыться в дополнительные (считается в лимит 10). Избегайте лишних include.
exists:<домен>
- Пример:
exists:%{i}._spf.example.uz(поддерживает макросы). - Проверяет, существует ли A запись для домена. Считается в лимит.
all
- Совпадает со всеми. Обычно в конце с квалификатором:
- -all = жёсткий отказ (всё остальное отклонить).
- ~all = мягкий отказ (принять, но пометить).
- ?all = нейтрально (нет политики).
- DNS-запросы не выполняет. Использовать осторожно.
3. Модификаторы
redirect=<домен>
- Передаёт проверку SPF другому домену, если ничего не совпало.
- Работает только после механизмов.
- Если есть
all— redirect не применяется.
exp=<домен>
- Возвращает человекочитаемое объяснение при FAIL.
- Запрос exp выполняется после проверки и не учитывается в лимите 10.
Жёсткое правило: лимит 10 DNS-запросов
SPF ограничивает механизмы/модификаторы, требующие DNS-запросов, до 10. Если больше — PermError (ошибка SPF).
Считаются: include, a, mx, ptr, exists, redirect.
Не считаются: ip4, ip6, all, exp.
Алгоритм проверки
- Сервер получает TXT для example.uz.
- Парсит SPF строку (должна быть одна).
- Проверяет механизмы слева → направо.
- Если совпало — возвращает результат (PASS/FAIL/...).
- Если нет и есть redirect → проверяет его.
- Если нет redirect → ?all (нейтрально).
- Если более 10 запросов → PermError.
Практические примеры
Запретить всё (базовый вариант)
Один сервер (IP)
Сервер использует A/MX и Google Workspace
Несколько сторонних сервисов
Тестовый режим (мягкий отказ)
Типичные ошибки
- Более 10 запросов → PermError. Решение: уменьшить include, заменить a/mx на ip4/ip6.
- Несколько SPF TXT → запись недействительна.
- +all или отсутствие all → позволяет спуфинг.
- ptr → медленно, ненадёжно. Избегайте.
- Не согласовано с DMARC → SPF может пройти, но DMARC упадёт. Всегда используйте DKIM+SPF+DMARC.
Дополнительно
- redirect= полезен для множества поддоменов.
- exp= редко используется, но может пояснить причину FAIL.
Чек-лист
- Одна TXT строка с v=spf1.
- Только реальные IP/хосты.
- Подсчитайте запросы ≤ 10.
- Начинайте с ~all, затем переходите на -all.
- Используйте DKIM + DMARC.