Сообщение об ошибке
dkim=fail reason="key not found in DNS"
Также выводится как
- dkim=neutral (no key)
Классификация зависит от проверяющей стороны (`fail` в OpenDKIM, `neutral (no key)` в mailauth — оба варианта воспроизведены), поэтому одно и то же письмо может выглядеть по-разному в заголовках вашего сервера и у крупных почтовых сервисов; в заголовках Gmail обычно стоит `dkim=neutral (no key for signature)` — формулировка работающего сервиса, которую нельзя воспроизвести в контейнере. Тайм-аут DNS вместо отсутствующей записи даёт `dkim=temperror`.
Что это означает
Письмо содержит DKIM-подпись с селектором `s=` и доменом `d=`, но TXT-записи `<selector>._domainkey.<domain>` не существует, поэтому получатель ничего не может проверить. OpenDKIM выдаёт в этом случае `dkim=fail` с этой причиной; другие проверяющие стороны классифицируют ту же ситуацию по-другому: mailauth — как `dkim=neutral (no key)`, некоторые — как `dkim=permerror`. Для DMARC ни один из этих результатов не считается успешной проверкой DKIM (pass).
Почему это происходит
Запись для селектора так и не создали
частоПисьма начали подписывать новым ключом подписи (или через нового почтового провайдера) с селектором раньше, чем добавили его TXT-запись. Почтовые сервисы (ESP), например Google Workspace, Microsoft 365 или SendGrid, начинают подписывать правильно только после того, как их записи появятся.
Запись существует под немного другим именем
частоПанели управления DNS, которые сами дописывают имя зоны, дают `s2026._domainkey.example.com.example.com`; запись, созданная в родительской зоне, когда поддомен делегирован на другие серверы, тоже не находится.
Ошибка в цели CNAME или в записи, разбитой на части
иногдаУ провайдеров, которые публикуют ключи через CNAME на собственные записи (`s1._domainkey → s1.domainkey.u123.wl.sendgrid.net`), проверка не проходит, если CNAME нет или он указывает на удалённую цель.
Ключ удалили, хотя почта ещё его использует
иногдаЕсли удалить старый селектор сразу после ротации ключей, перестают проходить проверку письма, которые ещё стоят в очередях или будут повторно проверяться позже (пересылка, ARC).
Как исправить
- 1.
Запросите точное имя записи
Составьте имя из `s=` и `d=` заголовка подписи и запросите его извне вашей сети.
bash # s= and d= from the DKIM-Signature header name the record: <s>._domainkey.<d> dig +short TXT s2026._domainkey.example.com dig +short TXT s2026._domainkey.example.com @1.1.1.1 # bypass local caches - 2.
Опубликуйте ключ и какое-то время сохраняйте старые селекторы
Публикуйте новый селектор до того, как начнёте подписывать им письма, и сохраняйте предыдущий ещё несколько дней после переключения.
text ; zone example.com - long keys are split into several quoted strings of at most 255 characters s2026._domainkey IN TXT ( "v=DKIM1; k=rsa; " "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA..." )
Связанные ошибки
dkim=fail reason="signature verification failed"OpenDKIM (Authentication-Results header added by the opendkim milter); mailauth reports the same as "bad signature"dkim=permerrorOpenDKIM (Authentication-Results); mailauth reports syntax errors as dkim=neutraldkim=fail (body hash did not verify)DKIM verifiers (Gmail, mailauth, Rspamd…)