2013-08-20 71 views
0

我用的procmail轉發某些「從」到Gmail帳戶的Procmail發送一個額外的電子郵件

/home/user/.procmailrc

:0c 
* !^FROM_MAILER 
* ^From: .*aaa | bbb | ccc.* 
! ^X-Loop: [email protected]\.com 
| formail -k -X "From:" -X "Subject:" \ 
-I "To: [email protected]" \ 
-I "X-Loop: [email protected]" 
:0 
* ^From: .*aaa | bbb | ccc.* 
$DEFAULT 

這工作得很好,但在我的服務器收件箱我也得到一個 '未交付' 郵件

所述郵件系統< 「^ X-循環:」 @ my-name-server.com>(來自 <膨脹 「^ X-循環:」>):未知的用戶: 「^ x-loop:」

我該如何避免這種情況?

我試着刪除這些郵件。 這不是最好的方法。

無論如何它不工作。

:0B * <"\^X-Loop:"@my-name-server.com> 
/dev/null 

回答

2

配方包含多個語法錯誤,但反彈消息傳出因爲你缺乏的條件行的一個星號,這使得它的作用線代替。

一個procmail的配方的一般語法是

:0flags  # "prelude", with optional flags 
* condition # optional, can have zero conditions 
* condition # ... 
action 

action的可以是一個郵箱名,或!後跟一個目標郵箱將所述消息轉發到,或|後跟一個殼管道。

所以,你的第一個配方是「如果不從郵件和匹配來源:...,期待^X-Loop:

後的| formail ...線則只需一個語法錯誤和忽略,因爲它需要跟從。前奏線:0和(可選地)一些條件線。

另外,^From:正則表達式顯然是錯誤的。這將匹配From: .*aaabbb(在兩側上的空間,在任何報頭,而不只是From:報頭)或ccc

最後,意圖顯然是要將結果消息轉發到某處。

:0c 
* ! ^FROM_MAILER 
* ^From:(.*\<)?(aaa|bbb|ccc) 
* ! ^X-Loop: [email protected]\.com 
| formail -I "X-Loop: [email protected]" | $SENDMAIL $SENDMAILFLAGS [email protected] 

如果您只是想轉發收到的消息,其他-X-I肯定-k選項是多餘的或錯誤的。如果他們確實完成了與這個問題無關的事情,也許你需要添加一些或全部回來(並且還記得用-X提取任何新的頭文件,用-I加上,否則它們會被壓制;這很糟糕)。

你的第二個食譜也是多餘的,除非你在文件後面有更多的Procmail食譜,這些食譜應該專門繞過這些消息。 (如果是這樣,您還需要修正From:正則表達式。)

+0

。*(aaa | bbb | ccc)。*這意味着'包含其中之一'?...您建議(。* \ < )?(aaa | bbb | ccc)這意味着'開始於 dstonek

+1

正則表達式「(。* \ <)?'的意思是」任何事物,只要它結束於一個字邊界「(在'字符邊界'中,'\ <'成功了,在Procmail的正則表達式中等等)。所以是的,這基本上轉換爲「From:header包含aaa或bbb或ccc中的一個,不嵌入更長的字符串中」(取決於錯誤匹配的概率,您可能還想在後面添加'\>'警衛最後右括號)。 – tripleee

+0

您不需要尾隨的'。*' - 如果表達式可以匹配字符串中的任何位置,則正則表達式會成功。 – tripleee

相關問題