很多垃圾邮件都通过了我运行的邮件服务器上的过滤器,使用了一个相对简单的技巧,即在顶部以几行(非常明显的)减肥或其他诈骗文字开头,然后是一大段来自编程文档的文本——或者,最邪恶的是,文本摘自 Stack Exchange。在最好的情况下,Spamassassin 将此视为 BAYES_50,而其余消息的构造非常谨慎,因此不会触发其他触发器。(例如,标题最少且正确。)通常,所包含的摘录与我的合法利益非常吻合,因此整个消息的评分为 BAYES_00,因为非常垃圾邮件的标记被系统管理员解决问题的有趣信息所淹没。
顶部是显然是垃圾邮件(实际上,它与之前收到并被训练为垃圾邮件的消息非常相似)我有点惊讶它居然能通过 — 但显然它能通过。似乎只有单独通过一次,即对消息的前 25 行(左右)进行评分并对其进行加权才能解决问题。有办法吗?
有几个人建议编写自定义正则表达式。我不想讨论这个问题,因为这是一场注定要失败的战斗。在贝叶斯垃圾邮件分类得到广泛使用之前,人们就是这么做的,而且通常很糟糕。没有人能跟上。它并不比对每条垃圾邮件按下删除键更有效,而且需要我做更多的工作。
贝叶斯垃圾邮件过滤确实有效。它甚至可以这垃圾邮件,如果我将“首屏“部分,并只分析该部分,去掉诱饵/谷壳。问题是:我怎样才能让 Spamassassin 做到这一点?
答案1
我本人就是一个(小小的)活跃的反垃圾邮件斗士。由于您遇到的很多问题,几年前我最终自己做了一些肮脏的事情。
现在,这不是针对您特定问题的答案,而是针对您特定问题的答案。因此,请不要因此而投反对票。
我解决这个问题的方法是修改 XMail 服务器使用的 sa_filter-post.pl 脚本,该脚本在电子邮件文件上调用 spamc 并在那里做一些小事情,不是处理整个文件,而是处理文件的特定部分,基于一些特定的规则(由我硬编码)。是的,正则表达式,但到目前为止它们对我有用(在这个脚本之前和之后我确实有一堆其他脚本,所以它们可能会发挥作用)
例如,我有一个正则表达式可以找出电话号码。垃圾邮件发送者保留了完整的电话号码,因此它直接只处理文件中间的 400 个字符(我实际上是通过反复试验才得到 400 个字符的,从 200 个开始)。请注意,与文件中的内容相比,很难从您看到的内容中找出中间部分。
还有另一个具有与“产品”相同的 html 表结构、虚拟页眉和不可用的页脚,因此我将它们删除,删除“产品”评论列,然后将其传递给 spamc。
等等,你就明白了。
但并非所有规则都是完美的,因此我在这里施展了一点魔法,为每个规则分配一个私人分数,然后根据规则的行为方式对其进行硬编码,并在需要时调高或调低分数(有时我最终会删除所有规则)。然后,我根据私人分数修改 SA 分数。我这样做的原因是因为出于某种原因,SA 只给出了 4 分。一些规则显然是垃圾邮件,我也强烈希望能够正确发现它们。所以我给它们增加了一点提升,使其超过 5.0,再加上一些考虑其他变量的后处理脚本(电子邮件来源、电子邮件目标、标题结构等),它或多或少可以消除垃圾邮件。
现在我意识到这不是你所希望的,但就我而言,它给了我很大的权力来控制扫描的内容,只是我需要手动设置,然后时不时地对值/正则表达式进行一些修饰。
但在您的情况下事情要简单得多,因为您所要做的就是使用一个简单的 bash 脚本,该脚本将由您的 MX 而不是 spamc 调用,并让该脚本使用 head 命令仅获取您想要的第一个任意数量的字节并将该临时文件传递给 spamc。
脚本的内容将有点取决于您的邮件服务器,但这应该不难弄清楚。
(请注意,我只谈论了我的设置,以便您可以看到此选项的可能性)
附言:我个人从未收到过这种垃圾邮件(其中包含与编程相关的内容),所以我想知道您是否惹恼了某人,现在您成了目标。这可以解释特制的电子邮件。我之所以想到这种可能性,是因为几年前,当我在各种 IT 论坛和群组中非常活跃时,我确实惹恼了一些人,而且我时不时会收到各种类型的服务器攻击,包括电子邮件垃圾邮件。但那时那些白痴还没有这么聪明 :)