Linux

Procmail 變數和配方語法

  • June 26, 2018

我正在嘗試理解 procmailrc 語法。從我讀過的文件中,我可以使用 VARNAME=value 設置我自己的變數,然後通過引用 $VARNAME 在其他地方使用它們

我也了解食譜將郵件輸入過濾到不同的操作(處置)

我有一個帶有單個配方和 2 個變數的 procmailrc,如下所示:

SUBJECT='formail -xSubject:'
FROM='formail -rt -xTo:'

:0:
* !^From:.gmail\.com
| (formail) | $SENDMAIL -t -oi
archive

我是否正確地說在這種情況下變數 SUBJECT 和 FROM 是無關緊要的,因為它們沒有在文件中的其他任何地方使用?

另外,我不擅長正則表達式,但從我從文件(procmail 和正則表達式)中讀到的內容來看,我是否正確地說配方過濾了沒有“From:Xgmail.com”的郵件, X 是什麼字元?即如果電子郵件有“郵件發件人:”,它不會被這個配方過濾,但如果電子郵件有“郵件發件人:”,那麼它會被過濾掉嗎?

另外,在最後第二行,如果 formail 沒有任何參數,那麼它將響應郵件發送到哪裡,內容是什麼?有沒有預設值?

最後,最後一行是否表示將郵件的副本放在郵件目錄的“存檔”文件中?

謝謝!

首先,您的範例包含語法錯誤。一個配方可以只包含一個動作。實際上,您的食譜將有效地解析為

:0:
* !^From:.gmail\.com
| (formail) | $SENDMAIL -t -oi

archive=''

由於 Procmail 無法為管道操作找出鎖定文件,您還將獲得“被忽略的無關本地鎖定文件”。

如果您想要一個配方的兩個操作,請使用大括號:

:0
* !^From:.gmail\.com
{
 :0c
 | (formail) | $SENDMAIL -t -oi
 :0:
 archive
}

大括號內第一個配方上的c標誌表示“這不是最終傳遞”;預設情況下,Procmail 將在視為已傳遞時停止處理消息。

還要注意單引號和反引號之間的區別。您的作業會創建包含引號之間文本的變數。大概你的意思是

SUBJECT=`formail -xSubject:`  # not SUBJECT='formail -xSubject:'
FROM=`formail -rt -xTo:`  # not FROM='formail -rt -xTo:'

事實上,如果你從不將這些變數用於任何事情,那麼分配它們是沒有意義的(儘管還有其他變數對 Procmail 來說是特殊的,所以分配 eg LOGFILEor LOCKFILEorSENDMAIL將對 Procmail 的操作產生影響)。

formail沒有參數只是將標準輸入傳遞給標準輸出,並進行一些標頭規範化。我不認為它在這裡執行任何有用的功能。命令周圍的括號會導致它在單獨的 shell 中執行,這也是毫無意義且效率低下的。

再次發送消息sendmail -t將創建一個郵件循環,因此如果您處理的消息不能明確保證被編入目前地址,您可能根本不想執行此操作Bcc:,例如(在這種情況下,消息將發送給標題中可見的收件人,但不會再次發送給您;因此,沒有郵件循環)。

^則表達式中的 將搜尋錨定到行首,因此之前不能有其他文本From:,並且未轉義的點匹配除換行符以外的任何字元,就像你解釋的那樣;一個更好的正則表達式可能^From:(.*\<)?gmail\.com至少要求之前有一個非單詞字元gmail.com(但這不是一個有效的電子郵件地址,所以也許我無法正確猜測你希望完成什麼)。最後,就像您已經知道的那樣,驚嘆號否定正則表達式,因此當正則表達式不匹配時,配方會觸發。

也許您已經找到http://www.iki.fi/era/procmail/quickref.html>和<http://www.iki.fi/era/mail/procmail-debug.html - 雖然這些都過時了,但希望它們幫助解決您未來的一些問題。

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