Dovecot

Spamassassin 和 Dovecot mdbox 兼容性

  • January 26, 2016

所以我正在考慮使用 Dovecot 的 mdbox 格式來儲存郵件,但是我也將使用 Spamassassin 並且需要能夠將電子郵件文件夾傳遞給它以應用其過濾器。

這可以直接從 mdbox 格式完成嗎?如果沒有,是否有某種方法可以以 Spamassassin 友好的方式提取 mdbox 郵箱的部分或全部內容?如果是這樣,是否可以將其通過管道傳輸到 spamassassin(而不是必須提取到文件夾中)?

我對此的解決方案是配置 Dovecot 的內置反垃圾郵件/mailtrain 功能,以便在它們分別傳入/傳出我的垃圾郵箱時將消息作為垃圾郵件/火腿傳遞給腳本,以便可以使用 cron-job 來學習它們。雖然可以將消息sa-learn直接傳遞給這可能意味著學習意外錯誤歸檔,而且它比僅僅轉儲文件以備後用要慢得多。這也可能僅在使用全域 spamassassin 貝氏數據庫時有效,即如果您的電子郵件使用者是虛擬的而不是作為 unix 使用者帳戶添加的。

首先,您需要創建郵件培訓腳本,/etc/dovecot/dovecot-mailtran.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 訪問,然後為 和 dovecot 可以寫入的三個spam子目錄ham創建tmp

接下來是配置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(以及對其子目錄的寫訪問權限)以及作為spamdordebian-spamd組的成員(無論哪個組所有者) /var/lib/spamassassin. 我通過將 dovecot 添加到spamd組中來做到這一點,usermod -a -G spamd dovecot然後通過cronjob -u dovecot -e.

通過此設置,spamassassin 將根據使用者對它的操作自動學習垃圾郵件/火腿,但是,如果它沒有經過培訓,您仍然需要給它一些初始資訊來學習。幸運的是,現在可以使用任何適合郵件的郵件客戶端輕鬆完成此操作;將一堆火腿郵件導入臨時郵箱,將它們移入垃圾郵件郵箱,然後將它們移出。然後拿一堆垃圾郵件,導入到臨時郵箱,再移到垃圾郵箱。/var/lib/mailtrain/spam您現在應該在和下有一堆郵件/var/lib/mailtrain/ham,一旦sa-learn導入了每個 spamassassin 至少 200 個,就可以開始將垃圾郵件標題添加到您的郵件中。

引用自:https://serverfault.com/questions/751214