Массовая почтовая рассылка через Exim или как не попасть в спам

:

Жизнь была прекрасна и все было в этом мире хорошо, пока почта с моего сайта не стала активно посылаться в спам практически всеми крупными почтовыми серверами. Особенно усердствовал в этом Gmail. Частенько меня принимали за спамера в Yandex, реже в mail.ru и rambler.
image
Исходя из совокупности представленных факторов стало понятно, что надо что-то делать с настройками своего почтового сервера Exim. Посмотреть, как это было сделано, приглашаю под хабракат.

Порывшись немного в интернете на эту тему, обнаружил несколько интересных статей на Хабре ( Почтовая кухня #1: DNS, Что такое SPF, Как не стать спамером со своей уютной рассылочкой), но они, к сожалению, охватывают только часть настроек почтового сервера. Постараюсь восполнить этот пробел.

Итак имеется debian lenny сервер и установленный на нем дефолтный Exim 4.72. Описывать установку Exim не имеет смысла (хотя тут ничего сложного нет — sudo apt-get install exim4). Лишь напомню, что первоначальную настройку exim можно провести следующей командой:

dpkg-reconfigure exim4-config

Все! Сайт готов рассылать почту. Но здесь есть 3 «но». Почтовики очень любят SPF, PTR и DKIM и очень не любят их отсутствие. Далее описывается как настроить это буквально за несколько минут.

PTR

Сначала настроим PTR. PTR это так называемая «обратная запись». В ней в обратном порядке записывается IP адрес хоста, с которого в нашем случае рассылается почта. По этой записи почтовики распознают имя хоста по его IP. Немного теории здесь.

Предположим, что IP вашего почтового сервера 78.56.158.23. Открываем наш NS сервер (или, что чаще настройки провайдера сервера или хостера) и добавляем следующую DNS запись (IP при этом «разворачиваем»):

23.158.56.78.in-addr.arpa IN PTR mail.mydomain.ru.

Проверяем изменения — http://centralops.net/co/DomainDossier.aspx
Здесь остается добавить, что такая запись у моего хостера FastVPS задается через панель веб-ребута.

SPF

В SPF записи мы указываем какие сервера имеют право отправлять почту с вашего домена. В самом простом случае эта запись выглядит следующим образом:

mydomain.ru. IN TXT "v=spf1 a mx ~all"
или/и (если NS позволяет создавать SPF записи)
mydomain.ru. IN SPF "v=spf1 a mx ~all"

Т.е. отправлять почту имеют право сервер с DNS записью в секции «a» и почтовый сервер в секции «mx».
Более подробно о SPF написано в статье " Что такое SPF".

Составить свой вариант записи SPF поможет этот сервис — openspf.org

Опять проверяем результат через сервис centralops.net.

DKIM

Для создания успешной рассылки осталось создать подписи к письмам.

Устанавливаем dkim-filter:

apt-get install dkim-filter

Затем генерируем пару ключей для подписи писем (открытый и закрытый ключ):

dkim-genkey -d mydomain.ru -s mail -r

-r значит, что ключ будет использоваться только для почты
-s задает имя dkim-selector (можно указать любое имя, например имя вашего домена)

Смотрим, что получилось при генерации открытого ключа:

tail mail.txt
И видим:
mail._domainkey IN TXT "v=DKIM1; g=*; k=rsa; p=MIGfMA0GCS..." ; ----- DKIM mail for mydomain.ru

Сам ключ обрезал, потому что он довольно длинный.

Копируем содержимое этого файла и вставляем в DNS записи нашего сервера. Все, с открытым ключом мы закончили.

У нас остался закрытый ключ mail.private, который нам надо привязать к Exim.
Переименовываем mail.private и копируем его в директорию exim:

mv mail.private mydomain.ru.key
cp mydomain.ru.key /etc/exim4
chmod 755 /etc/exim4/mydomain.ru.key

или же лучше сделать хозяином файла пользователя exim командой chown и сделать права на доступ к нему, к примеру, 600 или еще строже 400:

chown exim:exim /etc/exim4/mydomain.ru.key
chmod 600 /etc/exim4/mydomain.ru.key

И теперь осталось настроить сам Exim:

nano /etc/exim4/exim4.conf.template

Находим секцию remote_smtp и перед ней добавляем:

DKIM_DOMAIN = ${lc:${domain:$h_from:}}
DKIM_FILE = /etc/exim4/${lc:${domain:$h_from:}}.key
DKIM_PRIVATE_KEY = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}

И немного правим саму секцию:

remote_smtp:
driver = smtp
dkim_domain = DKIM_DOMAIN
dkim_selector = mail
dkim_private_key = DKIM_PRIVATE_KEY

где dkim_selector это первое слово перед ._domainkey в открытом ключе

После перезапускаем exim:

/etc/init.d/exim4 restart

Теперь проверим подписи. Для этого можно просто отправить письмо на любой адрес Gmail. Затем надо посмотреть подробные сведения о письме и в поле «Подписан» должен быть ваш домен. Или можно посмотреть код письма и в заголовке письма должно присутствовать поле DKIM-Signature. Если оно есть, то мои поздравления! Подписи работают!

Итоги

Вот таких трех простых шагов достаточно, чтобы ваша почта больше не попадала в спам (если вы конечно не спамер). У меня, например, до этих переделок почта с сайта практически всегда отправлялась Gmail в спам. Теперь же надо что-то невообразимое написать в письме, чтобы оно было помечено как спам. К счастью, все мои рассылки теперь доходят до адресатов.

Напоследок можно сказать, что еще одним способом эффективной доставки почты является грейлистинг. В этом случае почтовый сервер, который получает вашу почту на первое сообщение отвечает временной ошибкой, вносит ваш сервер в " серый список", и только когда с вашего сервера придет повтор этого сообщения, то оно пропускается. Как правило спамерские программы не посылают повторов.

В Exim по умолчанию включена система автоповторов для всех хостов. Вы можете усовершенствовать дефолтное правило, найдя в конфигурационном файле секцию RETRY CONFIGURATION и отредактировать согласно этой инструкции.

В рамках данного топика не рассматривалось применение описанных технологий для приема писем на свой почтовый сервер. Это тема для другой статьи.

Ссылки:
Рекомендации по осуществлению массовых рассылок
Почтовая кухня #1: DNS
HOWTO: Exim & DKIM