SpamAssassin正则表达式捕获长网址

3
我正在CentOS上打磨我的SpamAssassin过滤器。在排除了*.link和.eu域名后,我想标记超过100个字符的非常长的域名字符串。
条件如下:
  • 以http或https开头
  • 可能包含www
  • 以EOL、换行符、空格、"、'或<结尾
我想到了这个正则表达式:
body     LONG_URL    (https?:\/\/)[^,;\"\'<\s$]{100,}
describe LONG_URL    URL with over 100 characters
score    LONG_URL    0.5

在正则表达式测试器中有效,但在SpamAssassin中无效。


你确定要将美元符号排除在类别之外吗?虽然在URL中不太常见,但这似乎是选择排除此特定字符的奇怪原因。 - tripleee
2个回答

3
您想编写一个与URI有关的测试,而不是一个正文测试。请参考uri测试

URi只有在URL中包含www才能工作吗?但由于我的不起作用,我还是会尝试一下。 - yello
似乎 URi 只能处理被 HTML 包装的 URL。 - yello
更正:看起来 URi 不支持 .LINK 域名后缀。完全相同的规则在 .EU 域名后缀上运行良好。我的 URi EU 域名后缀规则可以在有或没有 HTML 的情况下使用。 - yello
@yello,你说得对,SA目前不支持最新一轮TLD中的.link或其他域名。修复即将到来。这仅影响正文中的纯文本链接;SA可以很好地捕获HTML中的.link域名。 - Adam Katz

1
为了解决新顶级域名问题,确实需要一个主体规则。根据您上面的编写方式,存在一些语法问题和一些不必要的计算成本。请尝试使用以下内容:
body     YELLO_LONG_BODY_URL  m@\bhttps?://[^\"\'<\s$]{100}@i
describe YELLO_LONG_BODY_URL  100+ char URL, https://dev59.com/UYTba4cB1Zd3GeqP6HPw#26919318
score    YELLO_LONG_BODY_URL  0.1

那个技术上可行,但我相信你会发现它会在很多非垃圾邮件中触发,尤其是市场营销邮件,特别是如果你把字符限制在100个字符(这很小!)。我去掉了逗号和分号,因为它们可能是 URL 的一部分,而合法消息的 URL 长度只有一个字符太长,所以你可能只需要使用 m@\bhttps?://\S{100}@i

警告:我从事打击垃圾邮件的工作,手头有大量数据。在128个字符以下的范围内,您将会遇到更多的非垃圾邮件(“正常邮件”)而不是垃圾邮件。没有一个大小范围会有一个非常好的垃圾邮件:正常邮件比率;0.900的S/O,即精度,可能是可接受的,但您真的希望更接近1.000。根据我的测试,最佳范围是192-256个字符,但即使如此,它也太弱了(S/O = 0.862),无法提供很大的帮助。使用超过1024个字符的链接几乎没有垃圾邮件(S/O = 0.057)。

我改变了这个规则的名称。为了方便识别,将规则归属于您自己是很好的,这样当出现问题时,可以轻松地将其与上游SpamAssassin区分开来,并且“功劳”变成“责任”... 我甚至在规则描述中链接了这个答案,以便您的用户可以了解更多信息。


感谢您详细的回复。与此同时,问题似乎已经解决了。看起来垃圾邮件发送者会尝试一段时间的某种方式,当删除率过高时就会尝试其他方式。对我产生重大影响的是添加了postgrey(灰名单)。强烈推荐!请参考wiki.centos.org/HowTos/postgrey。 - yello

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接