Пару лет назад, я написала статью «Как сделать, чтобы письма не попадали в спам ящик».
Вчера мы с коллегами настроили ещё один метод подтверждения писем, под названием DKIM. Его можно использовать вместе с SPF.
Authentication-Results: mxfront7.mail.yandex.net; spf=pass (mxfront7.mail.yandex.net: domain of usabili.ru designates 209.85.212.180 as permitted sender) smtp.mail=askme@usabili.ru; dkim=pass header.i=@usabili.ru
Разница в том, что SPF - подтверждает IP адрес отправителя. DKIM же ip-адрес не учитывает, но подтверждает факт того, что конкретно отправитель имеет секретный ключ, который можно проверить публичным ключом, указанным в днс-записи.
Яндекс, судя по всему, считает DKIM более приоритетным средством борьбы со спамом. См. статью «Цифровая подпись — Яндекс.Помощь: Почта». По этой причине, только письма проверенные через DKIM получают красивенькую медальку рядом с адресом отправителя.
Проверка DKIM для получателя гораздо проще, чем SPF. Так как для проверки DKIM требуется запросить всего одну днс запись, например для моего домена default._domainkey.usabili.ru, и получить оттуда публичный ключ домена, которым можно проверить хеш заголовков, т.е. цифровую подпись (что докажет что я владелец секретного ключа).
В случае же с SPF, процедура проверки сложнее, т.к. надо взять днс запись, из неё взять список разрешённых ip, и ссылки на другие spf записи, которые тоже надо рекурсивно обработать и т.п. Затем сверить ip отправителя с данным списком. В случае, когда письмо проходит через несколько серверов, желательно подписать их все.
А вот отправителю, наоборот, настроить у себя поддержку SPF на порядок проще, чем настроить DKIM. Как я уже писала, для настройки SPF достаточно создать запись:
usabili.ru. IN TXT "v=spf1 a include:_spf.google.com ~all"
Эта строчка разрешает слать почту только с ip указанного в A-записи домена, и с серверов гугл.
Как настроить DKIM в службах для домена от Google
Всё подробно написано вот в этом мануале:
http://support.google.com/a/bin/answer.py?hl=ru&answer=174124
если вкратце, то
- Зайти на нужную страницу в панели владельца домена гугл
- Выбрать домен и получить код для вставки в днс
- Вставить нужный код в TXT запись поддомена. Например, у меня google2._domainkey.usabili.ru
- Активировать
- ...
- Profit. Ваши письма, посланные из Gmail, теперь подписываются ключом домена.
Как настроить подпись писем с сервера, при отправке через PHP
Если вы отправляете письма в PHP через SMTP сервера гугла, то всё уже сделано. Гугл использует подпись при отправке через SMTP.
Если же вы отправляете почту функцией mail
, то в системе необходимо установить пакет dkim-filter
.
yum install dkim-filter
Или
aptitude install dkim-filter
Затем сгенерировать ключ через dkim-genkey. Лентяи вроде нас, могут использовать его для всех доменов на сервере. Сгенерированный в файле .txt публичный ключ нужно добавить в днс записи доменов.
Далее читаем статьи
- DKIM + Postfix = просто / Хабрахабр
- DKIM — это просто / Хабрахабр
- Deploy DKIM Milter for Multiple Domains on CentOS 5 with Sendmail | TechSneeze.com
- Sendmail DKIM SPF FreeBSD или борьба со спамом
Личные комментарии по настройке sendmail.
- Для sendmail нужно редактировать файл /etc/mail/sendmail.mc, не submit.mc.
- Для компиляции конфига удобно вместо m4 использовать прилагающийся make (он сам запустит m4).
Как проверить записи DKIM
Для этого можно воспользоваться онлайн сервисом http://dkimcore.org/c/keycheck, либо послать письмо на указанный тут адрес http://appmaildev.com/en/dkim/.
Пользователи линукса могут набрать команду # dig google2._domainkey.usabili.ru TXT
Либо послать письмо на ящик в гугле или яндексе.
В гмайл, если нажать на стрелочку, будет видно что-то типа
от: | BoughCMS Notify noreply@usabili.ru | ||
кому: | *** |
||
дата: | 28 июня 2012 г., 15:08 | ||
тема: | Usabili.ru: Письмо с сайта | ||
отправлено через: | ***.ru | ||
подписан: | usabili.ru |
Заключение
Хочу обратить внимание на ещё несколько пунктов.
Если вы используете возможность гмайла "Отправлять письма как:", т.е. не отправлять их напрямую со своего ящика. То гмайл будет подписывать DKIM оригинальным ящиком отправителя, а не вашим доменом.
Если вы абсолютно уверены, что успешно настроили DKIM, то можете запретить другим серверам принимать письма с вашим доменом, но без подписи, добавив ADSP запись:
_adsp._domainkey IN TXT "dkim=all"
Update
Я совсем забыла рассказать про то как присваивать доменные подписи конкретным email адресам. Дело в том что вы можете отправить почту с домена X, через почтовый сервер домена Y, а подписать его ключом домена Z. И это даже будет работать =). Настройка ключей происходит в файле /etc/mail/dkim-milter/keys/keypath
. Здесь стоит обратить внимание на часть строк, задающую sender-pattern
, она может содержать звёздочку, как часть или весь домен. В случае указания просто звёздочки, данным ключом и доменом будут подписываться все письма.
# sender-pattern:signing-domain:keypath # *:example.com:selector *@usabili.ru:usabili.ru:/etc/mail/dkim-milter/keys/default # тут всякие остальные домены, а ниже домен для подписи по-умолчанию. *:verytec.ru:/etc/mail/dkim-milter/keys/default
Внимательный читатель заметил, что путь к секретному ключу один на все домены. Это ничуть не мешает работе подписей.
Всего вам доброго =)
Комментарии:
Алекс
26.10.2012 16:03:45
27.11.2012 20:00:56
Елена Лунная
20.02.2013 00:50:00
Елена Лунная
20.02.2013 00:53:03
Елабу
25.07.2013 09:27:57
Дима
21.04.2014 01:31:50
Елена Лунная
21.04.2014 09:48:53
10.06.2014 02:48:13
19.09.2014 23:15:35