Вы отправляете одно письмо на одноразовый адрес, и по нему отрабатывают 39 проверок. На этой странице они все: что каждая смотрит, сколько стоит её провал и из какого пункта стандарта она следует.
Здесь нет нашего мнения, выданного за правило. Где проверка требует того, что написано в стандарте, под ней стоит цитата из стандарта. Где требование исходит от Google или Yahoo, стоит ссылка на их страницу. Где это наше собственное суждение, так и написано.
Аутентификация
Может ли принимающий сервер доказать, что письмо пришло оттуда, откуда заявлено. Это та половина доставляемости, которая целиком живёт в DNS, и та, которую Gmail с Yahoo сделали обязательной для массовых отправителей в 2024 году.
Цепочка ARC auth.arc
ARC сохраняет результат аутентификации через пересылку. Без него список рассылки, который дописывает футер, ломает вашу подпись DKIM, и пересланная копия проваливает DMARC уже на той стороне.
Если не прошло: Отправителю делать нечего. Это важно, если вы держите список или форвардер, и этим объясняется, почему часть вашей почты проваливает DMARC после того, как её кто-то переслал.
Стоит до 2 баллов из 100 по нашей оценке.
RFC 7960 §1 — Introduction
DMARC with restrictive policies causes problems for many Mailing Lists.
RFC 8617 §2.1 — Evidence
In ARC's situation, the "evidence" is a message's authentication assessment at any point along the delivery path between origination and final delivery.
Google — Requirements for bulk senders (5,000+/day)
Подпись DKIM auth.dkim
DKIM подписывает части письма закрытым ключом, а открытый публикует в DNS. Мы проверяем каждую подпись, которую несёт письмо, и показываем подписывающий домен, селектор и длину ключа.
Если не прошло: Включите DKIM на стороне платформы отправки и опубликуйте ключ, который она выдаст. Берите 2048 бит; 1024 ещё проверяются, но доживают последние годы.
Стоит до 18 баллов из 100 по нашей оценке и до 1 из 10 по классической.
RFC 6376 §3.5 — The DKIM-Signature Header Field
The signature of the email is stored in the DKIM-Signature header field.
RFC 6376 §6.1 — Extract Signatures from the Message
Verifiers MUST NOT attribute ultimate meaning to the order of multiple DKIM-Signature header fields.
Google — Turn on DKIM for your domain
Google — Requirements for bulk senders (5,000+/day)
Выравнивание DKIM auth.dkim_alignment
Действительной подписи для DMARC мало. Подписывающий домен должен совпасть с доменом из From, точно или по организационному домену, в зависимости от политики, которую вы опубликовали.
Если не прошло: Подписывайте своим доменом, а не доменом платформы. Почти все платформы это умеют и называют его аутентифицированным или собственным доменом отправки.
Стоит до 10 баллов из 100 по нашей оценке и до 1 из 10 по классической.
RFC 7489 §3.1.1 — DKIM-Authenticated Identifiers
DMARC permits Identifier Alignment, based on the result of a DKIM authentication, to be strict or relaxed.
Google — Add a DMARC record
Google — Requirements for bulk senders (5,000+/day)
Результат DMARC auth.dmarc
DMARC связывает SPF и DKIM с доменом, который видит читатель, и говорит принимающей стороне, что делать, если ни один не выровнен. Мы показываем опубликованную политику и то, удовлетворило ли ей это письмо.
Если не прошло: Опубликуйте запись DMARC. Начните с p=none, недели три почитайте отчёты, а потом переходите на quarantine, когда станет понятно, кто ещё отправляет от вашего имени.
Стоит до 14 баллов из 100 по нашей оценке.
RFC 7489 §6.6.2 — Determine Handling Policy
DMARC evaluation can only yield a "pass" result after one of the underlying authentication mechanisms passes for an aligned identifier.
RFC 7489 §6.3 — General Record Format
DMARC records follow the extensible "tag-value" syntax for DNS-based key records defined in DKIM [DKIM].
Google — Requirements for bulk senders (5,000+/day)
Yahoo — Sender requirements and recommendations
Sender ID auth.sender_id
Та же проверка, что и SPF, но по домену из заголовка From, а не из конверта. Вопрос она задаёт другой, и вопрос этот про домен, который видит читатель. Письмо спокойно проходит SPF по конверту в ситуации, когда видимый домен не ручается ни за кого.
Если не прошло: Опубликуйте SPF для домена в вашем From, а не только для bounce-домена, который выдала платформа.
Стоит до 5 баллов из 100 по нашей оценке и до 0.5 из 10 по классической.
RFC 4406 §4 — Record Selection
After the above steps, there should be one record remaining and evaluation can proceed.
SPF auth.spf
SPF это DNS-запись со списком серверов, которым можно отправлять от вашего домена. Принимающая сторона берёт адрес из конверта, читает запись этого домена и смотрит, есть ли в ней подключившийся IP. Мы показываем результат и число DNS-запросов, которое понадобилось записи, потому что вычисление обрывается на десятом, а всё, что дальше, засчитывается как постоянная ошибка, а не как успех.
Если не прошло: Опубликуйте запись, где перечислена ваша платформа отправки и больше ничего. Если ваша близка к пределу в десять запросов, разверните ненужные include внутрь (это называют flattening): запись, которая проходит сегодня, начнёт падать, когда провайдер добавит свой собственный include.
Стоит до 18 баллов из 100 по нашей оценке и до 1 из 10 по классической.
RFC 7208 §4.6.4 — DNS Lookup Limits
SPF implementations MUST limit the total number of those terms to 10 during SPF evaluation, to avoid unreasonable load on the DNS. If this limit is exceeded, the implementation MUST return "permerror".
RFC 7208 §2.6 — Results of Evaluation
Section 4 defines check_host(), a model function definition that uses the inputs defined above and the sender's policy published in the DNS to reach a conclusion about client authorization.
Google — Define an SPF record
Google — Requirements for bulk senders (5,000+/day)
Выравнивание SPF auth.spf_alignment
Совпадает ли bounce-адрес с адресом From, который видит читатель. SPF авторизует конверт, и DMARC засчитывает эту авторизацию только тогда, когда оба адреса выровнены.
Если не прошло: Попросите платформу отправки завести bounce-поддомен внутри вашего домена. Если DKIM уже выровнен, дело не срочное, но вы остаётесь без запасного варианта на случай, когда подпись сломается по дороге.
Стоит до 5 баллов из 100 по нашей оценке и до 0.5 из 10 по классической.
RFC 7489 §3.1.2 — SPF-Authenticated Identifiers
In relaxed mode, the [SPF]-authenticated domain and RFC5322.From domain must have the same Organizational Domain. In strict mode, only an exact DNS domain match is considered to produce Identifier Alignment.
RFC 7489 §6.6.2 — Determine Handling Policy
If one or more of the Authenticated Identifiers align with the RFC5322.From domain, the message is considered to pass the DMARC mechanism check.
Google — Add a DMARC record
Google — Requirements for bulk senders (5,000+/day)
Инфраструктура и репутация
Машина и адрес, с которых ушло письмо, и что о них уже думает остальной интернет.
Имя отправителя разрешается infra.a_record
Есть ли вообще адресная запись у того имени, которым сервер представился в HELO.
Если не прошло: Опубликуйте A-запись для имени, которое объявляет ваш сервер.
Стоит до 5 баллов из 100 по нашей оценке и до 3 из 10 по классической.
RFC 5321 §5.1 — Locating the Target Host
If an empty list of MXs is returned, the address is treated as if it was associated with an implicit MX RR, with a preference of 0, pointing to that host.
Google — MX record values and troubleshooting
Блоклисты infra.dnsbl
Числится ли отправляющий IP в тех блоклистах, к которым принимающие стороны реально обращаются. Наш ростер сверяется с документированной тестовой точкой каждой зоны, а не собирается поиском по сети, потому что мёртвая зона отвечает NXDOMAIN, и это читается как «чисто».
Если не прошло: Пройдите процедуру делистинга на сайте оператора списка. Попадание в крупный список останавливает почту целиком, так что за него берутся раньше всего остального на странице.
Стоит до 25 баллов из 100 по нашей оценке и до 3 из 10 по классической.
RFC 5782 §2.1 — IP Address DNSxL
Each IPv4 address listed in the DNSxL has a corresponding DNS entry.
RFC 5782 §5 — Test and Contact Addresses
IPv4-based DNSxLs MUST contain an entry for 127.0.0.2 for testing purposes.
Google — Postmaster Tools: reputation and delivery errors
Google — Email sender guidelines
Имя в HELO infra.helo
Имя, которым отправляющий сервер представляется в начале SMTP-разговора. Оно обязано быть полным доменным именем и обязано разрешаться.
Если не прошло: Задайте почтовому серверу настоящее имя внутри вашего домена, а не идентификатор контейнера и не внутреннее имя.
Стоит до 5 баллов из 100 по нашей оценке.
RFC 5321 §4.1.1.1 — Extended HELLO (EHLO) or HELLO (HELO)
The argument clause contains the fully-qualified domain name of the SMTP client, if one is available.
Google — Email sender guidelines
Google — Requirements for bulk senders (5,000+/day)
MX-запись infra.mx
Может ли домен из вашего From принимать почту. Ответам и отбойникам без неё некуда идти, а фильтры считают дурным знаком отправляющий домен, который сам ничего не принимает.
Если не прошло: Опубликуйте MX для домена, с которого шлёте, даже если он ведёт в ящик, куда вы заглядываете раз в месяц.
Стоит до 5 баллов из 100 по нашей оценке и до 3 из 10 по классической.
RFC 5321 §5.1 — Locating the Target Host
The lookup first attempts to locate an MX record associated with the name.
Google — MX record values and troubleshooting
Обратный DNS infra.rdns
Разрешается ли отправляющий IP обратно в имя хоста и разрешается ли это имя вперёд в тот же самый IP. Смысл именно в круге. Поставить PTR, указывающий куда угодно, легко, а совпавшая пара уже свидетельствует, что адрес ваш.
Если не прошло: Попросите владельца IP выставить PTR на имя, которым вы управляете, и заведите для этого имени A-запись, указывающую обратно.
Стоит до 12 баллов из 100 по нашей оценке и до 1.5 из 10 по классической.
RFC 1912 §2.1 — Inconsistent, Missing, or Bad Data
Make sure your PTR and A records match. For every IP address, there should be a matching PTR record in the in-addr.arpa domain.
Google — Email sender guidelines
Google — Requirements for bulk senders (5,000+/day)
Шифрование транспорта infra.tls
Пришло ли письмо по TLS и с каким шифром. Всё современное договаривается о нём само, и письмо, прилетевшее открытым текстом, кое-что говорит о том, как настроена отправка.
Если не прошло: Включите STARTTLS на отправляющем сервере. Все massовые платформы это уже делают, так что провал здесь обычно означает самописный релей где-то по дороге.
Стоит до 5 баллов из 100 по нашей оценке.
RFC 3207 §2 — STARTTLS Extension
The STARTTLS extension to SMTP is laid out as follows:
Google — Require TLS for secure message transport
Google — Requirements for bulk senders (5,000+/day)
Спам-движки
Что о письме думают независимые контентные фильтры. Два движка, а не один, потому что оценка одного движка — это мнение одного движка.
ИИ-судья spam.ai_judge
Модель оценивает, как обошёлся бы с письмом современный фильтр на машинном обучении, исходя из технических находок и измерений содержимого. Тела письма она не видит, ей достаются факты.
Если не прошло: Сам по себе только детализация. Его оценка входит в общий вердикт ниже.
Показывается для детализации. В оценку не входит.
Общий вердикт spam.panel
Одно число из тех движков, что ответили, взвешенное так, чтобы самый громкий не растворялся в среднем. SpamAssassin и Postmark считаются одним голосом, поскольку у них общая база правил.
Если не прошло: Разбирайтесь с отдельными находками. Эта строка сдвинется вместе с ними.
Стоит до 25 баллов из 100 по нашей оценке.
Google — Why Gmail marks messages as spam
How this score is calculated
Postmark SpamCheck spam.postmark
Третье мнение, по умолчанию выключенное. Его эндпоинт принимает письмо целиком, а отредактировать его без потери смысла проверки нельзя, так что включение означает согласие на то, что каждое проверенное письмо копируется третьей стороне.
Если не прошло: Делать нечего. Когда он выключен, проверка так и пишет, что выключен, а это не то же самое, что «прошло».
Показывается для детализации. В оценку не входит.
Rspamd spam.rspamd
Второй, независимо написанный фильтр. Он расходится со SpamAssassin достаточно часто, чтобы его стоило спрашивать, и ради этого он здесь и стоит.
Если не прошло: Только детализация. Мнение этого движка входит в общий вердикт, а отдельной оценки не даёт.
Показывается для детализации. В оценку не входит.
SpamAssassin spam.spamassassin
Классический фильтр на правилах, до сих пор стоящий за большинством инструментов проверки почты. Каждое сработавшее правило показано со своим весом.
Если не прошло: Читайте сработавшие правила, а не сумму. Большинство из них снимается дёшево, стоит только увидеть, какие именно сработали.
Стоит до 3 из 10 по классической.
Google — Why Gmail marks messages as spam
Apache SpamAssassin — rule documentation
Содержимое
Само письмо: структура, ссылки, картинки — то, что фильтр читает перед тем, как решить.
Alt у картинок content.alt_attributes
Есть ли у изображений атрибут alt. Почтовые клиенты по умолчанию блокируют удалённые картинки, так что первые несколько секунд ваше письмо это и есть alt-текст.
Если не прошло: Пишите alt, который несёт смысл, и никогда не оставляйте без него главную иллюстрацию.
Стоит до 4 баллов из 100 по нашей оценке и до 0.5 из 10 по классической.
Google — Email sender guidelines
Живость ссылок content.broken_links
Открываются ли ссылки из письма. Мёртвая ссылка в рассылке бьёт по доверию сразу же, да и фильтры это замечают.
Если не прошло: Почините или уберите. Проверьте заодно трекинговый домен, потому что просроченный ломает все ссылки разом.
Стоит до 5 баллов из 100 по нашей оценке и до 1 из 10 по классической.
Google — Why Gmail marks messages as spam
Script и iframe content.forbidden_tags
Есть ли в HTML теги, которые ни один почтовый клиент не выполнит. В лучшем случае их вырежут, в худшем сочтут попыткой обхода.
Если не прошло: Уберите script, iframe, object и embed. Всё интерактивное живёт за ссылкой.
Стоит до 10 баллов из 100 по нашей оценке и до 1 из 10 по классической.
Google — Email sender guidelines
Баланс текста и разметки content.html_text_ratio
Сколько в письме разметки против того, сколько читаемого текста. Страница разметки, обёрнутая вокруг одного предложения, даёт форму, которую фильтры узнают.
Если не прошло: Напишите текстовую часть, которая говорит то же, что и HTML, а не заглушку.
Стоит до 3 баллов из 100 по нашей оценке и до 0.3 из 10 по классической.
RFC 2046 §5.1.4 — Alternative Subtype
Systems should recognize that the content of the various parts are interchangeable.
Google — Why Gmail marks messages as spam
Текстовая и HTML-версии content.html_version
Несёт ли письмо текстовую альтернативу рядом с HTML. Часть фильтров взвешивает её отсутствие, и любая программа чтения с экрана хочет именно её.
Если не прошло: Отправляйте multipart/alternative с настоящей текстовой версией, а не с пустой частью и не со строкой «смотрите в браузере».
Стоит до 5 баллов из 100 по нашей оценке.
RFC 2046 §5.1.4 — Alternative Subtype
The "multipart/alternative" type is syntactically identical to "multipart/mixed", but the semantics are different. In particular, each of the body parts is an "alternative" version of the same information.
Google — Email sender guidelines
Размер HTML content.html_weight
Насколько велика HTML-часть. Gmail обрезает письмо примерно после 102 КБ и прячет остаток за ссылкой, унося с собой и футер с отпиской.
Если не прошло: Почистите инлайновый CSS и повторяющиеся блоки стилей. Большинство шаблонов укладывается в треть лимита, стоит только выкинуть неиспользуемые правила.
Стоит до 3 баллов из 100 по нашей оценке и до 0.3 из 10 по классической.
Google — Email sender guidelines
Вес картинок content.images_weight
Суммарный объём изображений, которые тянет письмо. Тяжёлые картинки делают письмо медленным на телефоне, а письмо из одних картинок даёт форму, к которой фильтры относятся с подозрением.
Если не прошло: Сожмите их и убедитесь, что письмо читается с отключёнными изображениями.
Стоит до 3 баллов из 100 по нашей оценке и до 0.3 из 10 по классической.
Google — Email sender guidelines
Репутация ссылок content.malicious_links
Числится ли какая-то ссылка в фидах угроз. Одна такая ссылка блокирует письмо, сколько бы всего остального ни было настроено правильно.
Если не прошло: Уберите её. Если это ваш собственный домен, то у вас есть компрометация, с которой надо разобраться раньше, чем отправлять что-то ещё.
Стоит до 40 баллов из 100 по нашей оценке.
Google — Why Gmail marks messages as spam
Сканирование вложений content.malware
Несут ли вложения известную малварь. На развёртываниях, где сканер выключен, проверка сообщает, что не отрабатывала, а не сообщает «чисто».
Если не прошло: Если сработало, перестаньте отправлять и выясните, что происходит на машине, которая собирала письмо.
Стоит до 60 баллов из 100 по нашей оценке.
Google — Why Gmail marks messages as spam
ClamAV — how detection works
Тема письма content.subject
Длина, регистр и те шаблоны, которые фильтры считают. Мы меряем раскодированную тему, поэтому кириллическая или иероглифическая строка оценивается как текст, а не как своя кодировка.
Если не прошло: Держитесь примерно в 60 символах, уберите крик капсом и восклицательные знаки.
Стоит до 3 баллов из 100 по нашей оценке.
RFC 5322 §2.2 — Header Fields
Header fields are lines beginning with a field name, followed by a colon (":"), followed by a field body, and terminated by CRLF.
RFC 2047 §2 — Syntax of encoded-words
An 'encoded-word' is defined by the following ABNF grammar.
Google — Why Gmail marks messages as spam
Сокращённые ссылки content.url_shortener
Идут ли ссылки через публичный сокращатель. Сокращатель прячет адрес назначения, а именно этому фильтры и обучены не доверять.
Если не прошло: Ставьте ссылки на свой домен или используйте трекинговый домен платформы на поддомене вашего.
Стоит до 5 баллов из 100 по нашей оценке и до 0.5 из 10 по классической.
Google — Why Gmail marks messages as spam
Правила для массовых отправителей
Требования, которые Gmail и Yahoo публикуют для тех, кто шлёт объёмом. Применяются к рассылкам и пропускаются для писем, которые на рассылку не похожи.
Политика DMARC опубликована compliance.dmarc_present
Публикует ли домен из From запись DMARC вообще, отдельно от вопроса, прошло ли её это письмо. Gmail и Yahoo требуют её от массовых отправителей.
Если не прошло: Опубликуйте запись. Для выполнения требования хватает p=none, и она сразу даст отчёты, с которыми можно работать.
Стоит до 6 баллов из 100 по нашей оценке.
RFC 7489 §6.3 — General Record Format
p: Requested Mail Receiver policy (plain-text; REQUIRED for policy records).
Google — Requirements for bulk senders (5,000+/day)
Yahoo — Sender requirements and recommendations
List-Unsubscribe compliance.list_unsubscribe
Несёт ли письмо заголовок отписки, на который почтовый клиент может нажать. Gmail и Yahoo требуют его от массовых отправителей, и за его отсутствие фильтруют независимо от всего прочего.
Если не прошло: Добавьте заголовок "List-Unsubscribe" с HTTPS-адресом. Это умеет любая платформа отправки.
Стоит до 10 баллов из 100 по нашей оценке и до 1 из 10 по классической.
RFC 2369 §3.2 — List-Unsubscribe
The List-Unsubscribe field describes the command (preferably using mail) to directly unsubscribe the user (removing them from the list).
Google — Requirements for bulk senders (5,000+/day)
Yahoo — Sender requirements and recommendations
Отписка в один клик compliance.one_click_unsubscribe
Форма построже, где нужен HTTPS-адрес, заголовок "List-Unsubscribe-Post" и одна действительная подпись DKIM, накрывающая оба заголовка. Всё три, иначе принимающая сторона кнопку не покажет.
Если не прошло: Обычно теряется как раз подпись: платформы подписывают "List-Unsubscribe" и забывают про "List-Unsubscribe-Post". Оба имени должны стоять в теге h= одной и той же подписи.
Стоит до 8 баллов из 100 по нашей оценке.
RFC 8058 §4 — Additional Requirements
The List-Unsubscribe and List-Unsubscribe-Post headers MUST be covered by the signature and included in the "h=" tag of a valid DKIM-Signature header field.
RFC 8058 §3.1 — Mail Senders
The List-Unsubscribe header field MUST contain one HTTPS URI.
Google — Requirements for bulk senders (5,000+/day)
Yahoo — Sender requirements and recommendations
TLS для массовой почты compliance.tls_required
Пришло ли письмо зашифрованным. Закрывается инфраструктурной проверкой, когда та уже отработала.
Если не прошло: Смотрите проверку шифрования транспорта выше.
Стоит до 5 баллов из 100 по нашей оценке.
Google — Require TLS for secure message transport
Google — Requirements for bulk senders (5,000+/day)
Рекомендации
Сделать стоит, в оценку не входит. Ничто в этом разделе не может стоить баллов, и это продуктовое решение, закреплённое тестом.
BIMI advisory.bimi
Публикует ли домен запись BIMI, которая ставит логотип рядом с вашими письмами в некоторых клиентах. Ей нужна принуждающая политика DMARC и проверенный сертификат марки, который стоит денег.
Если не прошло: Стоит делать, когда DMARC уже на quarantine или reject, а объёмы оправдывают сертификат.
Рекомендация. Баллов не стоит.
BIMI — draft specification, not yet an RFC
Возраст и длина ключа DKIM advisory.dkim_key_rotation
Длина подписывающего ключа и то, сколько он уже в работе. Короткие ключи с каждым годом дешевле атаковать офлайн.
Если не прошло: Переходите на 2048 бит и меняйте по расписанию. Опубликуйте новый селектор, переключите на него подпись, потом уберите старый.
Рекомендация. Баллов не стоит.
RFC 8301 §3.2 — Key Sizes
Since short RSA keys more easily succumb to off-line attacks, Signers MUST use RSA keys of at least 1024 bits for all keys. Signers SHOULD use RSA keys of at least 2048 bits.
Google — Turn on DKIM for your domain
DNSSEC advisory.dnssec
Подписан ли домен. SPF, DKIM и DMARC живут в DNS, так что тот, кто умеет подделывать ответы DNS, подделает и все три сразу.
Если не прошло: Включите у регистратора. Обычно это один переключатель, остальное регистратор делает сам.
Рекомендация. Баллов не стоит.
RFC 4033 §2 — Definitions of Important DNSSEC Terms
Authentication Chain: An alternating sequence of DNS public key (DNSKEY) RRsets and Delegation Signer (DS) RRsets
MTA-STS advisory.mta_sts
Публикует ли домен политику, велящую чужим серверам отказываться доставлять вам незашифрованно. Защищает почту, которую шлют вам, а не ту, что шлёте вы.
Если не прошло: Опубликуйте TXT-запись и файл политики по HTTPS. Работы на полдня, а закрывается атака с понижением шифрования.
Рекомендация. Баллов не стоит.
RFC 8461 §3 — Policy Discovery
To discover if a recipient domain implements MTA-STS, a sender need only resolve a single TXT record.
Отчёты о TLS advisory.tls_rpt
Просит ли домен присылать отчёты, когда кому-то не удалось доставить ему по TLS. Идёт в паре с MTA-STS, потому что политика без отчётности не даёт понять, работает ли она.
Если не прошло: Добавьте TXT-запись с адресом, куда будут приходить ежедневные отчёты.
Рекомендация. Баллов не стоит.
RFC 8460 §3 — Reporting Policy
A domain publishes a record to its DNS indicating that it wishes to receive reports.