因此,我正在考虑使用 Dovecot 的 mdbox 格式来存储邮件,但是我还将使用 Spamassassin,并且需要能够向其传递一个电子邮件文件夹以便应用其过滤器。
可以直接从 mdbox 格式完成此操作吗?如果不行,是否有某种方法可以以 Spamassassin 友好的方式提取 mdbox 邮箱的部分或全部内容?如果可以,是否可以将其导入 spamassassin(而不是必须提取到文件夹中)?
答案1
我的解决方案是配置 Dovecot 内置的反垃圾邮件/邮件队列功能,将邮件分别传输到/从我的垃圾邮箱传输时作为垃圾邮件/正常邮件传递给脚本,以便使用 cron-job 来学习它们。虽然可以sa-learn
直接将邮件传递给脚本,但这可能意味着学习意外的错误归档,而且这比直接转储文件以备后用要慢得多。这也可能仅在使用全局 spamassassin 贝叶斯数据库时才有效,即,如果您的电子邮件用户是虚拟的,而不是作为 unix 用户帐户添加的。
首先,您需要创建邮件训练脚本,/etc/dovecot/dovecot-mailtrain.sh
为了方便起见,我创建了我的脚本,并具有适当的权限,以便 dovecot 可以执行它:
#!/bin/bash
root_dir='/var/lib/mailtrain'
# Determine which are the right and wrong directories
[ "$1" = 'ham' ] && { add='ham'; remove='spam'; } || { add='spam'; remove='ham'; }
# Generate a unique ID for the message while saving to tmp
trap '[ -e "$root_dir/tmp/$$" ] && rm -f "$root_dir/tmp/$$" 2>/dev/null' INT HUP TERM EXIT
sha=$(cat | tee "$root_dir/tmp/$$" | shasum -a 256 | awk '{print $1}')
# Remove file if it already exists in the wrong folder
[ -e "$root_dir/$remove/$sha" ] && rm "$root_dir/$remove/$sha"
# Move tmp file into correct folder
mv "$root_dir/tmp/$$" "$root_dir/$add/$sha"
exit 0
笔记:我正在生成唯一的文件名,shasums
因为我发现此时我不能依赖于已赋予唯一消息 ID 的消息。
您需要创建/var/lib/mailtrain
目录并使 dovecot 可以访问它,然后为 创建三个子目录spam
,ham
并且tmp
dovecot 可以写入这些子目录。
接下来是配置 dovecot。为此,我决定创建一个新文件,如下/etc/dovecot/conf.d/90-antispam.conf
所示:
### Dovecot Anti-Spam ###
# Automatically sends spam to sa-learn to parse as --spam or --ham
# if they are moved to or from the Spam mailbox respectively
plugin {
antispam_backend = pipe
antispam_pipe_program = /etc/dovecot/dovecot-mailtrain.sh
antispam_pipe_program_spam_arg = spam
antispam_pipe_program_notspam_arg = ham
antispam_pipe_tmpdir = /tmp
# Mailboxes to respond to
antispam_spam = Spam;Junk
antispam_trash = Deleted Messages;Trash
#antispam_unsure = Virus
}
不幸的是,这似乎只能通过邮箱名称进行操作,因此如果用户创建一个名称未被识别为垃圾邮件或垃圾邮件的邮箱,那么即使它被指定用于垃圾邮件/垃圾邮件用途,也可能无法正确处理。
移动到垃圾邮件文件夹的邮件service dovecot reload
现在将出现在 下/var/lib/mailtrain/spam
,而移出垃圾邮件文件夹的邮件将出现在 下/var/lib/mailtrain/ham
,脚本将确保邮件不会同时出现在两个文件夹中。因此,最后一步是创建一个脚本,用于实际将这些邮件导入为垃圾邮件/正常邮件:
#!/bin/bash
root_dir='/var/lib/mailtrain'
sa-learn --no-sync --spam "$root_dir/spam" && find "$root_dir/spam" -mindepth 1 -delete
sa-learn --no-sync --ham "$root_dir/ham" && find "$root_dir/ham" -mindepth 1 -delete
sa-learn --sync
这样会在导入每个文件夹的内容后将其清除,然后在两个文件夹都导入后运行一次同步操作,而不是同步两次。将此脚本存储在适合作为 cronjob 运行的地方,然后使用 安排它crontab -e
。您可以以 root 身份执行此操作,但理想情况下应该将 cronjob 交给另一个用户,但他们需要同时拥有这两个文件夹的访问权限(以及对其子目录的写访问权限),并且是或组(拥有 的任何组)/var/lib/mailtrain
的成员。我通过将 dovecot 添加到组然后通过 给它 cronjob 来实现这一点。spamd
debian-spamd
/var/lib/spamassassin
spamd
usermod -a -G spamd dovecot
cronjob -u dovecot -e
通过此设置,spamassassin 将根据用户对它的操作自动学习垃圾邮件/正常邮件,但是,如果它之前没有经过训练,您仍然需要给它一些初始消息来学习。幸运的是,现在可以使用任何合适的邮件客户端轻松完成此操作;将一堆正常邮件导入临时邮箱,将它们移入垃圾邮件邮箱,然后将它们移出。然后取出一堆垃圾邮件,导入临时邮箱,然后将它们移入垃圾邮件邮箱。现在您应该在/var/lib/mailtrain/spam
和下有一堆消息/var/lib/mailtrain/ham
,一旦sa-learn
导入了至少两百封,spamassassin 就可以开始向您的消息添加垃圾邮件标头了。