我根據「收件者:」欄位重寫某些傳入郵件的主題行:
:0fhw
* ! ^TO_user@domain\.com\>
* ^TO_[^<>@ ]+@domain\.com\>
* ^Subject:\/.+
| /usr/local/bin/formail -I"Subject: [SPAM]$MATCH"
上面的程式碼(來自我之前的問題如果電子郵件收件者使用者未通過配對測試,procmail 會重寫主旨行)工作完美 - 如果我收到來自其他地方的郵件[電子郵件受保護],主題行被重寫為[SPAM](原始主題)
但我想做這樣的多個條件 - 上面的工作區塊將是最後一個,但在此之前,如果 TO 匹配不同的地址,我想重寫主題行。
所以我在它上面添加了這個塊:
:0fh
* ^TO_special@domain\.com
* ^Subject:\/.+
| /usr/local/bin/formail -I"Subject: [SPECIAL]$MATCH"
$DEFAULT
....這有效 - 電子郵件發送至 '[電子郵件受保護]' 重寫他們的主題行。
問題是,Procmail 並沒有停止 - 它轉移到下一個阻塞並再次重寫。因此,發送的電子郵件[email protected]
將其主題行重寫為:
[垃圾郵件] [特別] 原始主題行等等等等
為什麼是這樣?為什麼$DEFAULT
第一個區塊末尾的操作不會導致 Procmail 停止處理該電子郵件?
我怎麼能匹配新的塊和停止處理完那封郵件就可以了?
答案1
最後$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
.