你能用程序化的if-then风格编写规则吗



你能在SpamAssassin中做if-then风格的语句吗?

我收到的垃圾邮件使用我的电子邮件地址作为发件人的姓名,我想为此写一个通用规则。

例如,我收到的垃圾邮件的发件人:和收件人:行如下:

From: "me@mydomain.org" <spam@spam.com>
To: <me@mydomain.org>

下面我将此格式称为:

From: "Name" <address>
To: <address>

有可能写一条规则说:

if 
the (From: name)
is equal to (To: email address)
but not the (From: email address)
then 
give it a score?

我认为这是在我的服务器自动发送类似格式的消息时特别考虑的,例如:"root@mydomain.org" <root@mydomain.org>
我不希望该规则意外地给这样的电子邮件打分。

我只知道如何写积极的规则。所以我可以寻找这些简单的匹配

header LOCAL_FROM_NAME_MyAddress   From =~ /"me@mydomain.org"/
header LOCAL_FROM_Address_MyAddress   From =~ /<me@mydomain.org>/
header LOCAL_TO_Address_MyAddress   From =~ /<me@mydomain.org>/

因此,如果他们都打出了一场比赛,我可以创造一个分数:

meta LOCAL_FROM_ME_TO_ME ((LOCAL_FROM_NAME_MyAddress + LOCAL_FROM_Address_MyAddress + LOCAL_TO_Address_MyAddress) >2)
score LOCAL_FROM_ME_TO_ME -0.1

但这是我所能做到的。我还没有看到任何方法可以做更复杂的事情。

SpamAssassinmeta规则支持布尔表达式,因此可以使用&&||!运算符来创建更复杂的匹配。在您给出的特定示例中,该规则在逻辑上等效于:

(FROM_NAME equals MyAddress) and (FROM_ADDR does not equal MyAddress)

表达这一点的规则集可以是:

header __LOCAL_FROM_NAME_MyAddress  From:name =~ /me@mydomain.org/
header __LOCAL_FROM_ADDR_MyAddress  From:addr =~ /me@mydomain.org/
meta LOCAL_SPOOFED_FROM (__LOCAL_FROM_NAME_MyAddress && !__LOCAL_FROM_ADDR_MyAddress)
score LOCAL_SPOOFED_FROM 5.0

如果元规则和布尔表达式还不够,可以编写一个Perl插件。查看CPAN上的许多示例,也许特别是Mail::SpamAssassin:FromMailSpoof。

备注
  • 您可以编写:name:addr来解析FromTo标头的特定部分。

  • 您可以在子规则前面加上__,这样它们就不会单独得分。

  • @.这样的特殊字符应该在正则表达式模式中转义

最新更新