Et spamfilter som leser alle språk og forklarer hver avgjørelse.
Spam Scanner fanger spam, phishing, svindel og skadevare for Node.js, kommandolinjen og e-postservere som Postfix, Exim og Haraka. Hvert resultat lister opp testene som slo ut, og hvorfor.
npm install -g spamscanner
- Node.js 18+
- Milter, spamd, HTTP
- Ollama, Claude, ChatGPT
- Ingen telemetri
$ 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
Slik vurderes en melding
Hver sjekk legger til eller trekker fra poeng, og summen avgjør. Terskler og poeng kan endres, og ingenting er en svart boks: resultatet navngir hver test.
Les
Meldingen tolkes og teksten normaliseres: stiliserte bokstaver, usynlige tegn og forvekslbare alfabeter blir gjort om.
Sjekk
Klassifisereren og sjekkene av lenker, vedlegg, autentisering, blokkeringslister og regler kjører samtidig, hver med en tidsgrense.
Poengsum
Hver test legger til eller trekker fra poeng. Ved 5 er en melding spam; ved 15 bør en e-postserver avvise den.
Spør
Vanskelige tilfeller kan sendes til en språkmodell, som legger til opptil 6 poeng eller trekker fra opptil 3.
- under 5godta
- 5 til 15merk som spam
- 15 og overavvis
Hva det sjekker
Ord er ett signal. Lenker, avsendere, vedlegg og autentisering sier like mye, og ingen av dem avhenger av språket i meldingen.
En klassifiserer for alle skriftsystemer
Ord, ordpar, lenker, avsendere, HTML og vedlegg, talt opp og kombinert slik SpamBayes gjør, med et ærlig «usikker» når indisiene spriker.
Slik avgjør detAlle språk, med omhu
Unicode-ordsegmentering for kinesisk, japansk og thai, forkledninger gjort om, og ingen straff for et språk modellen så lite ham på.
SpråkPhishing
Forvekslingsdomener med kyrilliske eller ombyttede bokstaver, lenker der teksten viser en annen adresse, merkenavn i visningsnavn og Cloudflares resolver mot skadevare.
Phishing-sjekkerVedlegg
Kjørbare filer funnet ut fra bytene, også når de er omdøpt til .pdf; doble filendelser; programmer i ZIP-filer; Office-makroer; aktive PDF-er; ClamAV.
VedleggssjekkerAutentisering
SPF, DKIM, DMARC og ARC, DNS-blokkeringslister, tillatelses- og blokkeringslister og en regel for e-post som forfalsker ditt eget domene.
AutentiseringSpråkmodeller
Vanskelige tilfeller går til en modell: Ollama på din egen maskin, eller Claude, ChatGPT, Gemini og enhver OpenAI-kompatibel server.
Språkmodeller
Alle språk, uten gjetting
Ord finnes med Unicode-reglene, så språk som skrives uten mellomrom, fungerer, og forkledninger gjøres om før opptellingen. Dette er ordene klassifisereren teller, beregnet da denne siden ble bygget.
Et språk den medfølgende modellen så lite ham på, får «usikker» i stedet for «spam», så vanlig e-post på arabisk eller koreansk blir aldri flagget på grunn av skriftsystemet. Språk
Claim your fr␣ee prіze: V1agra 𝐅𝐑𝐄𝐄
- claim
- your
- free
- prize
- viagra
- free
Et mellomrom med null bredde, en kyrillisk і, et siffer i stedet for en bokstav og matematiske fete bokstaver
恭喜您获得一百万元大奖
- 恭喜
- 您
- 获得
- 一
- 百万
- 元
- 大奖
Segmentert med en ordbok
ยินดีด้วยคุณได้รับรางวัลหนึ่งล้านบาท
- ยินดี
- ด้วย
- คุณ
- ได้
- รับ
- รางวัล
- หนึ่ง
- ล้าน
- บาท
Segmentert med en ordbok
Поздравляем! Вы выиграли миллион
- поздравляем
- вы
- выиграли
- миллион
Gjort om til små bokstaver etter Unicode-reglene
Kobles til e-postserveren din
En milter for Postfix og Sendmail, en SpamAssassin-kompatibel spamd-server for spamc, Exim og Haraka, et innholdsfilter, et HTTP API, en TCP-server og biblioteket.
Alle legger til X-Spam-Flag, X-Spam-Score, X-Spam-Status-hoder og fjerner slike hoder som en avsender har forfalsket.
spamscanner milter --port 7831 --auth --subject-tag "[SPAM]"
# /etc/postfix/main.cf
smtpd_milters = inet:127.0.0.1:7831
milter_default_action = acceptEn milter sjekker e-post under SMTP-økten, så spam som når avvisningsterskelen, blir avvist før den er mottatt. Veiledning for Postfix
spamscanner spamd --port 783 --auth
spamc -c < message.eml # prints 16.3/5.0 and exits 1En SpamAssassin-kompatibel spamd-server: stopp spamd, start Spam Scanner på samme port, og SpamAssassin-klientene fortsetter å virke. Veiledning for 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
}Biblioteket, for smtp-server, Haraka-tillegg eller enhver tjeneste som håndterer e-post. API-referanse
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"For alle programmeringsspråk og alle servere som kan sende en HTTP-forespørsel. Veiledning for HTTP API
En språkmodell for de vanskelige tilfellene
Tydelig spam og tydelig ham når aldri frem dit. Når poengsummen er nær terskelen eller klassifisereren er usikker, leser en modell meldingen og svarer spam, phishing, svindel, skadevare eller ham. Kjør en på din egen maskin, eller bruk en driftet modell, med hvilken som helst URL, port og autentisering.
Instruksjoner til KI-filtre som er skjult i en melding, får poeng som spam, og modellen får beskjed om at meldingen er data. Ende-til-ende-testene sjekker dette mot en ekte modell via 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:4bMed omriss: kjører på din egen maskin. Personopplysninger fjernes før en melding sendes til en driftet leverandør.
| Ollama | Lisens | Størrelse |
|---|---|---|
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 |
Anbefalte åpne modeller. Alle anbefalinger
Målt, og kan trenes
Den medfølgende modellen er trent på offentlige datasett og testet på meldinger den ikke har sett. En modell trent på din egen e-post gjør det bedre: tren den fra mbox-filer, Maildir-mapper eller datasett, mål den, og lær den opp fra «rapporter spam»-knapper.
| Tilbakeholdte meldinger | Meldinger | Presisjon | Gjenkalling | Falske positiver |
|---|---|---|---|---|
| engelsk | 6 564 | 100,0 % | 97,1 % | 0,0 % |
| russisk | 1 682 | 100,0 % | 97,4 % | 0,0 % |
| italiensk | 1 389 | 98,1 % | 85,3 % | 1,8 % |
| tysk | 1 309 | 97,7 % | 76,1 % | 2,2 % |
| spansk | 1 281 | 97,5 % | 82,6 % | 2,6 % |
| Alle | 13 840 | 99,2 % | 85,1 % | 0,6 % |
Klassifisereren alene, på hver tiende melding fra de offentlige treningsdataene, holdt tilbake. Usikre meldinger teller som bommet. Tysk, italiensk og spansk kommer fra syntetiske datasett med upålitelige etiketter. Om den medfølgende modellen
Laget for Forward Email
Forward Email lagrer ingen logger over meldingsinnhold og kunne derfor ikke sende e-post til en ekstern filtreringstjeneste. Spam Scanner kjører på dine egne servere, sender ingenting noe sted med mindre det er konfigurert til det, og forklarer hver avgjørelse uten at et menneske leser e-posten. Forward Email og oppgradering
Et prosjekt fra Forward Email, e-posttjenesten med fokus på personvern.
