我有一个运行 Exim 和 Dovecot 的邮件服务器,由 MySQL 支持,供虚拟用户使用。Spamassassin 已配置,似乎运行正常,但未配置将标记的垃圾邮件发送到收件人的“垃圾邮件”目录。我们使用 maildir 格式进行存储。
我该如何处理邮件投递到哪里?我原本以为 procmail 可以做到这一点,但我没有看到针对此特定设置的任何合适配置。
简而言之: - Exim - Spamassassin - 虚拟用户,每个用户的根目录 = /home/mail/$domain/$local_part - 例如,想要将垃圾邮件发送到 /home/mail/$domain/$local_part/spam/
短暂性脑缺血发作
答案1
这是可以正常工作的东西。我以标准的“本地交付”路由器/传输为基础,但在 X-Spam-Flag 标头中添加了条件,我之前已在相关 ACL 中设置了该条件。如果您不知道如何操作,请告诉我,我会修改答案。
我做了类似的事情,但是在领域层面上,我的设置可能对你来说不太好用。
首先,您需要一个路由器。路由器是按顺序处理的,因此请将其放在合适的位置 - 通常在接收普通邮件之前,因为普通邮件优先。
spamcheck:
debug_print = "R: spamcheck for $local_part@$domain"
driver = accept
check_local_user
user = mail
condition = "${if def:h_X-Spam-Flag: {yes}{no}}"
transport = local_spam_delivery
现在您需要一个 local_spam_delivery 传输,因此请将其放在传输部分的任何位置:
local_spam_delivery:
debug_print = "T: local_spam_delivery for $local_part@$domain"
driver = appendfile
directory = /home/mail/$domain/$local_part/spam/
maildir_format
delivery_date_add
envelope_to_add
return_path_add
如果您不想将其作为 maildir,请删除 maildir_format 命令。您可能需要稍微调整规则,尤其是关于用户和组设置等。
如果上面的例子中缺少了什么,我注意到有一个类似的例子记录下来这里
答案2
您可以使用几个路由器轻松完成此操作。或者,您可以使用 exim 筛选文件来执行此操作。
我的 ~/.forward 中有以下内容,但您可以轻松地对全局过滤文件使用类似的内容。
if $spam_score_int is not "" then
if $spam_score_int is above 49 then save $home/Maildir/.SPAM/ finish endif
endif
使用您的路径应该可以工作。只需在示例中替换它,并不要忘记尾部的斜杠,否则您最终可能会交付为 mbox 格式。
答案3
我想出了以下步骤,将垃圾邮件发送到每个域中名为“垃圾邮件”的邮件目录。
mysql_delivery:
driver = appendfile
maildir_format
directory = "${if and { {def:h_X-Spam-Flag:} {eq {$h_X-Spam-Flag}{YES}}} {/home/mail/${domain}/${local_part}/.Junk}{/home/mail/${domain}/${local_part}} }"
我猜我最初发布这个问题时想得太多了。上面的方法似乎很有效。不过我会接受 Daniel 的回答。