如何在 Procmail 中過濾和傳遞消息
我根據 TO: 欄位重寫某些傳入郵件的主題行:
:0fhw * ! ^TO_user@domain\.com\> * ^TO_[^<>@ ]+@domain\.com\> * ^Subject:\/.+ | /usr/local/bin/formail -I"Subject: [SPAM]$MATCH"
上面的程式碼(來自我之前的問題procmail rewrite subject line if email recipient user failed match test)工作得很好——如果我從 user@domain.com 以外的地方收到郵件,主題行被重寫為
$$ SPAM $$(原題) 但我想做多個這樣的條件 - 上面的工作塊將是最後一個,但在此之前,如果 TO 匹配不同的地址,我想重寫主題行。
所以我在它上面添加了這個塊:
:0fh * ^TO_special@domain\.com * ^Subject:\/.+ | /usr/local/bin/formail -I"Subject: [SPECIAL]$MATCH" $DEFAULT
…這很有效 - 發送到“special@domain.com”的電子郵件會重寫其主題行。
問題是,Procmail 不會停止——它會移動到下一個塊並再次重寫它。因此,發送電子郵件以
special@domain.com
將其主題行重寫為:$$ SPAM $$ $$ SPECIAL $$原始主題行等等 為什麼是這樣?
$DEFAULT
為什麼第一個塊末尾的操作不會導致 Procmail 停止處理那封電子郵件?我怎樣才能匹配新塊並停止處理那封郵件並完成它?
最後
$DEFAULT
是語法錯誤。您不能在同一個配方上指定多個操作。你能做的就是把它分成兩個食譜;或者,在這種情況下,只需將重寫和傳遞結合起來。
:0: * ^TO_special@domain\.com * ^Subject:\/.+ | /usr/local/bin/formail -I"Subject: [SPECIAL]$MATCH" >>$DEFAULT
這不再有
fh
標誌,因為我們希望將整個消息推送通過(不僅僅是標題h
),並且我們希望傳遞,而不是將管道的結果擷取回 Procmail(f
確實如此)。這假設它
$DEFAULT
是一個文件,而不是一個目錄;因此我們還添加了第二個:
來指定鎖定。如果您想在一組條件下指定兩個操作,您可以使用帶有多個配方的大括號。每個配方可以有零個或多個條件,但只有一個動作。
:0 * ^TO_special@domain\.com * ^Subject:\/.+ { :0fhw | formail -I"Subject: [SPECIAL]$MATCH" :0: $DEFAULT }
但在這種情況下,這是一個不必要的並發症。
^Subject:
(將條件移動到它在邏輯上屬於的配方可能也更慣用formail
,但無論如何這只是一個切線。)同樣切線,也許確保您
PATH
在您的開頭是正確的,.procmailrc
這樣您就可以避免拼出外部實用程序的完整路徑,例如formail
.