确定电子邮件是否包含一定数量的特定字符

确定电子邮件是否包含一定数量的特定字符

我希望编写一条 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运行成本很高)。

相关内容