Перейти к содержанию

Работа с данными спама

Обучение Spam и Ham

Rspamd обучается помечать письма как спам или хам (полезная почта), когда вы перемещаете сообщение в папку «Спам» или из нее в любой другой почтовый ящик, кроме корзины. Это реализовано с помощью Sieve-плагина sieve_imapsieve и скриптов парсера.

Rspamd также обучается автоматически при обнаружении высокого или низкого балла (см. https://rspamd.com/doc/configuration/statistic.html#autolearning). Плагин настроен на поддержание разумного соотношения между обучением на спаме и хаме.

Статистика Байеса записывается в Redis под ключами BAYES_HAM и BAYES_SPAM.

Помимо Байеса, используется локальное хранилище fuzzy-хешей для обучения повторяющимся шаблонам в тексте или изображениях, указывающим на хам или спам.

Вы также можете использовать веб-интерфейс Rspamd для обучения или настройки определенных параметров Rspamd.

Обучение Spam или Ham из существующей директории

Вы можете использовать однострочную команду для обучения на письмах в текстовом формате (без сжатия):

# Ham
for file in /my/folder/cur/*; do docker exec -i $(docker compose ps -q rspamd-animails) rspamc learn_ham < $file; done
# Spam
for file in /my/folder/.Junk/cur/*; do docker exec -i $(docker compose ps -q rspamd-animails) rspamc learn_spam < $file; done
# Ham
for file in /my/folder/cur/*; do docker exec -i $(docker-compose ps -q rspamd-animails) rspamc learn_ham < $file; done
# Spam
for file in /my/folder/.Junk/cur/*; do docker exec -i $(docker-compose ps -q rspamd-animails) rspamc learn_spam < $file; done

Рассмотрите возможность подключения локальной папки как нового тома (volume) для rspamd-animails в docker-compose.yml и обучения на файлах внутри контейнера. Это можно использовать как обходной путь для парсинга сжатых данных с помощью zcat. Пример:

for file in /data/old_mail/.Junk/cur/*; do rspamc learn_spam < zcat $file; done

Сброс обученных данных (Bayes, Neural)

Для сброса обученных данных необходимо удалить ключи в Redis, поэтому сначала создайте копию базы данных Redis:

Копия базы данных Redis

# Рекомендуется остановить Redis перед копированием файла.
cp /var/lib/docker/volumes/animailsdockerized_redis-vol-1/_data/dump.rdb /root/

Сброс данных Байеса

source animails.conf
docker compose exec redis-animails sh -c 'redis-cli -a ${REDISPASS} --scan --pattern BAYES_* | xargs redis-cli -a ${REDISPASS} del'
docker compose exec redis-animails sh -c 'redis-cli -a ${REDISPASS} --scan --pattern RS* | xargs redis-cli -a ${REDISPASS} del'
source animails.conf
docker-compose exec redis-animails sh -c 'redis-cli -a ${REDISPASS} --scan --pattern BAYES_* | xargs redis-cli -a ${REDISPASS} del'
docker-compose exec redis-animails sh -c 'redis-cli -a ${REDISPASS} --scan --pattern RS* | xargs redis-cli -a ${REDISPASS} del'

Сброс нейронных данных (Neural)

source animails.conf
docker compose exec redis-animails sh -c 'redis-cli -a ${REDISPASS} --scan --pattern rn_* | xargs redis-cli -a ${REDISPASS} del'
source animails.conf
docker-compose exec redis-animails sh -c 'redis-cli -a ${REDISPASS} --scan --pattern rn_* | xargs redis-cli -a ${REDISPASS} del'

Сброс данных Fuzzy

source animails.conf
# Сначала нужно войти в redis-cli:
docker compose exec redis-animails redis-cli -a ${REDISPASS}
# В redis-cli:
127.0.0.1:6379> EVAL "for i, name in ipairs(redis.call('KEYS', ARGV[1])) do redis.call('DEL', name); end" 0 fuzzy*
source animails.conf
# Сначала нужно войти в redis-cli:
docker-compose exec redis-animails redis-cli -a ${REDISPASS}
# В redis-cli:
127.0.0.1:6379> EVAL "for i, name in ipairs(redis.call('KEYS', ARGV[1])) do redis.call('DEL', name); end" 0 fuzzy*

Информация

Если redis-cli выдает ошибку...

(error) ERR wrong number of arguments for 'del' command
...значит паттерн ключей не найден, и данные для удаления отсутствуют — это нормально.