Проверка SPF записи
Проверка SPF записи любого домена так, как её делают принимающие почтовые серверы: каждый include со своей стоимостью в DNS-запросах, общий счёт против предела в 10, пустые запросы и результат для любого IP отправителя вместе с термом, который его решил.
Проверяется ровно то имя, которое вы ввели: у SPF нет наследования, поэтому mail.example.com нужна своя запись.
Что такое запись SPF?
Запись SPF — это TXT-запись со списком серверов, которым разрешено отправлять почту от имени домена. Она начинается с v=spf1, затем терм за термом называет отправителей и заканчивается указанием, как получателям относиться ко всем остальным (RFC 7208, апрель 2014, до сих пор действующий стандарт).
Получатели сверяют её с адресом подключившегося сервера и доменом в конверте — MAIL FROM, или Return-Path, — а не со строкой From:, которую видит читатель. Связать SPF с From: — задача DMARC.
Запись действует только для того имени, у которого она опубликована: у SPF нет наследования, поэтому mail.example.com нужна своя запись. Домен, который не отправляет почту, должен опубликовать v=spf1 -all.
Include указывает на _spf.google.com · 8 диапазонов, дальнейших запросов нет
ip4:74.125.0.0/16ip4:209.85.128.0/17ip6:2001:4860:4864::/56ip6:2404:6800:4864::/56ip6:2607:f8b0:4864::/56ip6:2800:3f0:4864::/56ip6:2a00:1450:4864::/56ip6:2c0f:fb50:4864::/56~all
v=spf1 и первой: запись, начинающаяся иначе, не является записью SPF.redirect= передаёт проверку другой записи; exp= поясняет fail.~all. Записано через Google Public DNS 24 октября 2026 г..Как выполнить проверку SPF записи
Введите домен выше, и проверка прочитает его TXT-записи, выберет ту, что начинается с v=spf1, затем пройдёт по каждому include и redirect так, как это сделал бы принимающий сервер, считая каждый DNS-запрос.
Вручную можно запросить TXT-записи: dig TXT example.com +short или nslookup -type=TXT example.com. В ответе будут все TXT-записи по этому имени; запись SPF — та, что начинается с v=spf1, а длинная приходит несколькими строками в кавычках, которые SPF соединяет без пробела. Каждый include — это ещё один запрос, и считать их придётся самим.
Чтобы узнать, может ли конкретный сервер отправлять почту, переключитесь на Проверку IP: она выполняет ту же проверку для этого адреса и показывает сработавший терм.
dig TXT example.com +shortВсе TXT-записи по этому имени в том виде, в каком они у вашего резолвера; запись SPF — та, что начинается с v=spf1. Для каждого include запустите снова.
$ dig TXT github.com @dns1.p08.nsone.net +norec +noall +answer github.com. 300 IN TXT "v=spf1 ip4:192.30.252.0/22 include:spf.protection.outlook.com include:_netblocks.google.com include:_netblocks2.google.com include:mail.zendesk.com include:_spf.salesforce.com include:servers.mcsv.net include:mktomail.com include:sendgrid.net ip4:62.253.2" "27.114 ip4:166.78.69.169 ip4:166.78.69.170 ip4:166.78.71.131 ~all" # затем каждый include, по одному запросу: $ dig +short TXT _spf.salesforce.com "v=spf1 exists:%{i}._spf.mta.salesforce.com -all"
- Одна запись начинается с v=spf1. Соседние записи (23 другие TXT-записи: проверочные токены и подобное) для SPF не важны, кроме размера ответа.
- Строки TXT (2 строки) соединяются без пробела. Разрыв после 255 байт приходится внутрь
ip4:62.253.227.114: получатели склеивают строки обратно, так что всё в порядке. - TTL 5 минут. Сколько резолверы могут хранить эту копию после изменения. Собственный сервер зоны называет 5 минут; резолвер показывает, сколько осталось от его копии.
- Каждый include — отдельный запрос. Чтобы пройти запись github.com, нужно 10 запросов, считая вложенные. dig показывает одно имя за раз: счёт до 10 вам придётся вести самим.
$ nslookup -type=TXT github.com 8.8.8.8
# все TXT-записи по этому имени из Google Public DNS PS> Resolve-DnsName -Name github.com -Type TXT -Server 8.8.8.8
Как читать результат: дерево include
Вердикт говорит, что получат получатели для отправителя, которого нет в записи: корректную запись с её окончанием (softfail для ~all, fail для -all), либо permerror с причиной, либо «не удалось проверить», если DNS не ответил.
Тёмно-синий столбец — бюджет запросов: по одной ячейке на каждый DNS-запрос, окрашенной в цвет include, который его тратит, общий счёт против 10 и пустые запросы в виде колец. После 10-го ячейки краснеют, а ветка, на которой получатели останавливаются, помечена.
Вид «Дерево» перечисляет выводы, сначала сбои, у каждого с разделом RFC и способом исправить, а затем каждый запрос в том порядке, в каком его делает получатель.

ВердиктЧто получают получатели для отправителя, которого нет в записи, и окончание, которое это решает.Запись, терм за термомКаждый терм окрашен по виду; у include есть знак его владельца и своя стоимость в запросах.ВыводыОдна запись, корректный синтаксис, запросы, пустые запросы, окончание, ptr, DMARC: сначала сбои, у каждого своё исправление.Бюджет запросовКаждый DNS-запрос — ячейка, окрашенная в цвет include, который его тратит, против предела в 10.Стоимость каждого includeВетка на каждый include: его ячейки, что он вкладывает и общий счёт.Пустые запросыКольца для запросов, вернувшихся пустыми; третий завершает проверку.Лимит в 10 запросов и ошибка «слишком много DNS-запросов» (permerror)
Получатели считают каждый терм, которому нужен DNS-запрос, — include, a, mx, ptr, exists и redirect — во всех вложенных include и останавливаются на 10. 11-й даёт permerror (RFC 7208 §4.6.4). ip4, ip6, all и exp ничего не стоят.
Это permerror, а не fail: что с ним делать, решает сам получатель, но при DMARC permerror никогда не засчитывается как Pass. А поскольку проверка останавливается на первом совпадении, запись сверх лимита всё равно проходит для отправителей, указанных раньше, и ломается только для тех, что указаны позже.
Цена скрыта внутри include: include:_netblocks.mimecast.com сам тратит 9, Yandex 360 — 8, Freshdesk — 7, Mailgun — 5. Include Google и Microsoft 365 стоят по 1. Чтобы уложиться в 10, уберите отправителей, которыми больше не пользуетесь, и перенесите массовую рассылку на поддомен с собственной записью.
v=spf1 include:spf.protection.outlook.com include:_netblocks.mimecast.com include:mailgun.org include:sendgrid.net -all
Все остальные тоже получают permerror, а не fail от -all в записи: получатели останавливаются, не дойдя до него.
- _netblocks.mimecast.comMimecast9 запросов
- _spf.yandex.netYandex 3608 запросов
- email.freshdesk.comFreshdesk7 запросов
- mailgun.orgMailgun5 запросов
- icloud.comiCloud+5 запросов
- spf.titan.emailTitan Email4 запроса
- secureserver.netGoDaddy3 запроса
- _spf.google.comGoogle Workspace1 запрос
- spf.protection.outlook.comMicrosoft 3651 запрос
Что такое пустые запросы (void lookup)?
Пустой запрос (void lookup) — это запрос, который вернулся без записей: имени не существует (NXDOMAIN) или оно есть, но нужной записи у него нет. Получатели должны допускать два; третий — permerror (RFC 7208 §4.6.4).
Терм, указывающий на исчезнувший хост, a:old.example.com, сам по себе не ошибка: он просто не совпадает и считается одним пустым запросом. То же с exists:%{i}._spf.mta.salesforce.com для каждого отправителя, которого Salesforce не перечисляет, поэтому порядок include имеет значение.
Сбой сервера или тайм-аут — это не пустой запрос, а temperror, и получатели обычно повторяют попытку позже.
Собственная запись salesforce.com для 192.0.2.1, записано 24 октября 2026 г.
v=spf1 include:_spf.google.com include:_spf.salesforce.com exists:%{i}._spf.corp.salesforce.com ~all
exists:%{i}._spf.mta.salesforce.com192.0.2.1._spf.mta.salesforce.com → NXDOMAIN · запрос 3 · в _spf.salesforce.comexists:%{i}._spf.corp.salesforce.com192.0.2.1._spf.corp.salesforce.com → NXDOMAIN · запрос 4 · в salesforce.com
Результат: softfail, оба допустимых пустых запроса потрачены
a:mail.example.com для имени, которое всё ещё существует, но адреса у него больше нет: NOERROR без ответа. Совпадения нет, один пустой запрос, проверка продолжается.NODATAпустой запросexists:%{i}._spf.mta.salesforce.com строит имя из каждого IP отправителя; для адреса, которого Salesforce не перечисляет, ответ — NXDOMAIN: каждый раз один пустой запрос.NXDOMAINпустой запросmx:shop.example.com, имя которого исчезло, когда уже потрачено пустых запросов: 2. Получатели останавливаются здесь.NXDOMAINpermerrorinclude:_spf.vendor.example: DNS дал сбой, поэтому ничто не считается пустым запросом.SERVFAILtemperror, не пустой запросInclude include:spf.bmv.jp у blastmail начинается с двух таких термов exists: для адреса, которого в нём нет, он сам тратит оба допустимых пустых запроса.
Разворачивание SPF (flattening): когда помогает и когда ломает
Разворачивание заменяет include адресами, которые он перечисляет, так что запись стоит меньше запросов. Оно работает для диапазонов, которые редко меняются, и оборачивается против вас, когда поставщик добавляет сервер, которого вы не скопировали: почта с него тогда не проходит SPF.
Microsoft советует не разворачивать include:spf.protection.outlook.com, а include Google и Microsoft и так стоят по одному запросу. Если перенести массовую рассылку на поддомен вроде news.example.com, у неё появится собственная запись и свои 10 запросов.
До
include:mailgun.org
- Запросы
- 5
- Получено записей
- 5
- Байт в вашей записи
- 19
- Mailgun меняет диапазон
- подхватывается сразу
После
ip4:159.135.224.0/20 ip4:69.72.32.0/20 ip4:204.220.90.0/23 ip4:204.220.92.0/22 ещё 18
- Запросы
- 0
- Байт в вашей записи
- 450
- Нужно строк TXT
- 2
- Mailgun меняет диапазон
- ваша копия устарела
Риск устаревшей копии. Сегодня вы копируете диапазонов: 22 диапазона; когда Mailgun добавит ещё один, почта с него не будет проходить SPF, пока кто-нибудь не заметит и не обновит запись.
- скопировано
- Mailgun добавляет диапазон
- почта с него не проходит SPF
~all или -all (и DMARC)
Последний терм говорит, что будет с каждым отправителем, которого нет в списке. -all — это fail, самое строгое заявление; ~all — softfail, «скорее всего нет»; ?all — neutral, к которому получатели относятся так же, как к отсутствию SPF; +all пропускает всех и публиковать его нельзя никогда.
Между ~all и -all неправильного ответа нет. Google описывает ~all для Google Workspace, а Microsoft — -all для Microsoft 365. Когда DMARC работает в режиме применения, ~all оставляет решение за DMARC по DKIM: некоторые получатели отклоняют письмо по -all раньше, чем DMARC увидит действующую подпись DKIM, поэтому пересланные письма могут возвращаться (RFC 9989 §7.1).
~all-all?all?all: там это безвредно, ведь совпадает только pass внутри include.+all-all и DMARC с p=reject
- SPF даёт fail
- отклонено в SMTP
- DKIM не проверяется
Некоторые получатели сначала смотрят на SPF, поэтому пересланное письмо с действующей подписью DKIM могут отказаться принять до запуска DMARC, и потеря не видна в отчётах DMARC.
~all и DMARC с p=reject
- SPF даёт softfail
- DMARC проверяет DKIM
- DKIM совпадает: pass
Решает DMARC. Но без подписи DKIM, по словам Microsoft, DMARC для отказов по ~all фактически игнорируется, и по этой причине она рекомендует -all.
~all, и -all — допустимый выбор; ?all ничего не заявляет, а +all пропускает любого.Частые ошибки SPF и как их исправить
Большинство сломанных записей возникает из трёх промахов: вторую запись SPF добавили рядом с первой вместо объединения, остался include ушедшего поставщика и значение скопировано из документации с опечаткой.
Некоторые из них печатают сами поставщики: Mimecast пишет –all с en dash, Postmark — include: spf.mtasv.net с пробелом, Twilio SendGrid указывает механизм aaaa, которого не существует. Любая синтаксическая ошибка делает permerror всю запись. А вот точка после домена в конце допустима.
Две записи SPFpermerror
v=spf1 include:_spf.google.com ~allv=spf1 include:sendgrid.net ~allИсправление: объедините в одну: один v=spf1, каждый include по разу, одно окончание.
Больше 10 запросовpermerror
v=spf1 include:_netblocks.mimecast.com include:mailgun.org -all14 запросов
Исправление: уберите отправителей, которыми больше не пользуетесь, или отдайте массовому отправителю собственный поддомен.
Третий пустой запросpermerror
v=spf1 a:old.example.com mx:gone.example.net exists:%{i}.spf.example.org -all3 пустых запроса
Исправление: удалите термы, имена которых исчезли, и ставьте include с exists последними.
Include, за которым нет записи SPFpermerror
v=spf1 include:spf.retired-vendor.example -allИсправление: исправьте имя или уберите поставщика, от которого вы ушли.
En dash в –allpermerror
v=spf1 include:_netblocks.mimecast.com –allТак напечатано в собственной документации Mimecast
Исправление: обычный дефис: -all.
Пробел после include:permerror
v=spf1 a mx include: spf.mtasv.net ~allТак напечатано в собственной документации Postmark
Исправление: include:spf.mtasv.net
Механизм aaaapermerror
v=spf1 aaaa:example.com ~allТак напечатано в собственной документации Twilio SendGrid
Исправление: a:example.com; a уже совпадает с записями AAAA отправителей по IPv6.
Точка в концекорректно
v=spf1 include:spf.protection.outlook.com. -allКорректно: RFC 7208 §7.3 советует её не публиковать, но получатели обязаны её принимать.
В справке Zendesk сказано также «redirect: syntax is supported»: модификатор пишется redirect= (RFC 7208 §6.1).
Что требуют Gmail, Yahoo и Microsoft
С февраля 2024 года Gmail и Yahoo требуют от каждого отправителя настроить SPF или DKIM. Массовым отправителям нужны оба, запись DMARC минимум с p=none и домен From:, совпадающий с одним из них. Outlook.com требует от отправителей с большим объёмом и SPF, и DKIM и с 5 мая 2025 года отклоняет письма тех, у кого их нет.
Порог Gmail — больше 5000 писем в день на личные адреса; Yahoo его не публикует. Один только SPF никогда не даёт «совпадения по домену»: домен MAIL FROM должен быть вашим, а не доменом возвратов поставщика.
| Gmail | Yahoo | Outlook.com | |
|---|---|---|---|
| Порог для массовых | Gmailбольше 5 000 писем в день на личные адреса Gmail, по основному домену | Yahooне опубликован: «Мы не будем указывать порог по объёму» | Outlook.comбольше 5 000 в день (блог Microsoft); 5 000 и больше с одного домена From: (статья поддержки) |
| Все отправители | GmailSPF или DKIM, плюс прямой и обратный DNS, TLS и доля спама ниже 0,3 % | YahooSPF или DKIM, плюс прямой и обратный DNS и доля спама ниже 0,3 % | Outlook.comжёсткого правила нет |
| Массовые отправители | GmailSPF и DKIM, DMARC (достаточно p=none), From: совпадает с SPF или DKIM, отписка в один клик для рекламных писем | YahooSPF и DKIM, DMARC минимум p=none и проходящий, From: совпадает с SPF или DKIM, отписка в один клик | Outlook.comSPF должен пройти и DKIM должен пройти, DMARC минимум p=none, совпадение с SPF или DKIM |
| Действует с | Gmail1 февраля 2024 г.; отклонение писем усилено с ноябрь 2025 г. | Yahooфевраль 2024 г. | Outlook.com5 мая 2025 г. (отклонение) |
| Отказ по SPF выглядит так | Gmail4.7.275.7.27 | Yahooдля SPF не описан | Outlook.com550 5.7.515 |
Япония: самая строгая настройка NTT docomo, 「全て拒否する」, отказывает в приёме почте, IP отправителя которой не разрешён записью SPF домена, и почте от доменов, у которых записи SPF нет вовсе. docomo.ne.jp
Источникиsupport.google.comsenders.yahooinc.comtechcommunity.microsoft.com
Проверка SPF и dig с nslookup
dig и nslookup показывают TXT-записи в том виде, в каком они у вашего резолвера: запись SPF и всё остальное, что лежит по этому имени. Они не проходят по include, не считают запросы и пустые запросы и не говорят, что решил бы получатель.
Проверка SPF, как эта, проходит всю запись, поэтому цифры совпадают с тем, что считает принимающий сервер. Используйте dig для одного имени, а эту проверку — для вердикта.
dig TXT | nslookup -type=TXT | ||
|---|---|---|---|
| Показывает TXT-записи | Эта проверкаДаразбитые на термы | dig TXTДа | nslookup -type=TXTДа |
| Соединяет строки длинной записи | Эта проверкаДакак получатели | dig TXTНетпоказывает каждую строку отдельно | nslookup -type=TXTНетпоказывает каждую строку отдельно |
| Проходит по каждому include | Эта проверкаДавсё дерево | dig TXTНетодно имя на запрос | nslookup -type=TXTНетодно имя на запрос |
| Считает запросы до 10 | Эта проверкаДаобщий счёт по каждому include | dig TXTНетвручную | nslookup -type=TXTНетвручную |
| Считает пустые запросы | Эта проверкаДас именами | dig TXTНет | nslookup -type=TXTНет |
| Говорит, что две записи = permerror | Эта проверкаДа | dig TXTНетвыводит обе | nslookup -type=TXTНетвыводит обе |
| Проверяет IP отправителя | Эта проверкаДаcheck_host и сработавший терм | dig TXTНет | nslookup -type=TXTНет |
| Спрашивает ваш резолвер | Эта проверкаНетGoogle Public DNS, с нашего сервера | dig TXTДа | nslookup -type=TXTДа |
Проверка SPF: частые вопросы
Что такое проверка SPF записи?
Как проверить, разрешено ли IP-адресу отправлять почту от имени моего домена?
Что значит «SPF: слишком много DNS-запросов»?
Что такое permerror в SPF?
Что такое пустой запрос (void lookup) в SPF?
Чем должна заканчиваться запись SPF: ~all или -all?
Может ли у домена быть две записи SPF?
Что такое разворачивание SPF (flattening) и нужно ли оно?
Нужна ли поддомену своя запись SPF?
Почему SPF проходит здесь, но не проходит в Gmail?
Чем отличаются SPF, DKIM и DMARC?
Сколько времени изменение записи SPF вступает в силу?
Другие инструменты для почты и DNS
MX Поиск
Поиск записей mail exchange и данных почтового сервера
Проверка DMARC
Проверка политики DMARC и настроек выравнивания для любого домена
Проверка DKIM
Проверка записей DKIM с автоматическим определением селектора
Анализ заголовков Email
Разбор необработанных заголовков email и отслеживание пути письма
Проверка IP в чёрных списках
Проверка IP адреса в списках спама и вредоносного ПО
Обратный DNS
Поиск имён хостов по IP адресу через записи PTR
Проверка DNS
Все DNS-записи прямо с серверов имён домена рядом с кешем Google и Cloudflare
Генератор SPF-записи
Создание корректной TXT-записи SPF для ваших почтовых сервисов и серверов с проверкой лимита в 10 DNS-запросов в реальном времени
