Все было готово к запуску нового проекта, осталась одна проблема – письма подтверждения регистрации Gmail отправлял в спам. Ознакомившись со справкой сервиса Gmail, я понял, что основной проблемой является отсутствие реализации DKIM на сервере. В моем случае, отправкой писем занимался Exim. Необходимо было реализовать связку Exim+DKIM. Увы, из-за смены утилиты реализации DKIM на FreeBSD все инструкции устарели. Мне пришлось вслепую настраивать Exim+DKIM несколько дней. В этой статье я опишу все этапы реализации Exim+DKIM.
DKIM необходим для массовых рассылок и отправки автоматических писем с сайта. Без наличия этой технологии спам фильтры Gmail не пропускают письма, отправленные скриптами. Для того чтобы Exim оправлял письма, подписанные ключем DKIM, необходимо поставить дополнительную утилиту OpenDKIM. Ранее использовалась утилита dkim-filter, разработчики прекратили ее поддержку.
Советую ознакомиться со статьей. В ней доходчиво написано, как добиться, чтобы ваши письма не попадали в спам. Статья устарела для реализации связки Exim+DKIM, все остальное – актуально.
Установка реализовывалась в 5 этапов.
1. Установка OpenDKIM
cd /usr/ports/mail/opendkim
make install clean
2. Генерируем ключи и настраиваем OpenDKIM и DNS записи
Для начала нужно сгенерировать пару ключей — внешний и внутренний. Внешний будет храниться в DNS записях, а внутренний – на сервере.
Итак, генерируем ключи:
opendkim-genkey -D /var/db/opendkim -d <domain.name> -s <selector>
/var/db/opendkim — директория, где будут лежать ключи
<domain.name> — доменное имя (example.com)
selector — указываем селектор, (например, mail). Селектор будет использоваться в DNS записи и указываться в настройке транспортов exim`а.
В нашем случае пишем следующее:
opendkim-genkey -D /var/db/opendkim -d example.com -s mail
Итак, создается два файла — mail.txt (mail — выбранный нами селектор) и mail.private. Посмотрим их содержимое:
cat /var/db/opendkim/mail.txt
mail._domainkey IN TXT ( "v=DKIM1; k=rsa; t=s; " "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GN … mpwIDAQAB" ) ; ----- DKIM key mail for example.com.
Содержимое файла mail.txt добавим в DNS зону example.com, причем вот в таком виде (скобки и кавычки нужно удалить):
mail._domainkey IN TXT "v=DKIM1; k=rsa; t=s; p=MIGfMA0GCSqGS … wIDAQAB"
Советуют еще добавить вот такую DNS запись:
_adsp._domainkey.example.com IN TXT "dkim=unknown"
Дальше на файл mail.private устанавливаем права, чтобы его мог прочитать exim и только он. В нашем случае вот так:
chown mailnull:mail /var/db/opendkim/mail.private
chmod 600 /var/db/opendkim/mail.private
Добавим в config файле opendkim путь к mail.private. Покажу пример моего config:
vim (or something else) /usr/local/etc/opendkim.conf
# This is a simple config file for signing and verifying
LogWhy yes
Syslog yes
SyslogSuccess yesCanonicalization relaxed/simple
Domain example.com
Selector mail
KeyFile /var/db/opendkim/mail.privateSocket inet:8891@localhost
ReportAddress support@example.com
SendReports yes## Hosts to sign email for — 127.0.0.1 is default
## See the OPERATION section of opendkim(8) for more information
#
# InternalHosts 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12## For secondary mailservers — indicates not to sign or verify messages
## from these hosts
#
# PeerList X.X.X.X# PidFile /var/run/opendkim/opendkim.pid
Так как мы настраивали подпись только к одному домену, то сложностей не возникло.
C opendkim`ом закончили. Перейдем к настройке Exim.
3. Настройка Exim
Поправим секцию transports:
vim /usr/local/etc/exim/configure
Находим begin transports и сразу же ниже добавляем:
DKIM_DOMAIN = ${lc:${domain:$h_from:}}
<code>DKIM_FILE = /var/db/opendkim/mail.private #- важно!!!! Пишем путь к приватному ключу
DKIM_PRIVATE_KEY = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}
Также заменяем:
remote_smtp:
driver = smtp
На:
remote_smtp:
driver = smtp
dkim_domain = DKIM_DOMAIN
dkim_selector = mail # - выбранный нами селектор.
dkim_private_key = DKIM_PRIVATE_KEY
4. Дальше нужно запустить milter_opendkim
usr/local/etc/rc.d/milter-opendkim start
5. Перезапустить Exim
/usr/local/etc/rc.d/exim reload
Exim запустился, делаем пробную отправку письма.
После успешного запуска DKIM в оригинале письма появится следующая запись:
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d= example.com; s=mail;
h=Date:Message-Id:From:Content-type:MIME-Version:Subject:To; bh=RUN…0qKg=;
b=EEla1LMRm…Q6CYJM/VHg=;
Received: from example by xxx.freehost.com.ua with local (Exim 4.80.1 (FreeBSD))
Если запись не появилась – DKIM не запустился.
Напоследок пару слов о сервисе, для которого я это делал. С середины лета все свободное время работал над проектом «умного» подбора фильмов. Сайт перешел с альфа тестирования в бета. Буду благодарен за полезные советы и замечания по работе сервиса. Вот ссылка.
Автор: coolweb