Pull to refresh

Реализация Exim + OpenDKIM для массовых рассылок

System administration*nix
Все было готово к запуску нового проекта, осталась одна проблема – письма подтверждения регистрации 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

/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 yes

Canonicalization relaxed/simple

Domain example.com
Selector mail
KeyFile /var/db/opendkim/mail.private

Socket 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:}}
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 не запустился.

Напоследок пару слов о сервисе, для которого я это делал. С середины лета все свободное время работал над проектом "умного" подбора фильмов. Сайт перешел с альфа тестирования в бета. Буду благодарен за полезные советы и замечания по работе сервиса. Вот ссылка.
Tags:eximрассылкиdkimспамopendkimfreebsd
Hubs: System administration *nix
Rating +5
Views 24.4k Add to bookmarks 84
Comments
Comments 6
Data Engineer
from 2,000 $MixRankRemote job
Cистемный архитектор/System architect
from 250,000 to 350,000 ₽C-Executives LLCRemote job
Системный аналитик/ System analyst
from 200,000 to 300,000 ₽C-Executives LLCRemote job
Business System Analyst (Data Warehouse)
from 3,000 €ExnessЛимассолRemote job
Senior system analyst (проект ДБО)
from 220,000 to 260,000 ₽Почта БанкRemote job