我想在 acl_check_data 配置部分中使用 exim 的内置垃圾邮件过滤器支持来配置垃圾邮件过滤。
管道、exim 标头修改(用于存储结果)运行良好。以及通过 dovecot-lda 将邮件传输到垃圾邮件文件夹。
我唯一的问题是我无法将收件人的虚拟用户传递给 spamassassin,以让 spamd 从 sql 加载用户的偏好设置。
我知道,exim 的“垃圾邮件”关键字左侧就是为此而设的,但它不会为我传递任何变量。只有静态值:只是忽略我设置的所有变量。
这是我的配置部分:
acl_check_data:
# Deny if the message contains a virus. Before enabling this check, you
# must install a virus scanner and set the av_scanner option above.
#
deny malware = *
message = This message contains a virus ($malware_name).
# Add headers to a message if it is judged to be spam. Before enabling this,
# you must install SpamAssassin. You may also need to set the spamd_address
# option above.
# {def:h_Envelope-to:}
# Accept when mail size is over 500k
accept condition = ${if >={$message_size}{500k}{yes}{no}}
# put headers in all messages (no matter if spam or not)
warn spam = ${local_part}@${domain}:true
add_header = X-Spam-Score: $spam_score\n\
X-Spam-Score-Int: $spam_score_int\n\
X-Spam-Level: $spam_bar\n\
X-Spam-Report: $spam_report
# add second subject line with *SPAM* marker when message
# is over threshold
warn message = Classified as spam.
spam = ${local_part}@${domain}
add_header = X-Spam-Flag: YES\n\
Subject: [SPAM] $h_Subject:
# reject spam at high scores (> 12)
deny message = This message scored $spam_score spam points.
spam = ${local_part}@${domain}:true
condition = ${if >{$spam_score_int}{120}{true}{false}}
# Accept the message.
accept
当前格式为“${local_part}@${domain}”,但我尝试了更多:${local_part@$domain},带引号,不带括号等。只有 at 符号 (@) 传递,而变量在其他关键字(例如条件)下起作用。
我知道,我可以制作一个(耗资源的)传输钩子,甚至通过 dovecot 进行过滤,但是如果可能的话,我还是想使用这个功能。所以请不要建议其他解决方案,我知道它们。
答案1
您想要做的事情根本不可能实现。在 SMTP 时检查垃圾邮件会禁止这样做,因为您最终会扫描一封包含多个收件人的邮件(因此只需扫描一次)...那么您会加载哪些用户偏好设置?为了做到这一点,您需要在交付时使用管道传输(到 spamc),而不是在 SMTP 时。无论如何,在 SMTP 时使用重度垃圾邮件检测(如 spamassassin)是个坏主意,因为它会使您的服务器容易受到 DoS 攻击。在 SMTP 时使用较轻的垃圾邮件检测,在交付时使用重度垃圾邮件检测(使用适合每个用户的规则)。