Спам-фильтр, который читает на любом языке и объясняет каждое решение.

Spam Scanner находит спам, фишинг, мошенничество и вредоносные программы для Node.js, командной строки и почтовых серверов, таких как Postfix, Exim и Haraka. В каждом результате перечислены сработавшие тесты и причины.

npm install -g spamscanner
  • Node.js 18+
  • Milter, spamd, HTTP
  • Ollama, Claude, ChatGPT
  • Без телеметрии
$ spamscanner scan message.eml
SPAM  score 16.3 (spam at 5.0, reject at 15.0)  action: reject  language: en
   +6.3  BAYES_999                    Classifier spam probability 99.9%
   +5.0  PHISHING_LOOKALIKE_DOMAIN    "paypa1-secure.top" imitates paypal by swapping characters
   +3.0  DECEPTIVE_LINK               A link shows "https://www.paypal.com/signin" but goes to paypa1-secure.top
   +2.0  FROM_NAME_BRAND              Display name says "paypal" but the message is from paypa1-secure.top
$ echo $?
1

Как оценивается письмо

Каждая проверка добавляет или снимает баллы, и решает сумма. Пороги и баллы можно менять, и ничто не работает как чёрный ящик: в результате указан каждый тест.

  1. Разбор

    Письмо разбирается, а текст нормализуется: стилизованные буквы, невидимые символы и похожие алфавиты приводятся к обычному виду.

  2. Проверка

    Классификатор и проверки ссылок, вложений, аутентификации, чёрных списков и правил выполняются одновременно, у каждой свой тайм-аут.

  3. Подсчёт

    Каждый тест добавляет или снимает баллы. При 5 баллах письмо считается спамом, при 15 почтовый сервер должен его отклонить.

  4. Запрос к модели

    Спорные случаи можно передать языковой модели, которая добавляет до 6 баллов или снимает до 3.

  • ниже 5принять
  • от 5 до 15пометить как спам
  • 15 и вышеотклонить

Обзор за 1:58

Как письмо получает баллы, как читается каждый язык, когда спрашивают языковую модель и как фильтр подключается к Postfix, Exim, Haraka и Node.js.

Озвучено на английском, с английскими субтитрами.

Титульный кадр видео: логотип Spam Scanner.

Что проверяется

Слова лишь один из сигналов. Ссылки, отправители, вложения и аутентификация говорят не меньше, и ни один из них не зависит от языка письма.

  • Классификатор для любой письменности

    Слова, пары слов, ссылки, отправители, HTML и вложения подсчитываются и объединяются так же, как в SpamBayes, с честным «unsure», когда признаки противоречат друг другу.

    Как принимается решение
  • Любой язык, бережно

    Разбиение на слова по правилам Unicode для китайского, японского и тайского, снятие маскировки и никаких штрафов за язык, на котором модель видела мало ham.

    Языки
  • Фишинг

    Похожие домены с кириллицей или переставленными буквами, ссылки, текст которых показывает другой адрес, бренды в отображаемых именах и резолвер Cloudflare, блокирующий вредоносные домены.

    Проверки на фишинг
  • Вложения

    Исполняемые файлы, распознанные по байтам, даже переименованные в .pdf; двойные расширения; программы в ZIP-архивах; макросы Office; активные PDF; ClamAV.

    Проверки вложений
  • Аутентификация

    SPF, DKIM, DMARC и ARC, чёрные списки в DNS, белые и чёрные списки и правило для писем, подделывающих ваш собственный домен.

    Аутентификация
  • Языковые модели

    Спорные случаи уходят модели: Ollama на вашей машине или Claude, ChatGPT, Gemini и любой сервер, совместимый с OpenAI.

    Языковые модели

Все тесты и их баллыКак это работает

Любой язык, без догадок

Слова выделяются по правилам Unicode, поэтому языки без пробелов тоже работают, а маскировка снимается до подсчёта. Ниже слова, которые считает классификатор; они вычислены при сборке этой страницы.

Если встроенная модель видела мало ham на каком-то языке, письмо на нём получает «unsure» вместо «spam», поэтому обычная почта на арабском или корейском никогда не помечается из-за письменности. Языки

Замаскированный английский

Claim your fr␣ee prіze: V1agra 𝐅𝐑𝐄𝐄

  • claim
  • your
  • free
  • prize
  • viagra
  • free

Пробел нулевой ширины, кириллическая і, цифра вместо буквы и математические полужирные буквы

Китайский, без пробелов

恭喜您获得一百万元大奖

  • 恭喜
  • 您
  • 获得
  • 一
  • 百万
  • 元
  • 大奖

Разбито на слова по словарю

Тайский, без пробелов

ยินดีด้วยคุณได้รับรางวัลหนึ่งล้านบาท

  • ยินดี
  • ด้วย
  • คุณ
  • ได้
  • รับ
  • รางวัล
  • หนึ่ง
  • ล้าน
  • บาท

Разбито на слова по словарю

Русский

Поздравляем! Вы выиграли миллион

  • поздравляем
  • вы
  • выиграли
  • миллион

Приведено к нижнему регистру по правилам Unicode

Подключается к вашему почтовому серверу

Milter для Postfix и Sendmail, совместимый со SpamAssassin сервер spamd для spamc, Exim и Haraka, контент-фильтр, HTTP API, TCP-сервер и библиотека.

Все они добавляют заголовки X-Spam-Flag, X-Spam-Score, X-Spam-Status и удаляют те, что подделал отправитель.

Shell
spamscanner milter --port 7831 --auth --subject-tag "[SPAM]"

# /etc/postfix/main.cf
smtpd_milters = inet:127.0.0.1:7831
milter_default_action = accept

Milter проверяет почту во время SMTP-сессии, поэтому спам на пороге отклонения отвергается до приёма. Руководство по Postfix

Языковая модель для спорных случаев

Явный спам и явный ham до неё не доходят. Когда оценка близка к порогу или классификатор не уверен, модель читает письмо и отвечает: спам, фишинг, мошенничество, вредоносная программа или ham. Запустите модель на своей машине или используйте облачную, с любым URL, портом и аутентификацией.

Скрытые в письме инструкции для ИИ-фильтров оцениваются как спам, а модели сообщается, что письмо является данными. Сквозные тесты проверяют это на реальной модели через Ollama.

  • Ollama
  • LM Studio
  • llama.cpp server
  • vLLM
  • LocalAI
  • Jan
  • OpenAI
  • Anthropic (Claude)
  • Google Gemini
  • Mistral AI
  • Groq
  • OpenRouter
  • DeepSeek
  • xAI
  • Together AI
  • Fireworks AI
  • Cerebras
  • Hugging Face Inference Providers
  • Azure OpenAI
  • Cloudflare Clef
  • Cloudflare Clef Flash
  • TypeSafe Jev
  • TypeSafe Jev on OpenRouter
  • Any decision model server
Shell
ollama pull qwen3.5:4b
spamscanner llm-test --llm ollama --llm-model qwen3.5:4b
spamscanner milter --llm ollama --llm-model qwen3.5:4b

С контуром: работает на вашей машине. Перед отправкой письма облачному провайдеру из него удаляются персональные данные.

OllamaHugging FaceЛицензияРазмер
qwen3.5:0.8bQwen/Qwen3.5-0.8BApache-2.01.3 GB
gemma4:e2bgoogle/gemma-4-E2B-itApache-2.04.6 GB
qwen3.5:4bQwen/Qwen3.5-4BApache-2.03.3 GB
qwen3.5:9bQwen/Qwen3.5-9BApache-2.06.6 GB
gpt-oss-safeguard:20bopenai/gpt-oss-safeguard-20bApache-2.014 GB

Рекомендуемые открытые модели. Все рекомендации

Измерено и обучаемо

Встроенная модель обучена на публичных наборах данных и проверена на письмах, которых не видела. Модель, обученная на вашей собственной почте, работает лучше: обучите её на файлах mbox, каталогах Maildir или наборах данных, измерьте качество и дообучайте по кнопкам «Это спам».

Обучение

Отложенные письмаСообщенияТочностьПолнотаЛожные срабатывания
английский6 564100,0 %97,1 %0,0 %
русский1 682100,0 %97,4 %0,0 %
итальянский1 38998,1 %85,3 %1,8 %
немецкий1 30997,7 %76,1 %2,2 %
испанский1 28197,5 %82,6 %2,6 %
Всего13 84099,2 %85,1 %0,6 %

Только классификатор, на каждом десятом письме из его публичных обучающих данных, отложенном при обучении. Письма с ответом «unsure» считаются пропущенными. Немецкий, итальянский и испанский взяты из синтетических наборов данных с шумной разметкой. О встроенной модели

Создан для Forward Email

Forward Email не хранит журналов с содержимым писем, поэтому не может отправлять почту во внешний сервис фильтрации. Spam Scanner работает на ваших серверах, ничего никуда не отправляет без соответствующей настройки и объясняет каждое решение без того, чтобы человек читал почту. Forward Email и обновление

Проект Forward Email, почтового сервиса, ориентированного на приватность.