Exim: Может ли быть несколько аутентификаторов в разделе «Начальные аутентификаторы», по одному для каждого SMTP-реле?

Exim: Может ли быть несколько аутентификаторов в разделе «Начальные аутентификаторы», по одному для каждого SMTP-реле?

Мой exim перенаправляет всю входящую почту на сторонние smtp-реле. Они используют smtp-аутентификацию (имя пользователя/пароль).

Кажется, я могу определить только ОДНО имя пользователя/пароль в begin authenticatorsразделе конфигурации Exim. Я хочу направить определенное письмо через один ретранслятор (с его собственным именем пользователя/паролем аутентификации), а другое письмо через второй ретранслятор (его имя пользователя/пароль аутентификации отличается от первого).

Вот большая часть моей конфигурации. begin routersДомены в +local_domainsсписке ретранслируются на , smtp-relay-1а остальные ретранслируются на smtp-relay-2.

begin routers

my_domains_relay:
  debug_print = "R: my_domains_relay for $local_part@$domain"
  driver = manualroute
  domains = +local_domains
  transport = remote_smtp_smarthost
  route_list = * "<+ smtp-relay-1.example.com:465"
  host_find_failed = defer
  no_more

smart_host_relay:
  debug_print = "R: smart_host_relay for $local_part@$domain"
  driver = manualroute
  transport = remote_smtp_smarthost
  route_list = * "<+ smtp-relay-2.example.net:465"
  host_find_failed = defer
  no_more

begin transports

remote_smtp_smarthost:
  debug_print = "T: remote_smtp_smarthost for $local_part@$domain"
  driver = smtp
  port = 465
  hosts_require_tls = *
  hosts_require_auth = *
  protocol = smtps

begin authenticators

login:
  driver = plaintext
  public_name = PLAIN
  client_send = ^my-username^top-secret-password

Я хочу определить отдельные имя пользователя/пароль аутентификации в begin authenticatorsразделе и назначить каждый на один маршрутизатор/транспорт. Прямо сейчас имя пользователя/пароль аутентификации является глобальным и используется для всех реле.

В документации exim говорится, что он сопоставляет public_name с объявленной аутентификацией сервером. Так что если оба моих smtp-реле объявляют как, AUTH PLAINто они оба используют это имя пользователя/пароль аутентификатора в конфигурации. Я надеюсь, что есть настройка, которая позволяет мне связать экземпляр аутентификатора с определенным маршрутизатором/транспортом, но я не вижу, как это сделать.

решение1

Вы можете использовать client_conditionопцию аутентификатора (см.Раздел SMTP-аутентификацияруководства).

Exim принимает максимум два аутентификатора для данного публичного имени: аутентификатор на стороне клиента и аутентификатор на стороне сервера.

Однако функциональность, которую вы ищете, уже есть в конфигурации Debian по умолчанию: загрузитеexim4-конфигурацияупакуйте и извлеките файлы (это arархив, содержащий два tarархива).

Файл /etc/exim4/conf.d/auth/30_exim4-config_examplesсодержит клиентские аутентификаторы, которые:

  1. прочитать пароль из /etc/exim4/passwd.clientфайла, так что пароль не в конфигурации Exim. Формат файла - строка на сервер в формате <servername>:<username>:<password>,
  2. выберите пароль в соответствии с хостом,
  3. хорошо протестированы, поэтому вам не придется тестировать строковые расширения Exim.

Конфигурация Debian сводится к следующему клиентскому аутентификатору:

# this returns the matching line from passwd.client and doubles all ^
PASSWDLINE=${sg{\
                ${lookup{$host}nwildlsearch{CONFDIR/passwd.client}{$value}fail}\
                }\
                {\\N[\\^]\\N}\
                {^^}\
            }

plain:
  driver = plaintext
  public_name = PLAIN
.ifndef AUTH_CLIENT_ALLOW_NOTLS_PASSWORDS
  client_send = "<; ${if !eq{$tls_out_cipher}{}\
                    {^${extract{1}{:}{PASSWDLINE}}\
                     ^${sg{PASSWDLINE}{\\N([^:]+:)(.*)\\N}{\\$2}}\
                   }fail}"
.else
  client_send = "<; ^${extract{1}{:}{PASSWDLINE}}\
                    ^${sg{PASSWDLINE}{\\N([^:]+:)(.*)\\N}{\\$2}}"
.endif

решение2

В том же аутентификаторе вы можете использовать условие if для выбора набора username:password для аутентификации. Но вам нужно "условие", чтобы выбрать, какое реле будет использоваться первым.

Например, для отправки почты на адрес[email protected]будет использовать smtp-relay-1.example.com, аутентифицированный по my-username:top-secret-password, и[email protected]будет использовать smtp-relay-2.example.com, аутентифицированный по my-username2:top-secret-password2

Маршрутизаторы и транспорты будут теми же.

begin routers

my_domains_relay:
  debug_print = "R: my_domains_relay for $local_part@$domain"
  driver = manualroute
  domains = +local_domains
  transport = remote_smtp_smarthost
  route_list = * "<+ smtp-relay-1.example.com:465"
  host_find_failed = defer
  no_more

smart_host_relay:
  debug_print = "R: smart_host_relay for $local_part@$domain"
  driver = manualroute
  transport = remote_smtp_smarthost
  route_list = * "<+ smtp-relay-2.example.net:465"
  host_find_failed = defer
  no_more

begin transports

remote_smtp_smarthost:
  debug_print = "T: remote_smtp_smarthost for $local_part@$domain"
  driver = smtp
  port = 465
  hosts_require_tls = *
  hosts_require_auth = *

Аутентификаторы необходимо изменить на что-то вроде этого

begin authenticators

login:
  driver = plaintext
  public_name = PLAIN
  client_send = ^${if   eq{$domain}{domain1.com}\
                        {my-username}\
                        {my-username2}}\
                ^${if   eq{$domain}{domain1.com}\
                        {top-secret-password}\
                        {top-secret-password2}}

Связанный контент