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

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

私は受信した電子メールをディレクトリに保存するためにprocmail単純な規則(以下を参照)を使用します。Maildir/

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

これで、特定のディレクトリ/ルールの新しい電子メールのデスクトップ通知を希望します。通知の処理方法は既にわかっていますが、procmailディレクトリに保存するように指定する方法は?そしてスクリプトを実行しますか?

私もできることを知っています管路a しかし、私はファイルを保存してスクリプトを実行する|commandことを好みます。procmail

電子メール(少なくともヘッダー)をパイプに入れるか、dir +ファイルパスをパラメータとして渡すことは、スクリプトを非同期的に実行するのと同じように良いでしょう。

修正する

したがって、@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の観点から最初に渡してから通知するのは合理的ですが、通知は失敗する可能性があるセカンダリタスクであるため、レプリケーションでこれを実行して終了ステータスを無視します。

最後に、中かっこを使用して条件内で2つの操作をグループ化する方が直感的です。

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

しかし、私はProcmailがすでにcomsatすぐに通知を生成しているという事実も見つけました。これは従来の通知プロトコルですが、一部の目的に使用できます。次に、スクリプトモニタリングを使用して簡単な通知メカニズムを構築できますprocmail.log。 (しかし、ログファイルを解析するのはお勧めできません。)

関連情報