私は、次のような簡単なルールを使用して、受信メールをディレクトリに保存していますprocmail
。Maildir/
: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
代わりに監視するスクリプトを使用して、シンプルな通知メカニズムを構築できます。(ただし、ログ ファイルの解析は面倒です。)