Un filtro antispam che legge ogni lingua e spiega ogni decisione.
Spam Scanner intercetta spam, phishing, truffe e malware per Node.js, la riga di comando e server di posta come Postfix, Exim e Haraka. Ogni risultato elenca i test scattati e il motivo.
npm install -g spamscanner
- Node.js 18+
- Milter, spamd, HTTP
- Ollama, Claude, ChatGPT
- Nessuna telemetria
$ 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
Come viene giudicato un messaggio
Ogni controllo aggiunge o toglie punti, e decide il totale. Soglie e punti si possono modificare, e niente è una scatola nera: il risultato indica ogni test.
Leggi
Il messaggio viene analizzato e il suo testo normalizzato: lettere stilizzate, caratteri invisibili e alfabeti sosia vengono ricondotti alla forma originale.
Controlla
I controlli del classificatore, dei link, degli allegati, dell'autenticazione, delle blocklist e delle regole vengono eseguiti contemporaneamente, ciascuno con un timeout.
Punteggio
Ogni test aggiunge o toglie punti. A 5 un messaggio è spam; a 15 un server di posta dovrebbe rifiutarlo.
Chiedi
I casi dubbi possono passare a un modello linguistico, che aggiunge fino a 6 punti o ne toglie fino a 3.
- sotto 5accetta
- da 5 a 15marca come spam
- 15 e oltrerifiuta
Cosa controlla
Le parole sono un segnale. Link, mittenti, allegati e autenticazione dicono altrettanto, e nessuno di questi dipende dalla lingua del messaggio.
Un classificatore per ogni sistema di scrittura
Parole, coppie di parole, link, mittenti, HTML e allegati, contati e combinati come fa SpamBayes, con un onesto "incerto" quando gli indizi sono discordanti.
Come decideOgni lingua, con attenzione
Segmentazione Unicode delle parole per cinese, giapponese e thailandese, camuffamenti annullati e nessuna penalità per una lingua in cui il modello ha visto poco ham.
LinguePhishing
Domini sosia con lettere cirilliche o scambiate, link il cui testo mostra un altro indirizzo, marchi nei nomi visualizzati e il resolver antimalware di Cloudflare.
Controlli antiphishingAllegati
Eseguibili riconosciuti dai loro byte, anche se rinominati in .pdf; doppie estensioni; programmi in file ZIP; macro di Office; PDF attivi; ClamAV.
Controlli sugli allegatiAutenticazione
SPF, DKIM, DMARC e ARC, DNS blocklist, liste di consenso e di blocco e una regola per la posta che falsifica il tuo dominio.
AutenticazioneModelli linguistici
I casi dubbi passano a un modello: Ollama sulla tua macchina, oppure Claude, ChatGPT, Gemini e qualsiasi server compatibile con OpenAI.
Modelli linguistici
Ogni lingua, senza tirare a indovinare
Le parole vengono individuate con le regole Unicode, quindi funzionano anche le lingue scritte senza spazi, e i camuffamenti vengono annullati prima del conteggio. Queste sono le parole che il classificatore conta, calcolate quando questa pagina è stata generata.
Una lingua in cui il modello incluso ha visto poco ham riceve "incerto" invece di "spam", quindi la posta normale in arabo o coreano non viene mai segnalata per il suo sistema di scrittura. Lingue
Claim your fr␣ee prіze: V1agra 𝐅𝐑𝐄𝐄
- claim
- your
- free
- prize
- viagra
- free
Uno spazio a larghezza zero, una і cirillica, una cifra al posto di una lettera e lettere in grassetto matematico
恭喜您获得一百万元大奖
- 恭喜
- 您
- 获得
- 一
- 百万
- 元
- 大奖
Segmentato con un dizionario
ยินดีด้วยคุณได้รับรางวัลหนึ่งล้านบาท
- ยินดี
- ด้วย
- คุณ
- ได้
- รับ
- รางวัล
- หนึ่ง
- ล้าน
- บาท
Segmentato con un dizionario
Поздравляем! Вы выиграли миллион
- поздравляем
- вы
- выиграли
- миллион
Minuscole secondo le regole Unicode
Si integra con il tuo server di posta
Un milter per Postfix e Sendmail, un server spamd compatibile con SpamAssassin per spamc, Exim e Haraka, un content filter, un'API HTTP, un server TCP e la libreria.
Tutti aggiungono le intestazioni X-Spam-Flag, X-Spam-Score, X-Spam-Status e rimuovono quelle falsificate da un mittente.
spamscanner milter --port 7831 --auth --subject-tag "[SPAM]"
# /etc/postfix/main.cf
smtpd_milters = inet:127.0.0.1:7831
milter_default_action = acceptUn milter controlla la posta durante la sessione SMTP, quindi lo spam che raggiunge la soglia di rifiuto viene respinto prima di essere accettato. Guida a Postfix
spamscanner spamd --port 783 --auth
spamc -c < message.eml # prints 16.3/5.0 and exits 1Un server spamd compatibile con SpamAssassin: ferma spamd, avvia Spam Scanner sulla stessa porta e i client SpamAssassin continuano a funzionare. Guida a 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
}La libreria, per smtp-server, plugin di Haraka o qualsiasi servizio che gestisce la posta. Riferimento 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"Per qualsiasi linguaggio e qualsiasi server in grado di effettuare una richiesta HTTP. Guida all'API HTTP
Un modello linguistico per i casi dubbi
Lo spam evidente e l'ham evidente non arrivano mai al modello. Quando il punteggio è vicino alla soglia o il classificatore è incerto, un modello legge il messaggio e risponde spam, phishing, truffa, malware o ham. Eseguine uno sulla tua macchina o usane uno in hosting, con qualsiasi URL, porta e autenticazione.
Le istruzioni nascoste in un messaggio per i filtri IA ricevono punti di spam, e al modello viene detto che il messaggio è un dato. I test end-to-end lo verificano con un modello reale tramite 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:4bCon contorno: gira sulla tua macchina. I dati personali vengono rimossi prima che un messaggio vada a un provider in hosting.
| Ollama | Licenza | Dimensione |
|---|---|---|
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 |
Modelli aperti consigliati. Tutti i consigli
Misurato e addestrabile
Il modello incluso è addestrato su dataset pubblici e testato su messaggi che non ha visto. Un modello addestrato sulla tua posta funziona meglio: addestralo da file mbox, Maildir o dataset, misuralo e fallo imparare dai pulsanti "segnala spam".
| Messaggi esclusi dall'addestramento | Messaggi | Precisione | Richiamo | Falsi positivi |
|---|---|---|---|---|
| inglese | 6564 | 100,0% | 97,1% | 0,0% |
| russo | 1682 | 100,0% | 97,4% | 0,0% |
| italiano | 1389 | 98,1% | 85,3% | 1,8% |
| tedesco | 1309 | 97,7% | 76,1% | 2,2% |
| spagnolo | 1281 | 97,5% | 82,6% | 2,6% |
| Tutti | 13.840 | 99,2% | 85,1% | 0,6% |
Il solo classificatore, su un messaggio ogni dieci dei suoi dati di addestramento pubblici, escluso dall'addestramento. I messaggi incerti contano come mancati. Tedesco, italiano e spagnolo provengono da dataset sintetici con etichette imprecise. Il modello incluso
Creato per Forward Email
Forward Email non conserva log del contenuto dei messaggi, quindi non poteva inviare la posta a un servizio di filtraggio esterno. Spam Scanner gira sui tuoi server, non invia nulla da nessuna parte se non è configurato per farlo e spiega ogni decisione senza che una persona legga la posta. Forward Email e aggiornamento
Un progetto di Forward Email, il servizio email attento alla privacy.
