Спам-фильтр, который читает на любом языке и объясняет каждое решение.
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
Как оценивается письмо
Каждая проверка добавляет или снимает баллы, и решает сумма. Пороги и баллы можно менять, и ничто не работает как чёрный ящик: в результате указан каждый тест.
Разбор
Письмо разбирается, а текст нормализуется: стилизованные буквы, невидимые символы и похожие алфавиты приводятся к обычному виду.
Проверка
Классификатор и проверки ссылок, вложений, аутентификации, чёрных списков и правил выполняются одновременно, у каждой свой тайм-аут.
Подсчёт
Каждый тест добавляет или снимает баллы. При 5 баллах письмо считается спамом, при 15 почтовый сервер должен его отклонить.
Запрос к модели
Спорные случаи можно передать языковой модели, которая добавляет до 6 баллов или снимает до 3.
- ниже 5принять
- от 5 до 15пометить как спам
- 15 и вышеотклонить
Что проверяется
Слова лишь один из сигналов. Ссылки, отправители, вложения и аутентификация говорят не меньше, и ни один из них не зависит от языка письма.
Классификатор для любой письменности
Слова, пары слов, ссылки, отправители, 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 и удаляют те, что подделал отправитель.
spamscanner milter --port 7831 --auth --subject-tag "[SPAM]"
# /etc/postfix/main.cf
smtpd_milters = inet:127.0.0.1:7831
milter_default_action = acceptMilter проверяет почту во время SMTP-сессии, поэтому спам на пороге отклонения отвергается до приёма. Руководство по Postfix
spamscanner spamd --port 783 --auth
spamc -c < message.eml # prints 16.3/5.0 and exits 1Сервер spamd, совместимый со SpamAssassin: остановите spamd, запустите Spam Scanner на том же порту, и клиенты SpamAssassin продолжат работать. Руководство по spamd
import SpamScanner from 'spamscanner';
const scanner = new SpamScanner({authentication: true});
const result = await scanner.scan(stream, {session});
if (result.action === 'reject') {
// refuse with a 4xx or 5xx reply
}Библиотека для smtp-server, плагинов Haraka и любого сервиса, который обрабатывает почту. Справочник API
spamscanner http --port 7832 --token "$TOKEN"
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
--data-binary @message.eml "http://127.0.0.1:7832/scan?ip=203.0.113.5"Для любого языка программирования и любого сервера, способного отправить HTTP-запрос. Руководство по HTTP API
Языковая модель для спорных случаев
Явный спам и явный 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
ollama pull qwen3.5:4b
spamscanner llm-test --llm ollama --llm-model qwen3.5:4b
spamscanner milter --llm ollama --llm-model qwen3.5:4bС контуром: работает на вашей машине. Перед отправкой письма облачному провайдеру из него удаляются персональные данные.
| Ollama | Лицензия | Размер |
|---|---|---|
qwen3.5:0.8b | Apache-2.0 | 1.3 GB |
gemma4:e2b | Apache-2.0 | 4.6 GB |
qwen3.5:4b | Apache-2.0 | 3.3 GB |
qwen3.5:9b | Apache-2.0 | 6.6 GB |
gpt-oss-safeguard:20b | Apache-2.0 | 14 GB |
Рекомендуемые открытые модели. Все рекомендации
Измерено и обучаемо
Встроенная модель обучена на публичных наборах данных и проверена на письмах, которых не видела. Модель, обученная на вашей собственной почте, работает лучше: обучите её на файлах mbox, каталогах Maildir или наборах данных, измерьте качество и дообучайте по кнопкам «Это спам».
| Отложенные письма | Сообщения | Точность | Полнота | Ложные срабатывания |
|---|---|---|---|---|
| английский | 6 564 | 100,0 % | 97,1 % | 0,0 % |
| русский | 1 682 | 100,0 % | 97,4 % | 0,0 % |
| итальянский | 1 389 | 98,1 % | 85,3 % | 1,8 % |
| немецкий | 1 309 | 97,7 % | 76,1 % | 2,2 % |
| испанский | 1 281 | 97,5 % | 82,6 % | 2,6 % |
| Всего | 13 840 | 99,2 % | 85,1 % | 0,6 % |
Только классификатор, на каждом десятом письме из его публичных обучающих данных, отложенном при обучении. Письма с ответом «unsure» считаются пропущенными. Немецкий, итальянский и испанский взяты из синтетических наборов данных с шумной разметкой. О встроенной модели
Создан для Forward Email
Forward Email не хранит журналов с содержимым писем, поэтому не может отправлять почту во внешний сервис фильтрации. Spam Scanner работает на ваших серверах, ничего никуда не отправляет без соответствующей настройки и объясняет каждое решение без того, чтобы человек читал почту. Forward Email и обновление
Проект Forward Email, почтового сервиса, ориентированного на приватность.
