Procmailでメッセージをフィルタリングして配信する方法

Procmailでメッセージをフィルタリングして配信する方法

TO: フィールドに応じて、特定の受信メールの件名を書き換えます。

:0fhw
* ! ^TO_user@domain\.com\>
* ^TO_[^<>@ ]+@domain\.com\>
* ^Subject:\/.+
| /usr/local/bin/formail -I"Subject: [SPAM]$MATCH"

上記のコード(以前の質問からprocmail は、電子メール受信者のユーザーが一致テストに失敗した場合、件名を書き換えます。)は完璧に動作します - それ以外のものからメールを受け取った場合[メールアドレス]件名が[SPAM](元の件名)に書き換えられる

しかし、私はこのように複数の条件を実行したいと思います。上記の作業ブロックは最後のものになりますが、その前に、TO が別のアドレスと一致する場合は件名行を書き換えたいと思います。

そこで、そのすぐ上に次のブロックを追加しました:

:0fh
* ^TO_special@domain\.com
* ^Subject:\/.+
| /usr/local/bin/formail -I"Subject: [SPECIAL]$MATCH"
$DEFAULT

...そしてこれは機能します - '[メールアドレス]' 件名を書き直してもらいます。

問題は、Procmailが止まらず、ブロックして再度書き換えます。そのため、送信された電子メールの[email protected]件名は次のように書き換えられます。

[スパム] [特別] 元の件名 blah blah

これはなぜでしょうか?$DEFAULT最初のブロックの最後のアクションによって、Procmail がその電子メールの処理を停止しないのはなぜでしょうか?

新しいブロックとどのように一致させるか停止そのメールを処理して、それで終わりにしますか?

答え1

末尾の$DEFAULTは構文エラーです。同じレシピに複数のアクションを指定することはできません。

できることは、それを 2 つのレシピに分割することです。または、この場合は、書き直しと配信を単純に組み合わせます。

:0:
* ^TO_special@domain\.com
* ^Subject:\/.+
| /usr/local/bin/formail -I"Subject: [SPECIAL]$MATCH" >>$DEFAULT

これにはフラグがなくなりました。これは、fhメッセージ全体をプッシュする (ヘッダーだけではないh) ため、またパイプラインの結果を Procmail にキャプチャするのではなく (キャプチャする)、配信するためですf

これは、$DEFAULTディレクトリではなくファイルであると想定しているため、:ロックを指定するために 2 番目も追加します。

1 つの条件セットで 2 つのアクションを指定する場合は、中括弧を使用して複数のレシピを含めることができます。各レシピには 0 個以上の条件を含めることができますが、アクションは 1 つだけです。

:0
* ^TO_special@domain\.com
* ^Subject:\/.+
{
    :0fhw
    | formail -I"Subject: [SPECIAL]$MATCH"

    :0:
    $DEFAULT
}

しかし、この場合、それは不必要な複雑化です。

^Subject:(条件を、それが論理的に属するレシピに移動する方がおそらくより慣用的でしょうformailが、これはとにかく余談です。)

PATHまた、余談ですが、の先頭でが正しいことを確認して.procmailrc、 などの外部ユーティリティへの完全なパスを綴らなくて済むようにしてくださいformail

関連情報