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,而不是複製訊息,因此第二個操作永遠不會觸發。)

旗幟f似乎不太合適。

我顛倒了動作的順序;雖然先傳遞然後通知是有意義的,但從 Procmail 的角度來看,通知是允許失敗的次要操作,因此我在克隆中執行此操作並忽略其退出狀態。

最後,使用大括號將一個條件下的兩個運算分組更為直觀。

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

話雖如此,我還注意到 Procmail 已經產生了comsat開箱即用的通知。這是一個遺留的通知協議,但您也許可以將它用於某些用途。其次,可以使用監視您的腳本來建立一個簡單的通知機制procmail.log。 (但是,解析日誌檔案很糟糕。)

相關內容