Собственный спам-фильтр
Spam Scanner работает на вашем сервере и оставляет почту там. Модель классификатора входит в пакет, нет ни телеметрии, ни проверки обновлений, а по умолчанию он отправляет только DNS-запрос об имени хоста каждой ссылки.
Что покидает сервер#
По умолчанию только имена хостов из ссылок в письме. Они проверяются на фильтрующих резолверах Cloudflare (1.1.1.2 и 1.1.1.3) обычными DNS-запросами, и никакая часть письма или его адресов не отправляется. --no-cloudflare отключает и это.
Любая другая проверка, которая использует сеть, выключена, пока вы её не включите:
| Проверка | Включается | Что отправляет |
|---|---|---|
| SPF, DKIM, DMARC, ARC | --auth | DNS-запросы о записях отправителя |
| DNS-списки блокировки | --dnsbl, --uribl | IP-адрес клиента и домены ссылок, в виде DNS-запросов |
| ClamAV | --clamav | Вложения, вашему собственному clamd |
| Языковая модель | --llm | Краткое содержание письма, на указанный вами сервер |
Проверки не записываются в журнал и не сохраняются. Безопасность и конфиденциальность
Установка на сервер#
npm install --global spamscannerИли отдельный исполняемый файл со встроенными Node.js и моделью:
curl -fsSL https://github.com/spamscanner/spamscanner/releases/latest/download/install.sh | bashСкрипт установки перед установкой сверяет файл с SHA256SUMS релиза, а у каждого файла есть подписанная аттестация происхождения сборки, которую проверяет gh attestation verify. Файлы есть для Linux (x64 и arm64), macOS и Windows. Файлам для Linux нужна glibc, поэтому на Alpine устанавливайте через npm. Начало работы
Проверки обновлений нет. Чтобы обновиться, снова запустите команду установки: обе команды ставят последний релиз.
Запуск как служба#
Серверы milterMail filter: протокол из Sendmail, который также использует Postfix; позволяет отдельной программе проверять каждое письмо во время SMTP-сессии., HTTP, TCP и spamdДемон SpamAssassin. Его протокол используют spamc, Exim, Haraka и другие клиенты SpamAssassin. слушают 127.0.0.1, если --host не указывает иное. Запускайте их от непривилегированного пользователя, например под systemd:
[Service]
ExecStart=/usr/local/bin/spamscanner milter --port 7831 --auth --subject-tag [SPAM]
User=spamscanner
Group=spamscanner
Restart=on-failure
NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yesПолный юнит и его настройка приведены в руководстве по Postfix. Ни один из серверов не поддерживает TLS, поэтому для доступа с другой машины используйте частную сеть, SSH-туннель или обратный прокси с TLS.
Подключение почтового сервера#
| Почтовый сервер | Команда | Порт |
|---|---|---|
| Postfix или Sendmail | spamscanner milter | 7831 |
| Postfix, никогда не отклоняя почту | spamscanner filter, контентный фильтр | нет |
| Exim, Haraka или spamc | spamscanner spamd | 783 |
| Всё, что умеет HTTP | spamscanner http | 7832 |
| Простой TCP-клиент | spamscanner server | 7830 |
| Почтовый сервер на Node.js | import SpamScanner from 'spamscanner' | нет |
Серверы могут добавлять к письму заголовки X-Spam-Flag, X-Spam-Score и X-Spam-Status, а библиотека возвращает оценку и каждый сработавший тест. Руководства: спам-фильтр для Postfix, другие почтовые серверы и HTTP API.
Языковые модели локально#
Языковая модель необязательна и читает только спорные случаи: явный спам и явный hamНужная почта: противоположность спама. до неё не доходят. С OllamaПрограмма, которая загружает и запускает открытые языковые модели на вашей машине и предоставляет HTTP API. она работает на том же сервере, так что ни одно письмо его не покидает:
ollama pull qwen3.5:4b
spamscanner milter --llm ollama --llm-model qwen3.5:4bqwen3.5:4b работает на CPU. При облачном провайдере персональные данные удаляются из письма перед отправкой. Языковые модели
Обучение на своей почте#
Встроенная модель обучена на открытых наборах данных. Модель, обученная на почте, которую получает ваш сервер, работает лучше и остаётся на этом сервере:
spamscanner train --spam ~/Maildir/.Junk --ham ~/Maildir/cur --out /var/lib/spamscanner/model.json
SPAMSCANNER_MODEL=/var/lib/spamscanner/model.json spamscanner milterФайл модели хранит хешированные счётчики признаков, а не слова или текст писем. Обучение
Требования#
Node.js 18 или новее на Linux, macOS или Windows, а с отдельным исполняемым файлом ничего. ClamAVАнтивирусный движок с открытым исходным кодом. Его демон clamd проверяет файлы, переданные через сокет. и Ollama необязательны и работают как отдельные службы.