如何在 Procmail 中過濾和發送郵件

如何在 Procmail 中過濾和發送郵件

我根據「收件者:」欄位重寫某些傳入郵件的主題行:

: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.

相關內容