我希望编写一条 SpamAssassin 规则,如果一封电子邮件n
的正文中包含超过一个特定字符,则匹配该规则。不一定是连续的。例如,如果一封邮件中总共有 10 个星号,则匹配该规则。
如果有十个连续的星号,我知道如何编写规则,如下所示:
body TEN_ASTERISKS /(**********)/
score TEN_ASTERISKS 0.5
describe TEN_ASTERISKS Message body contains ten asterisks.
我该如何重写规则来匹配总共十个星号(不一定连续)?
答案1
上述规则格式不正确,无法起作用。
SpamAssassin 规则是常用表达,因此你只需要逃避这些:
body TEN_ASTERISKS /\*\*\*\*\*\*\*\*\*\*/
score TEN_ASTERISKS 0.5
describe TEN_ASTERISKS Message body contains ten asterisks.
另外,括号是不必要的。它们构成了一个捕获组这些信息存储在内存中(假设您看到大量带有星号的邮件),这可能会对您的服务器造成损害。
(你也可以这样做,body TEN_ASTERISKS /\*{10}/
但我想举一个更简单的例子。正则表达式非常强大。)
要匹配十个单独的星号,您需要tflags multiple
:
body __HAS_ASTERISK /\*/
tflags __HAS_ASTERISK multiple maxhits=11
meta TEN_ASTERISKS __HAS_ASTERISK > 10
score TEN_ASTERISKS 0.5
describe TEN_ASTERISKS Message body contains ten asterisks.
这maxhits=11
部分是优化。它告诉 SpamAssassin 停止计数(tflags multiple
运行成本很高)。