所以我有一个接收垃圾邮件的邮件服务器,我需要将这些垃圾邮件转发到虚拟用户的垃圾邮件文件夹。我有一个 dovecot、postfix 和 spamassassin 一起工作,但我的问题是,我似乎无法找到一种方法将垃圾邮件(标题为 *****SPAM***** 的邮件)转发到虚拟用户的垃圾邮件/垃圾邮件文件夹。如果有人能帮助我解决这个问题,那就太好了。如果您需要任何信息/文件,请随时给我发消息。
该系统运行的是 Ubuntu 14.04 LTS(64 位),带有 dovecot、postfix 和 spamasssassin。
答案1
有很多方法可以实现您的愿望,但我更喜欢下一种方法。
spamassassin
作为本地服务启动,在文件套接字而不是 IP 端口上可用。这是为了提高性能。
exim
使用内容扫描选项进行编译,并配置为与spamassasin
该评分消息交互并返回分数。如果分数高于阈值(我的情况是 49 分),则会向消息添加一些特殊标头:
spamd_address = /tmp/spamd.sock
. . . . .
acl_data:
accept hosts = : +relay_from_hosts
accept condition = ${if >{$message_size}{1M}}
warn spam = spamd
condition = ${if >{$spam_score_int}{49}}
add_header = X-Spam-Score: $spam_score_int
add_header = X-Spam-Ooops: Detected
log_message = SpamAssassin detected mesage
accept
我没有检查大于 1 MiB 的垃圾邮件,因为垃圾邮件通常要小得多。然后我将邮件发送到用户的邮箱。我通过 dovecot 的传输来做到这一点deliver
:
localdelivery:
driver = pipe
user = mailnull
command = /usr/local/libexec/dovecot/deliver -d $local_part@$domain -f $sender_address
temp_errors = 64 : 69 : 70: 71 : 72 : 73 : 74 : 75 : 78
envelope_to_add
return_path_add
delivery_date_add
log_output
dovecot
有一个pidgeonhole
实现sieve
功能的插件。所有消息都通过如下所示的全局过滤器进行处理:
####
require "fileinto";
if exists "X-Spam-Ooops"
{
fileinto "Junk";
stop;
}
else
{
# Trigger to launch next script in sequence
keep;
}
####
这里的逻辑很简单:如果传递的消息有X-Spam-Ooops
标题(由分数分配exim
)sa
,它将被传递到INBOX.Junk
每个特定用户的子文件夹中。在全局过滤器处理完毕后,需要else
带有动词的分支keep
通过自定义用户的过滤器进一步处理消息。