Filtr antyspamowy, który czyta każdy język i wyjaśnia każdą decyzję.
Spam Scanner wyłapuje spam, phishing, oszustwa i złośliwe oprogramowanie dla Node.js, wiersza poleceń i serwerów pocztowych, takich jak Postfix, Exim i Haraka. Każdy wynik wymienia testy, które zadziałały, i podaje powód.
npm install -g spamscanner
- Node.js 18+
- Milter, spamd, HTTP
- Ollama, Claude, ChatGPT
- Bez telemetrii
$ 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
Jak oceniana jest wiadomość
Każda kontrola dodaje lub odejmuje punkty, a decyduje suma. Progi i punkty można zmienić i nic nie jest czarną skrzynką: wynik wymienia każdy test.
Czytaj
Wiadomość jest parsowana, a jej tekst normalizowany: stylizowane litery, niewidoczne znaki i podobnie wyglądające alfabety są odwracane.
Sprawdź
Klasyfikator oraz kontrole linków, załączników, uwierzytelnienia, czarnych list i reguł działają równocześnie, każda z limitem czasu.
Wynik
Każdy test dodaje lub odejmuje punkty. Od 5 wiadomość jest spamem; od 15 serwer pocztowy powinien ją odrzucić.
Zapytaj
Trudne przypadki mogą trafić do modelu językowego, który dodaje do 6 punktów lub odejmuje do 3.
- poniżej 5przyjmij
- od 5 do 15oznacz jako spam
- 15 i więcejodrzuć
Co sprawdza
Słowa to jeden sygnał. Linki, nadawcy, załączniki i uwierzytelnienie mówią tyle samo i żaden z nich nie zależy od języka wiadomości.
Klasyfikator dla każdego pisma
Słowa, pary słów, linki, nadawcy, HTML i załączniki, liczone i łączone tak jak w SpamBayes, z uczciwym „niepewne”, gdy wskazówki są sprzeczne.
Jak podejmuje decyzjęKażdy język, starannie
Podział na słowa według Unicode dla chińskiego, japońskiego i tajskiego, odwracanie maskowania i brak kary za język, w którym model widział mało hamu.
JęzykiPhishing
Podobne domeny z cyrylicą lub zamienionymi literami, linki, których tekst pokazuje inny adres, marki w nazwach wyświetlanych oraz resolver Cloudflare blokujący złośliwe oprogramowanie.
Kontrole phishinguZałączniki
Pliki wykonywalne rozpoznawane po bajtach, także po zmianie nazwy na .pdf; podwójne rozszerzenia; programy w plikach ZIP; makra Office; aktywne pliki PDF; ClamAV.
Kontrole załącznikówUwierzytelnianie
SPF, DKIM, DMARC i ARC, czarne listy DNS, listy dozwolonych i zablokowanych oraz reguła dla poczty, która podszywa się pod twoją własną domenę.
UwierzytelnianieModele językowe
Trudne przypadki trafiają do modelu: Ollama na twoim komputerze albo Claude, ChatGPT, Gemini i dowolny serwer zgodny z OpenAI.
Modele językowe
Każdy język, bez zgadywania
Słowa są wyznaczane według reguł Unicode, więc działają też języki pisane bez spacji, a maskowanie jest odwracane przed liczeniem. Oto słowa, które liczy klasyfikator, obliczone podczas budowania tej strony.
Język, w którym dołączony model widział mało hamu, dostaje „niepewne” zamiast „spam”, więc zwykła poczta po arabsku czy koreańsku nigdy nie jest oznaczana z powodu pisma. Języki
Claim your fr␣ee prіze: V1agra 𝐅𝐑𝐄𝐄
- claim
- your
- free
- prize
- viagra
- free
Spacja o zerowej szerokości, cyrylickie і, cyfra zamiast litery i matematyczne litery pogrubione
恭喜您获得一百万元大奖
- 恭喜
- 您
- 获得
- 一
- 百万
- 元
- 大奖
Dzielony na słowa za pomocą słownika
ยินดีด้วยคุณได้รับรางวัลหนึ่งล้านบาท
- ยินดี
- ด้วย
- คุณ
- ได้
- รับ
- รางวัล
- หนึ่ง
- ล้าน
- บาท
Dzielony na słowa za pomocą słownika
Поздравляем! Вы выиграли миллион
- поздравляем
- вы
- выиграли
- миллион
Małe litery według reguł Unicode
Łączy się z twoim serwerem pocztowym
Milter dla Postfix i Sendmail, serwer spamd zgodny ze SpamAssassin dla spamc, Exim i Haraka, filtr treści, HTTP API, serwer TCP oraz biblioteka.
Wszystkie dodają nagłówki X-Spam-Flag, X-Spam-Score, X-Spam-Status i usuwają te, które podrobił nadawca.
spamscanner milter --port 7831 --auth --subject-tag "[SPAM]"
# /etc/postfix/main.cf
smtpd_milters = inet:127.0.0.1:7831
milter_default_action = acceptMilter sprawdza pocztę w trakcie sesji SMTP, więc spam na progu odrzucenia zostaje odrzucony, zanim zostanie przyjęty. Poradnik Postfix
spamscanner spamd --port 783 --auth
spamc -c < message.eml # prints 16.3/5.0 and exits 1Serwer spamd zgodny ze SpamAssassin: zatrzymaj spamd, uruchom Spam Scanner na tym samym porcie, a klienci SpamAssassin działają dalej. Poradnik 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
}Biblioteka dla smtp-server, wtyczek Haraka lub dowolnej usługi obsługującej pocztę. Dokumentacja 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"Dla każdego języka programowania i każdego serwera, który potrafi wysłać żądanie HTTP. Poradnik HTTP API
Model językowy do trudnych przypadków
Oczywisty spam i oczywisty ham nigdy do niego nie trafiają. Gdy wynik jest bliski progu albo klasyfikator nie jest pewny, model czyta wiadomość i odpowiada: spam, phishing, oszustwo, złośliwe oprogramowanie lub ham. Uruchom model na własnym komputerze albo użyj hostowanego, z dowolnym adresem URL, portem i uwierzytelnianiem.
Instrukcje ukryte w wiadomości dla filtrów AI są punktowane jako spam, a model dostaje informację, że wiadomość to dane. Testy end-to-end sprawdzają to na prawdziwym modelu przez 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:4bZ obramowaniem: działa na twoim komputerze. Dane osobowe są usuwane, zanim wiadomość trafi do dostawcy hostowanego.
| Ollama | Licencja | Rozmiar |
|---|---|---|
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 |
Zalecane otwarte modele. Wszystkie rekomendacje
Zmierzony i dający się trenować
Dołączony model jest trenowany na publicznych zbiorach danych i testowany na wiadomościach, których nie widział. Model wytrenowany na twojej własnej poczcie radzi sobie lepiej: wytrenuj go z plików mbox, katalogów Maildir lub zbiorów danych, zmierz go i ucz go z przycisków „zgłoś spam”.
| Wiadomości odłożone | Wiadomości | Precyzja | Czułość | Fałszywe alarmy |
|---|---|---|---|---|
| angielski | 6564 | 100,0% | 97,1% | 0,0% |
| rosyjski | 1682 | 100,0% | 97,4% | 0,0% |
| włoski | 1389 | 98,1% | 85,3% | 1,8% |
| niemiecki | 1309 | 97,7% | 76,1% | 2,2% |
| hiszpański | 1281 | 97,5% | 82,6% | 2,6% |
| Wszystkie | 13 840 | 99,2% | 85,1% | 0,6% |
Sam klasyfikator, na co dziesiątej wiadomości z jego publicznych danych treningowych, odłożonej z treningu. Wiadomości niepewne liczą się jako pominięte. Niemiecki, włoski i hiszpański pochodzą z syntetycznych zbiorów danych z niedokładnymi etykietami. O dołączonym modelu
Zbudowany dla Forward Email
Forward Email nie przechowuje logów z treścią wiadomości, więc nie mógł wysyłać poczty do zewnętrznej usługi filtrującej. Spam Scanner działa na twoich własnych serwerach, niczego nigdzie nie wysyła, jeśli nie zostanie tak skonfigurowany, i wyjaśnia każdą decyzję bez czytania poczty przez człowieka. Forward Email i aktualizacja
Projekt Forward Email, usługi poczty e-mail nastawionej na prywatność.
