Я изо всех сил пытаюсь настроить exim 4 с помощью внешнего демона SRS (пакет Debian srs). Srsd работает и конвертирует адреса назад и вперед просто отлично. Я не могу использовать встроенный в exim код srs, так как он не включен в Debian (я знаю, что могу скомпилировать сам, но это не вариант).
У меня проблемы с маршрутизатором srs_forward в exim, который добавляет теги SRS к пересылаемым письмам. У меня есть следующий маршрутизатор перенаправления, который должен работать только для сообщений об ошибках от нелокальных отправителей и нелокальных получателей, которые не ретранслируются для другого mx - по крайней мере, я понимаю, что srs следует применять к таким сообщениям. Пожалуйста, поправьте меня, если это не так. У меня такой код:
srs_forward:
debug_print = "R: srs_forward for $local_part@$domain"
driver = redirect
senders = ! :
condition = ${if ! match_domain{$sender_address_domain}{+local_domains}}
domains = ! +local_domains : ! +relay_to_domains
address_data = ${readsocket{/tmp/srsd}\
{FORWARD $sender_address_local_part@$sender_address_domain $domain\n}\
{5s}{\n}{:defer: SRS daemon failure}}
errors_to = ${quote_local_part:${local_part:$address_data}}@${domain:$address_data}
data = ${quote_local_part:$local_part}@$domain
headers_add = X-SRS: Sender address rewritten from $sender_address to ${quote_local_part:${local_part:$address_data}}@$$
repeat_use = false
allow_defer
no_verify
Что я мог проверить и работает: обратный путь создается правильно (строки с address_data и errors_to, а также адрес получателя (строка, начинающаяся с данных).
Я не уверен в предварительных условиях:
senders = ! :
Эта строка должна предотвратить запуск маршрутизатора для сообщений об ошибках.
condition = ${if ! match_domain{$sender_address_domain}{+local_domains}}
Эта строка должна предотвратить запуск маршрутизатора для сообщений от локальных отправителей.
domains = ! +local_domains : ! +relay_to_domains
Эта строка должна предотвращать запуск маршрутизатора для сообщений локальным получателям или для ретранслируемых сообщений.
Не мог бы кто-нибудь уточнить?
(Я использовал руководство в качестве отправной точки, хотя безуспешно.)
Вы не проверили должным образом. Ваша информация, которую вы передаете демону SRS, неверна:
FORWARD $sender_address_local_part@$sender_address_domain $domain\n
Это не делает того, что вы хотите: $ domain содержит домен получателя, а не домен отправителя. Ваше намерение переписать обратный путь к домену, которым было переадресовано сообщение, достойно уважения, но не работает так: сообщение попадает в ваш маршрутизатор SRS после перенаправление уже выполнено, поэтому $ domain больше не содержит домен, на который было отправлено сообщение. Вы должны использовать $ primary_hostname или $ original_domain. Итак, эта строка должна выглядеть так:
address_data = ${readsocket{/tmp/srsd}\
{FORWARD $sender_address_local_part@$sender_address_domain $original_domain\n}\
{5s}{\n}{:defer: SRS daemon failure}}
Что касается ваших предварительных условий, то они в порядке. Вы можете взять строки «отправители» и «условие» вместе:
senders = ! : ! *@+local_domains
Вам просто нужно убедиться, что список доменов local_domains действительно содержит все ваши локальные домены (по крайней мере, он должен содержать для текущего маршрутизируемого сообщения $ original_domain и $ sender_address_domain).
Пожалуйста, задокументируйте свою конфигурацию, если ваш код работает, и дайте нам здесь несколько советов. Вам необходимо организовать еще несколько вещей: списки управления доступом для проверки входящих сообщений с метками SRS, отключение тегов сообщений с тегами SRS для серых списков, отключение меток отказов, убедитесь, что не добавлены какие-либо другие теги, такие как BATV, к исходящим сообщениям, работа для принятия сообщений с тегами SRS с разбитый случай, перепишите текст сообщения об ошибке возврата, чтобы он не включал помеченный адрес отправителя SRS, возможно, запретите любые неотмеченные сообщения возврата и т. д. Так что хороший учебник будет признателен. Спасибо!