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

dub*_*lee 1 email spamassassin regex

我希望编写一个 SpamAssassin 规则,如果电子邮件n正文中包含超过一个特定字符,则该规则将匹配。不一定是连续的。例如,如果消息中总共有十个星号,则匹配规则。

如果有十个连续的星号,我知道如何编写规则,如下所示:

body TEN_ASTERISKS /(**********)/
score TEN_ASTERISKS 0.5
describe TEN_ASTERISKS Message body contains ten asterisks.
Run Code Online (Sandbox Code Playgroud)

我将如何重写规则以匹配总共十个星号(不一定是连续的)?

Ada*_*atz 5

上述规则格式错误,不会起作用。

SpamAssassin 规则正则表达式,因此您只需转义这些:

body TEN_ASTERISKS /\*\*\*\*\*\*\*\*\*\*/
score TEN_ASTERISKS 0.5
describe TEN_ASTERISKS Message body contains ten asterisks.
Run Code Online (Sandbox Code Playgroud)

另外,括号是不必要的。它们形成一个存储在内存中的捕获组,这(假设您看到大量带有星号的邮件)可能会对您的服务器造成损害。

(你也可以这样做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.
Run Code Online (Sandbox Code Playgroud)

maxhits=11件作品是一个优化。它告诉 SpamAssassin 停止计数(tflags multiple运行成本很高)。