Жизнь была прекрасна и все было в этом мире хорошо, пока почта с моего сайта не стала активно посылаться в спам практически всеми крупными почтовыми серверами. Особенно усердствовал в этом 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