Exim:“开始验证器”部分中是否可以有多个验证器,每个 smtp 中继一个?

Exim:“开始验证器”部分中是否可以有多个验证器,每个 smtp 中继一个?

我的 exim 将所有收到的电子邮件转发到第三方 smtp 中继。他们使用 smtp 身份验证(用户名/密码)。

似乎我只能在begin authenticatorsExim 配置部分中定义一个用户名/密码。我想通过一个中继(使用自己的用户名/密码验证)路由某些电子邮件,并通过第二个中继(其用户名/密码验证与第一个不同)路由其他电子邮件。

这是我的大部分配置。列表begin routers中的域中继+local_domainssmtp-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 条件来选择一组用户名:密码进行身份验证。但您需要“条件”来选择首先使用哪个中继。

例如,对于邮件发送至[电子邮件保护]将使用通过 my-username:top-secret-password 进行身份验证的 smtp-relay-1.example.com,并且[电子邮件保护]将使用通过 my-username2:top-secret-password2 进行身份验证的 smtp-relay-2.example.com

路由器和传输将相同

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}}

相关内容