![SRSデーモンを使用したexim4の設定](https://rvso.com/image/668767/SRS%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9Fexim4%E3%81%AE%E8%A8%AD%E5%AE%9A.png)
外部 SRS デーモン (Debian パッケージ srs) を使用して exim 4 を設定するのに苦労しています。srsd は実行されており、アドレスの変換は問題なく行われています。exim の組み込み srs コードは Debian で有効になっていないため、使用できません (自分でコンパイルすることはできますが、オプションではありません)。
問題なのは、転送されたメールに SRS タグを追加する exim 内の srs_forward ルーターです。次のリダイレクト ルーターを配置していますが、これは、別の mx に中継されない、ローカル以外の送信者とローカル以外の受信者からのエラーのないメッセージに対してのみ実行されるはずです。少なくとも、srs はそのようなメッセージに適用されるものと理解しています。これが間違っている場合は、訂正してください。次のコードがあります。
srs_forward:
debug_print = "R: srs_forward for $local_part@$domain"
driver = redirect
senders = ! :
condition = ${if ! match_domain{$sender_address_domain}{+local_domains}}
domains = ! +local_domains : ! +relay_to_domains
address_data = ${readsocket{/tmp/srsd}\
{FORWARD $sender_address_local_part@$sender_address_domain $domain\n}\
{5s}{\n}{:defer: SRS daemon failure}}
errors_to = ${quote_local_part:${local_part:$address_data}}@${domain:$address_data}
data = ${quote_local_part:$local_part}@$domain
headers_add = X-SRS: Sender address rewritten from $sender_address to ${quote_local_part:${local_part:$address_data}}@$$
repeat_use = false
allow_defer
no_verify
私がテストして動作できたもの: 戻りパスが正しく生成されます (address_data と errors_to を含む行、および to-address (data で始まる行))。
前提条件がよくわかりません:
senders = ! :
この行により、ルータがエラー メッセージを実行するのを防ぐことができます。
condition = ${if ! match_domain{$sender_address_domain}{+local_domains}}
この行により、ルータがローカル送信者からのメッセージに対して実行されなくなります。
domains = ! +local_domains : ! +relay_to_domains
この行は、ローカル受信者へのメッセージまたは中継されたメッセージに対してルータが実行されないようにする必要があります。
誰か説明してもらえませんか?
(私はマニュアル出発点としては成功しなかったものの。
答え1
適切にテストされていません。SRS デーモンに渡す情報が正しくありません:
FORWARD $sender_address_local_part@$sender_address_domain $domain\n
これはあなたが望むことをしません: $domain には受信者のドメインが含まれており、送信者のドメインは含まれていません。メッセージが転送されたドメインへのリターンパスを書き換えるというあなたの意図は立派ですが、次のようには機能しません: メッセージが SRS ルーターに到達します後転送はすでに完了しているので、$domain にはメッセージが送信されたドメインは含まれません。$primary_hostname または $original_domain を使用する必要があります。したがって、この行は次のようになります。
address_data = ${readsocket{/tmp/srsd}\
{FORWARD $sender_address_local_part@$sender_address_domain $original_domain\n}\
{5s}{\n}{:defer: SRS daemon failure}}
前提条件に関しては、問題ありません。「送信者」と「条件」の行を一緒に取ることができます。
senders = ! : ! *@+local_domains
ドメインリスト local_domains に実際にすべてのローカル ドメインが含まれていることを確認する必要があります (少なくとも、現在ルーティングされているメッセージの $original_domain と $sender_address_domain が含まれている必要があります)。
コードが動作している場合は、設定を文書化して、ここでヒントを提供してください。さらにいくつかのことを準備する必要があります: 着信 SRS タグ付きバウンス メッセージを検証するための ACL、グレーリスト用の SRS タグ付きメールのタグ解除、バウンスのタグ解除、送信メッセージに BATV などの他のタグを追加しないようにすること、大文字と小文字が区別されない SRS タグ付きメッセージを受け入れる回避策、SRS タグ付き送信者アドレスを含まないようにバウンス エラー メッセージ テキストを書き換えること、タグなしバウンスを拒否することなど。そのため、優れたチュートリアルがありがたいです。ありがとうございます!