Назад | Перейти на главную страницу

Совместимость Spamassassin и Dovecot mdbox

Итак, я подумываю использовать формат Dovecot mdbox для хранения почты, однако я также буду использовать Spamassassin, и мне нужно будет передать ему папку электронных писем для применения его фильтров.

Можно ли это сделать напрямую из формата mdbox? Если нет, могу ли я извлечь часть или все содержимое почтового ящика mdbox удобным для Spamassassin способом? Если да, то можно ли направить его в spamassassin (вместо извлечения в папку)?

Мое решение этой проблемы состояло в том, чтобы настроить встроенную функцию Dovecot для защиты от спама / почтового транспорта для передачи сообщений в сценарий как спама / радиолюбителей, когда они передаются в / из моих ящиков нежелательной почты, соответственно, чтобы их можно было изучить с помощью задания cron. Хотя можно передавать сообщения 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 потому что я обнаружил, что на данный момент не могу полагаться на сообщения, которым был присвоен уникальный идентификатор сообщения.

Вам нужно будет создать /var/lib/mailtrain каталог и сделайте его доступным для dovecot, затем создайте три подкаталога для spam, ham и tmp этот голубятня может писать.

Далее нужно настроить голубятню. Для этого я решил создать новый файл под /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 (и доступ на запись к его подкаталогам), а также членство в spamd или debian-spamd группа (независимо от того, какие владельцы группы /var/lib/spamassassin. Я сделал это, добавив голубятню в spamd группа с usermod -a -G spamd dovecot затем предоставив ему задание cron через cronjob -u dovecot -e.

С этой настройкой spamassassin будет автоматически изучать спам / хам в зависимости от того, что с ним делают пользователи, однако, если он не был обучен раньше, вам все равно нужно будет отправить ему несколько начальных сообщений для изучения. К счастью, теперь это можно легко сделать с помощью любого подходящего почтового клиента; импортировать пачку любительских сообщений во временный почтовый ящик, переместить их в почтовый ящик для спама, а затем переместить обратно из него. Затем возьмите пачку спама, импортируйте во временный почтовый ящик и переместите в почтовый ящик для спама. Теперь у вас должна быть куча сообщений под /var/lib/mailtrain/spam и /var/lib/mailtrain/ham, один раз sa-learn импортировал не менее двухсот экземпляров каждого spamassassin, и будет готов начать добавлять заголовки спама в ваши сообщения.