0. для чего это нужно:
В связи с некоторым распространением SPF (sender policy framework) возникает
такая проблема: администратор домена отправителя
пример godaddy.com прописывает в ДНС
для своего домена текстовую запись, указывая с каких ip-адресов все остальные
почтовые сервера имеют право получать письмо с обратным адресом этого домена.
Так же этот администратор может рекомендовать запретить принимать
письма с остальных ip-адресов. Теперь предположим, что на Ваш сервер
пример mail.mydomain.ru пришло
письмо с обратным адресом от такого домена
пример info@godaddy.com И предположим, что у Вас стоит
переадресация для получателя пример
noc@mydomain.ru-->vasya@yandex.ru. Тогда Ваш почтовый сервер пересылает это письмо.
Итак, что видит сервер того домена на который идет переадресация: с ip-адреса
Вашего сервера приходит письмо с обратым адресом
info@godaddy.com.
Сервер делает запрос TXT записи для домена
godaddy.com и получает ответ
"v=spf1 include:spf.secureserver.net -all"
Поскольку Ваш сервер
mail.mydomain.com или его ip-адрес не вклчюен в
spf.secureserver.net а следующая
инструкция -all запрещает прием от всех остальных ip-адресов, сервер получателя
отвергает такое письмо.
сервер mail.mydomain.ru
MX сервер для домена mydomain.ru
ip=123.134.145.156
forward noc@mydomain.ru-->vasya@yandex.ru
(получатель меняется с noc@mydomain.ru на vasya@yandex.ru)
< 220 mail.mydomain.ru ESMTP Sendmail 8.13.7/8.13.7
> EHLO mail.godaddy.com
< 250-mail.mydomain.ru Hello mail.godaddy.com, pleased to meet you
< 250 SIZE 10485760
> MAIL FROM:<info@godaddy.com>
< 250 2.1.0 <info@godaddy.com>... Sender ok
> RCPT TO:<noc@mydomain.ru>
< 250 2.1.5 <noc@mydomain.ru>... Recipient ok
> DATA
< 354 Enter mail, end with "." on a line by itself
> ....
< 250 2.0.0 k7H7gVn4013640 Message accepted for delivery
<---------(1)------------
mail.godaddy.com
создает письмо
from news@godaddy.com
to noc@mydomain.ru
Какой выход? поменяем адрес отправителя! пусть он теперь будет
godaddy.com=info@forward.mydomain.ru
Вы также можете прописать соответствующую SFP запись для поддомена
forward.mydomain.ru например такую
forward IN TXT "v=spf1 a:mail.mydomain.ru -all"
тем самым разрешив принимать почту с обратным адресом из домена
forward.mydomain.ru только от своего почтового сервера mail.mydomain.ru
можно заменить строгий запрет на прием почты
с других адресов -all на менее строгий ~all
< 220 Yandex ESMTP (NO UCE)(NO UBE) server ready
> EHLO mail.mydomain.ru
< 250-mxfront5.yandex.ru Hello mail.mydomain.ru
< 250 SIZE 10485760
> MAIL FROM:<godaddy.com=info@forward.mydomain.ru>
< 250 2.1.0 <godaddy.com=info@forward.mydomain.ru>... Sender ok
> RCPT TO:<vasya@yandex.ru>
< 250 2.1.5 <vasya@yandex.ru>... Recipient ok
> DATA
< 354 Enter mail, end with "." on a line by itself
> ....
< 250 2.0.0 k7H7gVn4013640 Message accepted for delivery
сервер mail.mydomain.ru
MX сервер для домена mydomain.ru
ip=123.134.145.156
forward noc@mydomain.ru-->vasya@yandex.ru
(получатель меняется с noc@mydomain.ru на vasya@yandex.ru)
(отправитель меняется с info@godaddy.com на godaddy.com=info@forward.mydomain.ru)
< 220 mail.mydomain.ru ESMTP Sendmail 8.13.7/8.13.7
> EHLO mail.godaddy.com
< 250-mail.mydomain.ru Hello mail.godaddy.com, pleased to meet you
< 250 SIZE 10485760
> MAIL FROM:<info@godaddy.com>
< 250 2.1.0 <info@godaddy.com>... Sender ok
> RCPT TO:<noc@mydomain.ru>
< 250 2.1.5 <noc@mydomain.ru>... Recipient ok
> DATA
< 354 Enter mail, end with "." on a line by itself
> ....
< 250 2.0.0 k7H7gVn4013640 Message accepted for delivery
<---------(1)-----------
mail.godaddy.com
создает письмо
from news@godaddy.com
to noc@mydomain.ru
1. что нам понадобится
загрузить и установить с помощью cpan перловый модуль Mail::SRS
sendmail должен поддерживать сокетмапы.
как проверить? запускаем
$ sendmail -d
в списке Compiled with: вы должны увидеть опцию SOCKETMAP
если ее нет, Вам придется перекомпилировать sendmail, включив в файл
devtools/Site/site.config.m4 опцию -DSOCKETMAP
2.установка
Считаем, что Mail::SRS у нас уже установлен.
распаковываетм srs-socketmapd.0.32rc3.tar.gz
файл INSTALL очень информативен, вот краткий пересказ:
копируем :
srs-socketmapd.m4 в директрию сорцов sendmail в cf/hack/
srs-socketmapd в /etc/init.d/srs-socketmapd
srs-socketmapd.0.32rc3.pl в /usr/local/sbin/srs-socketmapd.0.32rc3.pl
делаем симлинк ln -s /usr/local/sbin/srs-socketmapd /usr/local/sbin/srs-socketmapd.0.32rc3.pl
srs-socketmapd.conf в /etc/srs-socketmapd.conf
заводим нового пользователя от когорого будет работать демон
можно, конечно взять и существующего, типа nobody
редактируем /etc/srs-socketmapd.conf
убираем EXAMPLE = yes ;)
пишем секрет (я так и не понял для чего он)
для сокета я создал директорию /var/run/srs/ и сделал ее владельцем этого юзера
соответственно, опция SOCKETPATH=/var/run/srs/srs-socketmapd.sock
ALIAS=forward.mydomain.ru - это то на что меняется адрес
больше ничего не менял.
запускаем демона
/etc/init.d/srs-socketmapd start
проверяем ошибки в /var/log/messages
после успешного запуска демона редактируем конфиг sendmail:
сразу после mailer-ов добавляем строку
перестраиваем sendmail.cf и копируем его в /etc/mail, перезапускаем sendmail
и вроде все
3.обработка напильником
итак, сейчас система настроена на перезапись адресов отправителей от всех
доменов исключая локальные. чтобы узнать какие домены считаются локальными
# echo '$=w' | sendmail -bt
В моем случае пересылающий сервер не отвечал за мой домен mydomain.ru и поэтому
переписывал всех отправителей. Меня это не устраивало. Пришлось исправить
файл cf/hack/srs-socketmapd.m4
красным обозначены мои исправления
(если навести мышь то будут видны пояснения)
не забываем, что правая часть правил отделена от левой не пробелами, а табуляцией
4.To Do
Осталось неосвоенным обратное преобразование адреса.
если получатель недоступен где-то дальше, отлупы об ошибках приходят на
домен forward.mydomain.ru
Было бы здорово их пересылать оригинальному отправителю
UPD Вот для этого и существует сигнатура и ключ в
настройках сервера - при получении почты на домен forward.mydomain.ru
проверяется сигнатура и если обратный адрес подписаный ключем сервера совпадает
с сигнатурой, письмо переправляется оригинальному отправителю