我已经安装并运行了 exim 和 spamassassin(exiscan 使用),但我想添加自定义规则,如果“收件人”和“信封收件人”不相同,则该规则会在电子邮件中添加一些点。我在 local.cf 中添加了以下规则:
header EXIM_SENDER_SWAP X-Sender-Swap =~ /To_envelope-to/
describe EXIM_SENDER_SWAP To doesnt match envelope-to
score EXIM_SENDER_SWAP 2.0
并在 exim.conf 中行
acl_check_data:
warn message = X-Subject-Swap: To_envelope-to
condition = ${if !match {${lc:$h_envelope-to:}}{${lc:$h_to:}}{yes}{no}}
我正在发送测试邮件,exim 添加了相应的标头,但 spamassassin 没有添加任何附加点。出了什么问题?
答案1
首先,“message”修饰符不是您想要的,当您想要在 ACL 中为消息添加标题时,您需要使用“add_header”。阅读http://www.exim.org/exim-html-current/doc/html/spec_html/ch42.html#SECTaddheadacl如果您需要关于该部分的更多信息。
但是,我认为你尝试做的事情不会以你使用的方式起作用。在 exim 处理每个 ACL 的过程中,ACL 会运行,然后当 ACL 已完全的,所有报头添加和删除都已完成。您在同一 DATA ACL 中执行这两项操作,这意味着第一次比较添加的报头实际上尚未添加到 spam 命令正在扫描的临时文件中的邮件中。
一种选择是进行垃圾邮件扫描,检测您添加标题的情况,然后在比较时将该分数添加到保存垃圾邮件分数的变量中以查看它是否是垃圾邮件。
第二种选择,也是我认为更好的选择,是使用两个不同的用户来运行垃圾邮件扫描。对于第一个用户,您将垃圾邮件分数设置为(例如)5.0。对于第二个用户,您将垃圾邮件分数设置为 3.0。这比正常限制少 2 分,相当于在垃圾邮件分数上增加了 2 分。
然后你的 ACL 节可能看起来像(未经测试):
warn condition = ${if !match {${lc:$h_envelope-to:}}{${lc:$h_to:}}{yes}{no}}
set $acl_m_env_ok = 1
spam = strict_user:true
warn condtion = ${if eq{$acl_m_env_ok}{1} {no}{yes}}
spam = normal_user:true
warn add_header = X-Spam-Score: $spam_score
add_header = X-Spam-Report: $spam_report
deny condition = ${if eq{$acl_m_env_ok}{1}}
condition = ${if >{$spam_score_int}{30}}
message = This message with mismatched header/envelope score $spam_score_points...REJECTED
deny condition = ${if >{$spam_score_int}{50}}
message = This message scored $spam_score points...REJECTED