В связи с тем, что почтовые гиганты постоянно борются со спамом, вводятся всё новые способы проверки почты. К ним относятся два основных способа, это SPF и DKIM подписи домена.
SPF привязан к IP сервера, а DKIM к домену отправителя.
Для настройки SPF в DNS вносится запись типа TXT со следующим содержанием:
@.vashdomen.ru v=spf1 ip4:ip-vashego-servera a ~all например: @.google.ru v=spf1 ip4:8.8.8.8 a ~all
После внесения SPF записи в домен, переходим к настройке DKIM. В Redhat подобных системах необходимо установить sendmail sendmail-cf и opendkim:
#yum install -y sendmail sendmail-cf opendkim
Раскомментируем строчку Domain в файле /etc/opendkim.conf и впишем наш домен:
Domain moysayt.ru
Раскомментируем строчки:
SigningTable refile:/etc/opendkim/SigningTable KeyTable /etc/opendkim/KeyTable InternalHosts refile:/etc/opendkim/TrustedHosts
Важно поменять режим подтверждения (v) на режим подписывания (s) или подписывания с подтверждением (sv):
Mode sv
Генерируем ключ:
#cd /etc/opendkim/keys && openssl genrsa -out default.private 1024 -outform PEM #openssl rsa -in default.private -out dkim-public.pem -pubout -outform PEM
Чтоб opendkim запустился меняем владельца и группу файла default.private
#chown opendkim.opendkim default.private
Добавляем для нашего домена TXT запись субдоменом default._domainkey , она должна иметь следующий вид:
(Domain) default._domainkey.moysayt.ru (TXT) v=DKIM1; k=rsa; p=MHwwDQYJKoZIhvcNAQEBBQADawAwaAJhAKJ2lzDLZ8XlVambQfMXn3LRGKOD5o6lMIgulclWjZwP56LRqdg5ZX15bhc/GsvW8xW/R5Sh1NnkJNyL/cqY1a+GzzL47t7EXzVc+nRLWT1kwTvFNGIoAUsFUq+J6+OprwIDAQAB;
код красного цвета берём из файла dkim-public.pem, это публичный ключ, в зависимости от генерации он может находиться в файле dkim-public.pem, defaul.txt (описано ниже) или в каком-нибудь другом файле.
-----BEGIN PUBLIC KEY----- MHwwDQYJKoZIhvcNAQEBBQADawAwaAJhAKJ2lzDLZ8XlVambQfMXn3LRGKOD5o6l MIgulclWjZwP56LRqdg5ZX15bhc/GsvW8xW/R5Sh1NnkJNyL/cqY1a+GzzL47t7E XzVc+nRLWT1kwTvFNGIoAUsFUq+J6+OprwIDAQAB -----END PUBLIC KEY-----
Другим вариантом генерации ключа является команда:
#opendkim-genkey -D /etc/opendkim/keys/ -d moysayt.ru -s default
Сгенерируются закрытый (default.private) и открытый (default.txt) ключи.
Если все эти варианты вызывают ошибки в CentOS, то используйте эту команду:
#openssl genrsa -out default.private 1024 && openssl rsa -in default.private -pubout > default.txt
Файлы должны быть с правами 400 и владельцем opendkim:
#chown opendkim.opendkim * && chmod 400 *
Для тестирования связки открытого и закрытого ключа используем команду:
#opendkim-testkey -d moysayt.ru -s default -k default.private
В файле SigningTable раскомментируем и изменяем строчку:
*@moysayt.ru default._domainkey.moysayt.ru
В файле KeyTable раскомментируем и изменяем строчку:
default._domainkey.moysayt.ru moysayt.ru:default:/etc/opendkim/keys/default.private
В файл TrustedHosts добавить:
moysayt.ru
Если у нас несколько доменов, то описываем их в файлах :
/etc/opendkim/SigningTable moysayt.ru default._domainkey.moysayt.ru moysayt2.ru default._domainkey.moysayt2.ru moysayt3.ru default._domainkey.moysayt3.ru /etc/opendkim/KeyTable default._domainkey.moysayt.ru moysayt.ru:default:/etc/opendkim/keys/default.private default._domainkey.moysayt2.ru moysayt2.ru:default:/etc/opendkim/keys/moysayt2/default.private default._domainkey.moysayt3.ru moysayt3.ru:default:/etc/opendkim/keys/moysayt3/default.private
Меняет строчку в файле /etc/mail/sendmail.mc (если используем специальный relay, например, всё оправляется только через сервер провайдера):
dnl define(`SMART_HOST', `smtp.moydomen.ru')dnl
для подписывания письма службой opendkim, добавляем в конце файла /etc/mail/sendmail.mc, строку:
INPUT_MAIL_FILTER(`opendkim', `S=inet:8891@localhost')dnl
Важно, файл должен обязательно заканчиваться пустой строкой. Если последней будет выше указанная строка, то m4 будет ругаться на ошибку.
Конвертируем этот файл в конфиг:
#m4 sendmail.mc > sendmail.cf
И перезапускаем opendkim и sendmail
#service opendkim restart && service sendmail restart
Проверяем появились ли TXT записи DNS
#dig default._domainkey.moysayt.ru TXT #dig moysayt.ru TXT
Если записи не появились, то ждём когда появятся. Как только появятся проверяем работу sendmail из консоли
#echo -e "To: testoviy-mail@yandex.ru\\nFrom: noreply@moysayt.ru\\nSubject: Test\\nTest\\n" | sendmail -bm -t -v
Если письмо дошло и не попало в СПАМ, то смотрим есть ли значок означающий наличие подписи.
Проверяем включена ли автозагрузка sendmail и opendkim
(CentOS 7) #systemctl is-enabled opendkim && systemctl is-enabled sendmail.service (CentOS 6) #chkconfig | grep opendkim && chkconfig | grep sendmail
Если отключены, то включаем
(CentOS 7) #systemctl enable opendkim #systemctl enable sendmail.service (CentOS 6) #chkconfig opendkim on #chkconfig sendmail on
При наличии SeLinux необходимо в его настройках дать разрешение apache-u отправлять сообщения через Sendmail, для этого проверяем права
#getsebool -a | grep mail
Получаем ответ
gitosis_can_sendmail --> off httpd_can_sendmail --> off logging_syslogd_can_sendmail --> off logwatch_can_network_connect_mail --> off mailman_use_fusefs --> off postfix_local_write_mail_spool --> on
Включаем возможность отправки почты PHP через Sendmail (чтоб SeLinux не блокировал)
#setsebool -P httpd_can_sendmail on
Проверяем работоспособность отправкой тестового сообщения через PHP
#php -a
php >mail ('1ymth75yyoohfe@dkimvalidator.com', "Test email", "Test email from the Internet", null, "-f apache@moysayt.ru");
На сайте dkimvalidator.com вводим адрес почты и смотрим данные письма 1ymth75yyoohfe@dkimvalidator.com. Если сообщение не дошло до сервера, то нужно проверить логи:
#tail /var/log/maillog
Если в логах есть текст:
... no signing table match for ...
... no signature data ...
То могут быть две причины:
- неправильно настроили файлы SigningTable и/или KeyTable;
- фалы сохранены не в UTF8 BOOM с форматом конца строк UNIX (LF). Если формат конца строк DOS (CRLF), то это вызывает ошибку в работе openDKIM.
Для проверки файлов SigningTable и KeyTable в командной строке набираем:
#opendkim -Q
> refile:/etc/opendkim/SigningTable
opendkim: enter 'query/n' where 'n' is number of fields to request
> moysayt.ru/1
default._domainkey.moysayt.ru/1
> Ctrl + D
#opendkim -Q
> /etc/opendkim/KeyTable
opendkim: enter 'query/n' where 'n' is number of fields to request
> default._domainkey.moysayt.ru/3
'moysayt.ru'
'default'
'/etc/opendkim/keys/default.private'
opendkim: enter 'query/n' where 'n' is number of fields to request
Если в файле /etc/opendkim.conf используем синтаксис SigningTable refile:/etc/opendkim/SigningTable, то в файле SigningTable нужно писать:
*@moysayt.ru default._domainkey.moysayt.ru
Если SigningTable file:/etc/opendkim/SigningTable или SigningTable /etc/opendkim/SigningTable то:
moysayt.ru default._domainkey.moysayt.ru
Если в логах есть подобная ошибка:
relay=alt4.gmail-smtp-in.l.google.com., dsn=4.0.0, stat=Deferred: Connection timed out with alt4.gmail-smtp-in.l.google.com.
то это значит порт 25 закрыт (на исходящее подключение). Отключаем firewalld и проверяем, если заработает — значит проблема в нём, если нет — то обращаемся к провайдеру, чтоб тот открыл 25-ый порт.
#service firewalld stop #echo -e "To: testoviy-mail@yandex.ru\\nFrom: noreply@moysayt.ru\\nSubject: Test\\nTest\\n" | sendmail -bm -t -v #service firewalld start
Подробный мануал по openDKIM можно найти здесь