【问题标题】:Can you write rules in a programmatic if-then style?你能以程序化的 if-then 风格编写规则吗?
【发布时间】:2022-11-09 09:36:09
【问题描述】:

你能在 SpamAssassin 中做 if-then 风格的陈述吗?

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

例如,我收到带有 From: 和 To: 行的垃圾邮件,如下所示:

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" &lt;root@mydomain.org&gt;
我不希望规则意外地对这样的电子邮件进行评分。

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

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

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

【问题讨论】:

    标签: spamassassin


    【解决方案1】:

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

    (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 插件。查看许多examples on CPAN,也许特别是Mail::SpamAssassin:FromMailSpoof

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-28
      • 2019-10-23
      • 2016-03-21
      • 2015-04-28
      • 2018-02-19
      • 2020-12-10
      相关资源
      最近更新 更多