![Exim:“开始验证器”部分中是否可以有多个验证器,每个 smtp 中继一个?](https://linux22.com/image/761757/Exim%EF%BC%9A%E2%80%9C%E5%BC%80%E5%A7%8B%E9%AA%8C%E8%AF%81%E5%99%A8%E2%80%9D%E9%83%A8%E5%88%86%E4%B8%AD%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E6%9C%89%E5%A4%9A%E4%B8%AA%E9%AA%8C%E8%AF%81%E5%99%A8%EF%BC%8C%E6%AF%8F%E4%B8%AA%20smtp%20%E4%B8%AD%E7%BB%A7%E4%B8%80%E4%B8%AA%EF%BC%9F.png)
我的 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
包含以下客户端身份验证器:
- 从文件中读取密码
/etc/exim4/passwd.client
,因此密码不在 Exim 的配置中。该文件的格式是每台服务器一行,格式如下<servername>:<username>:<password>
, - 根据主持人选择密码,
- 经过充分测试,因此您不必测试 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}}