Spamassassin 与 Dovecot mdbox 兼容性

Spamassassin 与 Dovecot mdbox 兼容性

因此,我正在考虑使用 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 可以访问它,然后为 创建三个子目录spamham并且tmpdovecot 可以写入这些子目录。

接下来是配置 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 来实现这一点。spamddebian-spamd/var/lib/spamassassinspamdusermod -a -G spamd dovecotcronjob -u dovecot -e

通过此设置,spamassassin 将根据用户对它的操作自动学习垃圾邮件/正常邮件,但是,如果它之前没有经过训练,您仍然需要给它一些初始消息来学习。幸运的是,现在可以使用任何合适的邮件客户端轻松完成此操作;将一堆正常邮件导入临时邮箱,将它们移入垃圾邮件邮箱,然后将它们移出。然后取出一堆垃圾邮件,导入临时邮箱,然后将它们移入垃圾邮件邮箱。现在您应该在/var/lib/mailtrain/spam和下有一堆消息/var/lib/mailtrain/ham,一旦sa-learn导入了至少两百封,spamassassin 就可以开始向您的消息添加垃圾邮件标头了。

相关内容