procmail はディレクトリに保存してスクリプトを実行しますか?

procmail はディレクトリに保存してスクリプトを実行しますか?

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

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

今、特定のディレクトリ/ルール内の新しいメールについてデスクトップ通知をしたいのですが、通知の処理方法は既にわかっていますが、procmailディレクトリに保存する方法を指示する方法がわかりません。そしてスクリプトを実行しますか?

自分ができるということがわかっているパイプただし、ファイルを保存してからスクリプトを実行する|command方が望ましいです。procmail

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

アップデート

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

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

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

c コピーディレクトリ内のメッセージはそのまま次のルールに進みます

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

Wプログラムの障害を抑制する

hパイプヘッダーのみ

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

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

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

2014年12月5日更新

結局、私は @tripleee が提案した解決策をそのまま採用しました。

mailutils-comsatd諦める前に数分間も遊んでみました。

.procmailrc:

COMSAT=no

答え1

スクリプトを使用してメールを実行するには、次の 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 プロセスを複製します (ロック ファイルは継承されません)。複製は通常どおりに進行し、親はブロックを飛び越えます。

参考文献

答え2

以下は @slm の回答を少し改変したものです。

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

そのf旗は場違いなようです。

アクションの順序を逆にしました。Procmail の観点からは、配信してから通知するのが理にかなっています。ただし、通知は失敗してもかまわない二次アクションなので、クローン内で実行し、終了ステータスを無視します。

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

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

そうは言っても、Procmail は既にすぐにcomsat通知を生成できることにも気付きました。これはレガシー通知プロトコルですが、何かに使用できるかもしれません。次に、procmail.log代わりに監視するスクリプトを使用して、シンプルな通知メカニズムを構築できます。(ただし、ログ ファイルの解析は面倒です。)

関連情報