我有一个本地 procmail 用户“bob”。
如果收到一封电子邮件并匹配[电子邮件保护],则不应采取任何行动。
但是,如果收到一封电子邮件并且是 [anything_else]@domain.com 那么我想重写主题行以在主题行前面插入“[spam]”。
因此,它是对“bob@”的反向匹配(匹配除 bob@ 之外的任何内容),并且我们保留原始主题行,只是在其前面添加“[spam]”。
我如何使用 Procmail 来实现这一点?
答案1
您的要求不太明确。Procmail 可以匹配任何字符串,但您真的想在消息中的任何地方查找字符串吗?并且您真的想domain.com
为了这条规则而忽略其中没有的消息吗?
:0 HB
* ! ()\<bob@domain\.com\>
* @domain\.com\>
{
:0fhw
* ^Subject:\/.+
| formail -I"Subject: [spam]$MATCH"
}
和字边界阻止匹配像或 这样的子字符串,而空括号是一种黑客行为\<
,因为 Procmail 对于以反斜杠开头的正则表达式很奇怪。\>
tombob
subdomain.complete.org
如果您只想查看标题,请HB
从第一个冒号行中删除(您可以保留,H
但如果您不放置任何标志,这是默认设置)。如果您想匹配特定标题,请将其拼写出来。如果您想专门检查收件人,宏^TO_
可以让您轻松地在多个不同的标题(、等)中执行此To:
操作Cc:
。
:0fhw
* ! ^TO_bob@domain\.com\>
* ^TO_[^<>@ ]+@domain\.com\>
* ^Subject:\/.+
| formail -I"Subject: [spam]$MATCH"
因为我们删除了HB
标志,所以我们可以将之前两个带有不同标志的配方组合起来。第二个^TO_
配方检查包括的任何地址bob
,但该地址已被之前的否定条件排除。
这仍然存在一些可能需要进一步探讨的极端情况;如果你可以编辑你的问题来澄清它,也许我可以更新它以涵盖更多的基础知识。
不过,SMTP 并不要求在标头中拼写出收件人。典型的例子是,Bcc:
这也是许多邮件列表使用的机制。也许您的 MTA 会拼写出收件人,Delivered-To:
但严格来说,这种类型的过滤器最好在 MTA 中实现。