匹配 Spamassassin X-Spam-Status 分数或 X-Spam-Level 的 Procmail 配方

Procmail recipe to match Spamassassin X-Spam-Status score or X-Spam-Level

考虑这些邮件 headers:

X-Spam-Level: ***
X-Spam-Status: Yes, score=3.7 required=3.0 tests= (remaining truncated for brevity)

我只想匹配 headers

"X-Spam-Level: ***"(至少多一个“*”没问题)

"X-Spam-Status: Yes, score=3.7"(或更高分)

我有这个,它与 X-Spam-Level header 匹配,但我看到一些东西以 3.7 或更高的分数滑过,让我相信交替被跳过:

:0 H
    * ^X-Spam-Status: Yes
    * ^(X-Spam-Level: \*\*\*\*)|(^X-Spam-Status: Yes, score=3\.[7-9])
    { 
        do stuff
}

尽管在 regex101.com

等网站上进行了匹配,但 Procmail 的正则表达式实现与我习惯的不太一样,无法正常工作

我完全同意只匹配 3.7 或更高分数并完全删除 X-Spam-Level 条件的解决方案。

注意:我知道我在 Spamassassin 中设置的最低分数是 3.0 以标记为垃圾邮件,但是,我将邮件发送到用户邮箱的分数在 3 到 3.6 之间并将更高级别的内容移至服务器垃圾邮件邮箱。目前,只有 4.1 或更高版本才会被传送到服务器的垃圾邮件邮箱,如 X-Spam-Level.

中的星号所示

我一直无法让它工作。相反,我修改了 Spamassassin local.cf 配置以添加 header 行:

add_header all Score _SCORE_

这会创建 X-Spam-Score 的新邮件 header:n.n 其中 n 是数字。

在 procmailrc 文件中,我将这一行添加到顶部:

# Change this value to be whatever threshold
# you want
# Spam scored between 3 and 3.6 will be delivered.
# Spam scored over 3.6 won't.
SPAMTHRESHOLD=3.6

在文件的后面,在调用 spamc 之后,我声明了一个变量来捕获分数然后对照它进行检查:

# Create SCORE variable which contains the header I created in Spamassassin
:0 # H flag is implicit
    * ^X-Spam-Score: \/.+
    { SCORE=$MATCH }

# Check for Spam-Status: Yes, and 
# $SCORE > $SPAMTHRESHOLD
:0 H
    * ^X-Spam-Status: Yes
    * $ -${SPAMTHRESHOLD}^0
    * $ ${SCORE}^0
    { 
        # do stuff. in this case move the mail to 
        # /var/mail/spam
        :0:spam.lock
        /var/mail/spam
}