你能在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
来解析From
和To
标头的特定部分。您可以在子规则前面加上
__
,这样它们就不会单独得分。像
@
和.
这样的特殊字符应该在正则表达式模式中转义