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.

  1. Leggi

    Il messaggio viene analizzato e il suo testo normalizzato: lettere stilizzate, caratteri invisibili e alfabeti sosia vengono ricondotti alla forma originale.

  2. Controlla

    I controlli del classificatore, dei link, degli allegati, dell'autenticazione, delle blocklist e delle regole vengono eseguiti contemporaneamente, ciascuno con un timeout.

  3. Punteggio

    Ogni test aggiunge o toglie punti. A 5 un messaggio è spam; a 15 un server di posta dovrebbe rifiutarlo.

  4. 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

Guardalo in 1:58

Come viene calcolato il punteggio di un messaggio, come viene letta ogni lingua, quando viene consultato un modello linguistico e come si integra con Postfix, Exim, Haraka e Node.js.

Narrazione in inglese, con sottotitoli in inglese.

Il fotogramma del titolo del video: il logo di Spam Scanner.

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 decide
  • Ogni 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.

    Lingue
  • Phishing

    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 antiphishing
  • Allegati

    Eseguibili riconosciuti dai loro byte, anche se rinominati in .pdf; doppie estensioni; programmi in file ZIP; macro di Office; PDF attivi; ClamAV.

    Controlli sugli allegati
  • Autenticazione

    SPF, DKIM, DMARC e ARC, DNS blocklist, liste di consenso e di blocco e una regola per la posta che falsifica il tuo dominio.

    Autenticazione
  • Modelli 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 test e i suoi puntiCome funziona

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

Inglese camuffato

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

Cinese, senza spazi

恭喜您获得一百万元大奖

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

Segmentato con un dizionario

Thailandese, senza spazi

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

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

Segmentato con un dizionario

Russo

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

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

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.

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

Un 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

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
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

Con contorno: gira sulla tua macchina. I dati personali vengono rimossi prima che un messaggio vada a un provider in hosting.

OllamaHugging FaceLicenzaDimensione
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

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".

Addestramento

Messaggi esclusi dall'addestramentoMessaggiPrecisioneRichiamoFalsi positivi
inglese6564100,0%97,1%0,0%
russo1682100,0%97,4%0,0%
italiano138998,1%85,3%1,8%
tedesco130997,7%76,1%2,2%
spagnolo128197,5%82,6%2,6%
Tutti13.84099,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.