私の exim は、すべての受信メールをサードパーティの SMTP リレーに中継します。SMTP 認証 (ユーザー名/パスワード) を使用します。
Exim 構成のセクションでは、1 つのユーザー名/パスワードしか定義できないようですbegin authenticators
。特定の電子メールを 1 つのリレー (独自のユーザー名/パスワード認証を使用) 経由でルーティングし、他の電子メールを 2 番目のリレー (ユーザー名/パスワード認証は最初のものと異なります) 経由でルーティングしたいと考えています。
これが私の設定の大部分です。リスト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 つの認証子のユーザー名/パスワードを使用します。認証子のインスタンスを特定のルーター/トランスポートにリンクできる設定があることを期待していますが、方法がわかりません。
答え1
認証オプションを使用できますclient_condition
(cf.セクションSMTP認証マニュアルの)。
Exim は、指定されたパブリック名に対して、クライアント側認証子とサーバー側認証子の 2 つの認証子まで受け入れます。
しかし、あなたが求めている機能はDebianのデフォルト設定にすでに含まれています。exim4 設定ファイルをパッケージ化して抽出します ( ar
2 つのアーカイブを含むアーカイブですtar
)。
ファイルには、/etc/exim4/conf.d/auth/30_exim4-config_examples
次のクライアント認証子が含まれています。
- ファイルからパスワードを読み込む
/etc/exim4/passwd.client
ため、パスワードはEximの設定には含まれません。ファイルの形式は、サーバーごとに1行で<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}}