我根据“收件人:”字段重写某些来信的主题行:
:0fhw
* ! ^TO_user@domain\.com\>
* ^TO_[^<>@ ]+@domain\.com\>
* ^Subject:\/.+
| /usr/local/bin/formail -I"Subject: [SPAM]$MATCH"
上面的代码(来自我之前的问题如果电子邮件收件人用户未通过匹配测试,procmail 将重写主题行)完美运行 - 如果我收到来自其他地址的邮件[电子邮件保护],主题行被改写为[SPAM](原主题)
但我想做多个这样的条件 - 上面的工作块将是最后一个,但在此之前,如果收件人与不同的地址匹配,我想重写主题行。
所以我在它的上方添加了这个块:
: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
。