Email

如何在 Procmail 中過濾和傳遞消息

  • April 28, 2022

我根據 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.

引用自:https://serverfault.com/questions/1099525