procmail
とMaildir/
を使用し、次のような簡単なルールを使用して、受信メールをディレクトリに保存しています。
:0:
* ^X-Spam-Status: Yes
Spam/
特定のディレクトリ/ルールの新着メールでデスクトップ通知が欲しいのですが、通知を処理する方法はすでに知っていますが、procmail
にディレクトリに保存するように指示する方法そしてスクリプトを実行しますか?
|command
をpipeできることはわかっていますが、procmail
にファイルを保存させてから、スクリプトを実行することをお勧めします。 。
電子メール(少なくともヘッダー)をパイプまたはdir + fileパスに引数として含めると、スクリプトを非同期で実行することもできます。
更新
したがって、@ slmの回答に基づくと、次のようになります。
:0 c:
* ^X-Spam-Status: Yes
Spam/
:0 Whi
* ^X-Spam-Status: Yes
| $HOME/install/bin/notify.sh
c
copyディレクトリ内のメッセージですが、次のルールに進みます
フィルターではないのでf
を使用していません。ルールが一致する場合は、procmailをここで停止します(ここでマニュアルを誤解していないことを願っています)
W
は、プログラムの失敗を抑制します
h
topipeヘッダーのみ
i
パイプへの書き込みエラーを無視します
スクリプトが返されるのを待ちたくないので、私はw
を使用していません
私もロックファイルは必要ないと思います(Whi
の後に:
はありません)
更新12/5/14
結局、私は@tripleeeが提案したソリューションを正確に採用しました。
あきらめる前に、mailutils-comsatd
で数分間遊んだ。
.procmailrc:
COMSAT=no
これは@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つのルールを使用してルールを変更できます。
: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プロセスが複製され(ロックファイルは継承されません)、クローンは通常どおり続行され、親ブロックを飛び越えます。