![如何在不给自己发送电子邮件的情况下测试 procmail 规则?](https://linux22.com/image/208042/%E5%A6%82%E4%BD%95%E5%9C%A8%E4%B8%8D%E7%BB%99%E8%87%AA%E5%B7%B1%E5%8F%91%E9%80%81%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E6%B5%8B%E8%AF%95%20procmail%20%E8%A7%84%E5%88%99%EF%BC%9F.png)
我收到大量来自某个国家/地区的垃圾邮件。它们在源中都有相同的模式。我想编写一个 procmail 规则来自动将所有这些电子邮件移至我的垃圾邮件文件夹。
垃圾邮件的来源可能如下所示(我添加“[已编辑]”以保护我的隐私):
Return-Path: <>
X-Original-To: [REDACTED]
Delivered-To: [REDACTED]
Received: from [REDACTED] ([REDACTED] [REDACTED])
by [REDACTED] (Postfix) with ESMTPS id 2AC8E731E799DC
for <[REDACTED]>; Sat, 9 Jul 2022 20:16:41 +0000 (UTC)
Received: from [REDACTED].org ([REDACTED].ru [REDACTED])
by [REDACTED] (Postfix) with ESMTP id 6F1865ECD8
for <[REDACTED]>; Sat, 9 Jul 2022 20:16:40 +0000 (UTC)
[...]
我想要做的是查看“已接收”标头,并将来自 .ru TLD 的所有内容都扔进垃圾邮件中。
我的尝试是这样的:
:0 H
* ^Received:*\.ru
.Spam/
但是,我是编写 procmail 规则的新手。我怎样才能测试我的新规则以便知道它是正确的?
答案1
procmail
接受来自标准输入的邮件消息,因此将对您通过管道传递给它的任何内容进行操作。理想情况下,您通过管道传递给它的内容应该与邮件传输代理将发送的内容相同。还要在将新规则包含在正确的内容之前测试使用自定义规则文件.procmailrc
:
# rm output
# cat testmessage
From [email protected]
To: [email protected]
Subject: foo
test
# cat testrules
:0 H
* ^
output
# procmail testrules < testmessage
# cat output
From [email protected]
To: [email protected]
Subject: foo
test
#
答案2
Procmail 有一个-m
选项,可以让您测试规则文件,而无需在任何地方传递消息;$DEFAULT
如果您的规则均不匹配,它会关闭向您的收件箱发送邮件的功能。该选项要求您传入要运行的规则文件的文件名,并允许您像VERBOSE=yes
在命令行上一样设置变量。
procmail -m test.rc VERBOSE=yes <test.msg
也许还可以看到https://www.iki.fi/era/mail/procmail-debug.html (旧的但仍然模糊相关)。
对于您的具体规则,它很容易出现误报。请记住,正则表达式引擎将接受任何部分匹配;所以你的规则将触发例如
Received: from postfix.rules.example.com ...
因为它匹配子字符串.ru
。您可以通过在 后面要求一个字边界来在某种程度上防止这种情况ru
:
:0
* ^Received:.*\.ru\>
.Spam/
另请注意“任何文本”的正则表达式是.*
,其中.
匹配任何一个字符,并*
表示尽可能多次重复前一个表达式,但也接受零次重复。 (因此,您的尝试将允许在后面有零个或多个冒号Received
,但前提是紧随其后的是文字文本.ru
。)
您可能可以将其进一步收紧,但众所周知,Received:
标头的标准化程度很差。许多服务器运行 Postfix 或 Sendmail,它们都会创建Received:
标头,其中冒号后的第一部分表示from
HELONAME (RDNS [IP]),其中 IP 是实际 IP 地址,RDNS 是反向 DNS 查找的结果(可能为空),HELONAME 是远程客户端在使用或HELO
命令启动 SMTP 事务时为自己指定的名称EHLO
(客户端可以在此处输入任何他们想要的内容;有些会输入明显的伪造内容,这是很好的垃圾邮件过滤器素材!)... 但同时,许多其他服务器运行使用不同格式的不同软件,或鼓励本地管理员配置自己的格式(呃,Exim)。每条Received:
消息顶部附近的标头来自离您最近的服务器,因此比更远的服务器更可预测和可靠,后者很容易包含完全虚构的信息。
无论如何,这最终还是有些令人不满意。如果您可以说服您的 ISP 在 SMTP 传输期间阻止这些不需要的邮件(有效地阻止传递尝试,就好像您的邮箱不可用一样),那么效率会更高。一些提供商为他们的用户提供 SpamAssassin 等访问权限,它可以让您阻止俄语消息(尽管精确度不是很好;该机制不太擅长区分俄语和塞尔维亚语等),因此您需要阻止或允许实际上所有西里尔语言),有些会阻止 IP 级别的流量,以便已知的垃圾邮件发送者甚至无法连接。但作为抵御破坏者的最后一道防线,Procmail 显然比没有好得多。