在处理之前删除 SpamAssassin 标头

在处理之前删除 SpamAssassin 标头

我有一台运行 cPanel/WHM 的服务器,其中装有 exim 和 SpamAssassin。我注意到一个问题,即带有伪造 spamassassin 标头的电子邮件绕过了部分过滤。我想在电子邮件通过 spamassassin 并过滤到收件箱/垃圾邮件文件夹之前删除所有 SpamAssassin 标头。

在网上搜索,我能找到的唯一类似的例子是自 2004 年起。但是,该用户和我编写的 exim 配置非常不同。我不确定如何应用它。我可以针对包含消息的文件运行 formail 以删除标题,但我不知道如何让 exim 执行此操作。

仅举一个例子,一条消息将带有如下标题:

X-Spam-Status: No, score=1.3
X-Spam-Score: 13
X-Spam-Bar: +
X-Ham-Report: Spam detection software, running on the system "serv02.example.com", has
        identified this incoming email as possible spam.  The original message *snip*
X-Spam-Flag: NO

我的 SpamAssassin 将会在邮件中添加以下标题:

X-Spam-Status: Yes, score=6.8
X-Spam-Score: 68
X-Spam-Bar: ++++++
X-Spam-Report: Spam detection software, running on the system "serv02.example.com", has
        identified this incoming email as possible spam.  The original message *snip*
X-Spam-Flag: YES

但是由于 exim vfilter 规则读取了第一个 X-Spam 标头,因此电子邮件最终进入了用户的收件箱,而不是垃圾邮件文件夹。

答案1

检查 SpamAssassinsremove_headerclear_headers 配置文件选项会做你想做的事。

答案2

Exim for cPanel 使用存储在 /etc/vfilters 中的 vfilters,并依赖于 X-Spam-Bar 标头。其他系统可能使用 X-Spam-Flag-Status 或 Score 来确定是否将邮件保存在收件箱、垃圾邮件文件夹中或将其删除。不幸的是,vfilter 将使用第一个匹配项,这是此问题的关键。


发现过时的解决方案 http://wiki.exim.org/ExiscanExamples#Replacing_foreign_Spamassassin_headers_with_local_ones

在 ACL 的某处添加 warn spam = exiscan:true set acl_m0 = ($spam_bar) $spam_score set acl_m1 = $spam_report

这将适当地设置 ACL 变量,以便系统过滤器中执行以下处理:

添加系统过滤器:

if first_delivery then
  # ...

  headers remove X-Spam-Score:X-Spam-Report:X-Spam-Checker-Version:X-Spam-Status:X-Spam-Level
  if $acl_m2 is not ""dd then
    headers add "X-Spam-Score: $acl_m0"
    headers add "X-Spam-Report: $acl_m1"
  endif
endif

在 cPanel 中,系统过滤器是 /etc/cpanel_exim_system_filter,而 acl_mX 变量不同,因此让我们找出原因。将其添加到 cpanel_exim_filters 的末尾

# work out our acl variables!
if first_delivery then
    headers add "X-acl-m0: $acl_m0"
    headers add "X-acl-m1: $acl_m1"
    headers add "X-acl-m2: $acl_m2"
    headers add "X-acl-m3: $acl_m3"
    headers add "X-acl-m4: $acl_m4"
    headers add "X-acl-m5: $acl_m5"
    headers add "X-acl-m6: $acl_m6"
    headers add "X-acl-m7: $acl_m7"
end

--- 执行此操作并得到:X-acl-m1:用户 1 X-acl-m2:1 X-acl-m3:X-acl-m4:X-acl-m5:X-acl-m6:X-acl-m7:

因此,我找到了 exim.conf 中添加标头的部分,并查看了所有 $spam 变量。我想知道它们是否会延续?让我们来一探究竟。

headers add "X-Test-Spam-Subject: ***SPAM*** $h_subject"
headers add "X-Test-Spam-Score:$spam_score"
headers add "X-Test-Spam-Score-Int: $spam_score_int"
headers add "X-Test-Spam-Bar: $spam_bar"
headers add "X-Test-Spam-Report: $spam_report"

因此,$spam_score_int 与 $h_subject 一起被继承,但 spam_bar 则不被继承,而这一点至关重要

X-Test-Spam-Subject: ***SPAM*** test
X-Test-Spam-Status: 
X-Test-Spam-Score: 33
X-Test-Spam-Bar:
X-Test-Spam-Report:

但是..我意识到标题会一直延续,这可能会起作用

headers add "X-Test-Spam-Bar: $h_X-Spam-Bar"

结果是:

X-Test-Spam-Bar: +
+++

因此 $h 标头既有接收的标头,也有添加的标头。

解决方案?

将自定义垃圾邮件过滤器添加到 exim.conf 中,然后在 cpanel_exim_filter 中将其换出

log_message = "SpamAssassin as ${acl_m1} detected message as spam ($spam_score)"
add_header = X-989Spam-Subject: ***SPAM*** $h_subject
add_header = X-989Spam-Status: Yes, score=$spam_score
add_header = X-989Spam-Score: $spam_score_int
add_header = X-989Spam-Bar: $spam_bar
add_header = X-Spam-Report: $spam_report
add_header = X-989Spam-Flag: YES

add_header = X-989Spam-Status: No, score=$spam_score
add_header = X-989Spam-Score: $spam_score_int
add_header = X-989Spam-Bar: $spam_bar
add_header = X-Ham-Report: $spam_report
add_header = X-989Spam-Flag: NO
log_message = "SpamAssassin as ${acl_m1} detected message as NOT spam ($spam_score)"

好的,现在让它更加持久。首先,复制您的 cpanel_exim_system 过滤器:

cp /etc/cpanel_exim_system_filter /etc/custom_exim_system_filter

登录WHM Main >> Service Configuration >> Exim Configuration Editor,点击Advanced Editor

向下滚动并将垃圾邮件标头部分更改为如下所示。请注意,您只是将 X-Spam 标头更改为 X-989Spam 标头(当然,只要您的 custom-exim-system-filters 匹配,您就可以使用任何您喜欢的自定义名称。由于配置文件可能会随时间而变化,请确保您只修改 add_header 行。

add_header = X-989Spam-Subject: ***SPAM*** $h_subject
add_header = X-989Spam-Status: Yes, score=$spam_score
add_header = X-989Spam-Score: $spam_score_int
add_header = X-989Spam-Bar: $spam_bar
add_header = X-Spam-Report: $spam_report
add_header = X-989Spam-Flag: YES

- 和 -

add_header = X-989Spam-Status: No, score=$spam_score
add_header = X-989Spam-Score: $spam_score_int
add_header = X-989Spam-Bar: $spam_bar
add_header = X-Ham-Report: $spam_report
add_header = X-989Spam-Flag: NO

保存您的配置并等待 WHM 刷新。

返回主页 >> 服务配置 >> Exim 配置编辑器 >> 过滤器

将系统过滤器文件更改为指向 /etc/custom_exim_system_filter

答案3

公认的答案可能是您在 2012 年或 2012 年常用的 exim 版本中所能做的最好的事情,但如今 exim 确实有一个remove_header可以在 ACL 中使用的指令。它被添加版本 4.82

  1. 新的 ACL 修饰符“remove_header”可以在消息被路由器/传输处理之前删除报头。

相关内容