Procmail 變數和配方語法
我正在嘗試理解 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
LOGFILE
orLOCKFILE
orSENDMAIL
將對 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 - 雖然這些都過時了,但希望它們幫助解決您未來的一些問題。