我的 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-condition 來選擇一組使用者名稱:密碼進行身份驗證。但你需要「條件」來選擇先使用哪個繼電器。
例如,對於發送至[電子郵件受保護]將使用透過 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}}