Postfix - настраиваем SPF & DKIM
Введение
Давайте попробуем настроить SPF и DKIM, чтобы письма реже попадали в спам.
Предполагается, что вы уже используете Postfix. И возможно даже на одном из проектов у вас уже настроена smtp авторизация.
SPF
Настроить SPF запись очень легко.
- Необходимо добавить следующую TXT запись в DNS вашего домена
"v=spf1 ip4:1.2.3.4 a -all"
(двойные кавычки оставьте). Здесь вместо адреса 1.2.3.4 должено быть IP адрес, с которого вы отправляете почту. - Убедитесь, что ваш почтовик отправляет почту именно с указанного адреса. Частой ошибкой бывает запись
inet_protocols = all
в файле настроек Postfixmain.cf
, из-за которой письма могут отправляться с ipv6 адреса. Рекомендую указатьinet_protocols = ipv4
.
Теперь принимающий почтовик (например Yandex) будет дописывать свой заголовок в письмо Authentication-Result
. Там должно быть указано что то типа:
Authentication-Results: mxfront5o.mail.yandex.net; spf=pass (mxfront5o.mail.yandex.net: domain of example.com designates 1.2.3.4 as permitted sender, rule=ip4:1.2.3.4) smtp.mail=info@example.com; dkim=neutral header.i=@example.com
Нас интересует spf=pass
это значение может быть в Pass, Fail, SoftFail, Neutral. Нам нужно в pass.
Помните, что с такой записью, если на этом домене есть другая почта ( с отличным от указанного IP адресом ), то она будет валиться в спам. Поэтому если вам нужны вариации SPF записи, отдельно разберитесь в этом, чтобы не угробить корпоративную жизнь клиенту.
DKIM
Данная настройка предполагает, что postfix у вас уже настроен и работает, а также настройка совместима с настройками smtp авторизации для соседствующих доменов.
Установим opendkim opendkim-tools
yum install install opendkim opendkim-tools
mkdir /etc/postfix/dkim/
Сгенерируем туда ключ для нашего домена
opendkim-genkey -D /etc/postfix/dkim/ -d example.com -s selector
⚠️ Важно! Обратите внимание на параметры:
Если вы планируете настраивать несколько DKIM, то рекомендую сразу начать использовать соответствующие проекту селекторы. Поэтому я использую название selector вы используйте свои читаемые названия.
После выполнения этой команды у вас создастся два файла .private и .txt. На папку и на приватный ключ нужно выставить правильные права:
chmod 600 /etc/postfix/dkim/example.com.private && chown -R opendkim /etc/postfix/dkim/
Отредактируем файл vim /etc/opendkim.conf. Найдем и исправим параметры в соответствии представленном ниже:
Syslog yes Mode sv KeyTable file:/etc/postfix/dkim/keytable SigningTable file:/etc/postfix/dkim/signingtable
Создадим файл vim /etc/postfix/dkim/keytable
и укажем информацию о приватном ключе:
#имя_ключа домен:селектор:/путь/до/ключа selector._domainkey.example.com example.com:selector:/etc/postfix/dkim/example.com.private
Создадим файл vim /etc/postfix/dkim/signingtable
и укажем домены, которые нужно подписывать (можно несколько):
example.com selector._domainkey.example.com
Откроем или создадим файл `vim /etc/default/opendkim` и пропишем там строчку
SOCKET="inet:8891@localhost"
И теперь добавим настройки в конец vim /etc/postfix/main.cf
(убедитесь, что у вас там ранее ничего не настроено было, наверное в начале инструкции следовало это посоветовать)
milter_default_action = accept milter_protocol = 2 smtpd_milters = inet:localhost:8891 non_smtpd_milters = inet:localhost:8891
service postfix restart && service opendkim restart
С этой минуты письма будут подписаны вашей DKIM сигнатурой. Теперь важно добавить запись DNS домена.
Используйте хост, который использован в keytable и signingtable.
В файле /etc/postfix/dkim/selector.txt
вы найдете публичный DKIM key, но он будет рзбит на две строчки. Можно вручную объединить в одну.
В итоге у вас получится что-то типа такого:
Хост: <i>selector._domain</i><br>
Запись TXT: <i> v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBA...........ADCBiQ</i>
После успеха, отправьте себе письмо (например на Yandex) и убедитесь, что в заголовках письма есть Authentication-Results где прописано dkim=pass.
Пример заголовка (вместе с SPF):
Authentication-Results: mxfront9o.mail.yandex.net; spf=pass (mxfront9o.mail.yandex.net: domain of example.com designates 1.2.3.4 as permitted sender, rule=[ip4:1.2.3.4]) smtp.mail=info@example.com; dkim=pass header.i=@example.com
Чтобы это сделать в CentOS 7, убедитесь что стоит пакет `mailx`
yum install mailx
echo "Hello" | mail -s "Test DKIM & SPF" -rinfo@example.com destination@email.ru
Кроме того, что в заголовках появится информация Authentication-Results, вы сможете найти в логах /var/log/maillog следующую запись о том что добавлено поле DKIM-Signature:
Jun 5 08:27:54 37-140-199-90 opendkim[15285]: 4DFFCCA0320: DKIM-Signature field added (s=example, d=example.com)
Теперь вы снизили риск попадания письма в спам. Помните, что кроме этого необходимо также не спамить, давать возможность пользователям отписаться, а также иметь белый IP адрес, который не внесен в реестр злостных рассыльщиков. И даже при соблюдении всего этого, вы всё равно можете столкнуться с тем, что письмо упало в спам (например это могут быть собственные пользовательские фильтры).
Я также рекомендую использовать SMTP шлюзы или почту популярных почтовиков, таких как gmail, yandex, mail и отправлять почту через SMTP авторизацию.
Убедитесь, что у вас в проекте устанавливается правильный отправитель. Если письма отправляются по крону, то настройки apahce и даже любимый /etc/php.d/* могут игнорироваться, т.к. там напрямую дергается php.