我使用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
,而不是複製訊息,因此第二個操作永遠不會觸發。)
旗幟f
似乎不太合適。
我顛倒了動作的順序;雖然先傳遞然後通知是有意義的,但從 Procmail 的角度來看,通知是允許失敗的次要操作,因此我在克隆中執行此操作並忽略其退出狀態。
最後,使用大括號將一個條件下的兩個運算分組更為直觀。
:0
* ^X-Spam-Status: Yes
{
:0cWhi
| $HOME/install/bin/notify.sh
:0
Spam/
}
話雖如此,我還注意到 Procmail 已經產生了comsat
開箱即用的通知。這是一個遺留的通知協議,但您也許可以將它用於某些用途。其次,可以使用監視您的腳本來建立一個簡單的通知機制procmail.log
。 (但是,解析日誌檔案很糟糕。)