Нещодавно до мене звернувся один користувач з проблемою SPF. Його поштовий сервер видава помилку на прийом пошти від одного домену baddomain.com:
Not authorized by SPF
При цьому, клієнт каже, що якщо перевірити цей baddomain.com на https://mxtoolbox.com, то там немає жодної помилки.
В першу чергу я подивився самі записи SPF через команду dig:
$ dig -t txt baddomain.com +short
"v=spf1 ip4:XXX ip4:YYY include:_spf.google.com include:spf2.esputnik.com -all"
...
"spf2.0/mfrom,pra include:senderid.unisender.com -all"
і перше, що кидається в очі, це різні значення SPF1 і SPF2 і саме SPF2 не дає прийняти листав від baddomain.com. Подивимося, чому так.
Його поштовий сервер мав конфігурацію exim+spfd. man spfd дає вичерпну відповідь, чому так:
versions
A comma-separated list of SPF version numbers of SPF records that may be used. 1 means that “v=spf1” records should be used. 2 means that “spf2.0” records should be used. Defaults to 1,2, i.e., uses any SPF records that are available. Records of a higher version are preferred.
Сам spfd був запущений без versions, тому, логічно, вибирається SPF2, який власне і не дозволяє прийняти пошту.
Як бонус, спробуємо подивитися, як проходить перевірка зі сторони exim:
$ echo -e "identity=gooduser@baddomain.com\nip_address=XX.XX.XX.XX\n" | nc -U /tmp/spfd.sock
result=fail
local_explanation=baddomain.com: Sender is not authorized by default to use 'gooduser@baddomain.com' in 'mfrom' identity (mechanism '-all' matched)
authority_explanation=Rejected by SPF record
received_spf_header=Received-SPF: fail (baddomain.com: Sender is not authorized by default to use 'gooduser@baddomain.com' in 'mfrom' identity (mechanism '-all' matched)) receiver=mail.gooddomain.ua; identity=mailfrom; envelope-from="gooduser@baddomain.com"; client-ip=XX.XX.XX.XX
spf_record=spf2.0/mfrom,pra include:senderid.unisender.com -all
smtp_comment=Rejected by SPF record
header_comment=baddomain.com: Sender is not authorized by default to use 'gooduser@baddomain.com' in 'mfrom' identity (mechanism '-all' matched)
де, gooduser@baddomain.com – адреса відправника, XX.XX.XX.XX – власне IP звідки відправлється лист.
Тут є 2 нюанси:
- unix socket /tmp/spfd.sock має права 0660 Debian-exim:Debian-exim і тому треба бути в групі Debian-exim, щоб мати змогу підключитися до нього
- nc (netcat) в Linux не маж опцію підключення до unix socket’y, тому треба ставити пакет netcat-openbsd в якому ця опція є.
І головне питання, як бути далі? Я рекомендував написати у техпідтримку цього baddomain.com а зі сторони користуча додати у whitelist цей домен, якщо листування з ним дуже важливе. Як додати у whitelist – можна подивитися тут
Висновок: не завжди треба довіряти, навіть відомим сервісам по перевірці.