web-dev-qa-db-ja.com

procmailはdirに保存し、スクリプトを実行しますか?

procmailMaildir/を使用し、次のような簡単なルールを使用して、受信メールをディレクトリに保存しています。

:0:
* ^X-Spam-Status: Yes
Spam/

特定のディレクトリ/ルールの新着メールでデスクトップ通知が欲しいのですが、通知を処理する方法はすでに知っていますが、procmailにディレクトリに保存するように指示する方法そしてスクリプトを実行しますか?

|commandpipeできることはわかっていますが、procmailにファイルを保存させてから、スクリプトを実行することをお勧めします。 。

電子メール(少なくともヘッダー)をパイプまたはdir + fileパスに引数として含めると、スクリプトを非同期で実行することもできます。

更新

したがって、@ slmの回答に基づくと、次のようになります。

:0 c:
* ^X-Spam-Status: Yes
Spam/

:0 Whi
* ^X-Spam-Status: Yes
| $HOME/install/bin/notify.sh

ccopyディレクトリ内のメッセージですが、次のルールに進みます

フィルターではないのでfを使用していません。ルールが一致する場合は、procmailをここで停止します(ここでマニュアルを誤解していないことを願っています)

Wは、プログラムの失敗を抑制します

h topipeヘッダーのみ

iパイプへの書き込みエラーを無視します

スクリプトが返されるのを待ちたくないので、私はwを使用していません

私もロックファイルは必要ないと思います(Whiの後に:はありません)

更新12/5/14

結局、私は@tripleeeが提案したソリューションを正確に採用しました。

あきらめる前に、mailutils-comsatdで数分間遊んだ。

.procmailrc:

COMSAT=no
2
Alex

これは@slmの答えを少し変更したものです。

Maildirでロックを使用するべきではなく、フラグとロックコロンが間違った方法でした。 (メッセージのクローンを作成するのではなく、cという名前のロックファイルを効果的に作成するため、2番目のアクションは実行されません。)

fフラグは適切ではないようです。

アクションの順序を逆にしました。 Procmailの観点からは、配信してから通知することは理にかなっていますが、通知は失敗することが許可されている2次アクションであるため、クローンでそれを行い、その終了ステータスを無視します。

最後に、1つの条件で2つのアクションをグループ化することは、中括弧を使用する方が直感的です。

:0
* ^X-Spam-Status: Yes
{
    :0cWhi
    | $HOME/install/bin/notify.sh
    :0
    Spam/
}

そうは言っても、Procmailはすでにcomsat通知をすぐに生成していることにも注意してください。これは従来の通知プロトコルですが、何かに使用できる可能性があります。次に、代わりにprocmail.logを監視するスクリプトを使用して簡単な通知メカニズムを構築できます。 (しかし、ええ、ログファイルの解析は最悪です。)

2
tripleee

スクリプトを介してメールを実行するには、次の2つのルールを使用してルールを変更できます。

:0: c
* ^X-Spam-Status: Yes
Spam/

:0: fw
* ^X-Spam-Status: Yes
| /usr/bin/python /work/scripts/process_mail.bash

プログラムはSTDINでメールを受信します。 STDOUTで変換された可能性のあるメールを「エコー」する必要があります。

fwの意味:

  • fパイプをフィルターと見なします。
  • wフィルターまたはプログラムが終了するのを待ち、その出口コードを確認します(通常は無視されます)。フィルタが失敗した場合、テキストはフィルタリングされていません。
  • cこのメールのカーボンコピーを生成します。これは、レシピを提供する場合にのみ意味があります。このフラグが影響する唯一の非配信レシピは、ネストブロックにあります。カーボンコピーを生成するために、実行中のprocmailプロセスが複製され(ロックファイルは継承されません)、クローンは通常どおり続行され、親ブロックを飛び越えます。

参考文献

4
slm