複数行ヘッダーとキャプチャグループを使用した Postfix header_checks

複数行ヘッダーとキャプチャグループを使用した Postfix header_checks

「クリーンアップ」プロセスに渡される header_checks 正規表現がありますが、ヘッダーが複数行にある場合、ヘッダーは単一のヘッダーとして処理されません。

header_check (ヘッダーの値をFILTERに渡す):

/^X-OurHeader:\s+(.*?)/ FILTER $1

マスター.cf:

cleanup_service.        unix  n       -       y       -       0       cleanup
  -o header_checks=regexp:/etc/postfix/header_check

失敗する複数行ヘッダーの例:

X-OurHeader: a_special_filter_command:my.sub.domain
 b.mail.whatever.com

複数行になる前の元の完全なヘッダーは次のとおりです。

X-OurHeader: a_special_filter_command:my.sub.domainb.mail.whatever.com

FILTER に渡される結果は次のようになります。2a_special_filter_command:my.sub.domain 行目の残りのホスト名が欠落していますb.mailwhatever.com

代わりに header_check を次のように変更すると、次の行がキャプチャされます。

/^X-OurHeader:\s+([\s\S]*)/ FILTER $1

$1 キャプチャ グループには 2 行目が含まれますが、キャプチャされたテキストにもまだスペース (およびおそらく改行) が含まれているため、これは機能しません。次のようになります。

X-OurHeader: a_special_filter_command:my.sub.domain b.mail.whatever.com

最初のアプローチのログを見ると、

postfix/cleanup[123456]: 27429A1FE8: filter: header X-OurHeader: a_special_filter_command:my.sub.domain? b.mail.whatever.com

これに対する代替アプローチを提案していただけますか? 最終目標は、FILTER に送信する必要のある特別な cmd:hostname 値でヘッダーにタグを付けることであり、長いヘッダーが「長さは 78 未満である必要がある」という標準を満たすように、hdr 値を複数行に分割できるようにサポートしたいと考えています。

答え1

バリエーションの数が一定数しかないことがわかっている場合、または確実にわかっている場合は、それらを個別にキャッチするための追加の表現を追加します/..:(.*) (.*)$/ -> /..:$1$2/。スペースがない場合、接尾辞は次の表現に続くため、複雑な一致を最初に置いてパターンをシンプルに保ちます。


そうでなくても正規表現の力の範囲内で、複数の検索を連鎖する頭の中ですべてをまとめることはできませんが、ディストリビューションで利用可能で、動作するのであれば、ドキュメントが役立つはずです。header_checksマニュアルとファイルから始めてください。DATABASE_README

pipemap:{pcre:/extract/category.pcre,pcre:/map/category/to/filter/command.pcre}

基本的な考え方: まず一般的な方向 (例 ) を取得し、その後で必要な編集を適用して有効な postfix コマンドにします。すべての入力が有効な出力 (およびフォールバック行-> )MYFILTER: $1につながることを慎重に確認します。MYFILTER: (valid1|valid2) -> FILTER host:portMYFILTER:FILTER: default:port


それができない場合、通常、正規表現や header_checks では強力すぎることを実行したいときは、チューリング完全性にエスカレートします。

  1. 十分に動的な検索。たとえば、SQL が好きなら、それほど読みにくく保守しにくいものにはならないはずです。複数の検索による意図しない論理結果に注意してください。header_checks = sqlite:/path/to/definition.conf pcre:/remaining/simpler/rules.pcre

  2. milter/policy デーモン。メッセージをまったくリダイレ​​クトせずに外部バイナリを呼び出すこともできます。次の FILTER の現在のアイデアのインターフェイスに応じて、これは多かれ少なかれ便利になる場合があります。


また、postfixを正しく取得する方法もあると思います輸送必要に応じて、特定のメッセージを header_checks の複数のインスタンスに渡すことができますが、この方法は他の (多かれ少なかれ動的な) ルーティング決定とうまく混在しないため、お勧めしません。

関連情報