Ett spamfilter som läser alla språk och förklarar varje beslut.
Spam Scanner fångar spam, nätfiske, bedrägerier och skadlig kod för Node.js, kommandoraden och e-postservrar som Postfix, Exim och Haraka. Varje resultat listar de tester som slog till och varför.
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
Hur ett meddelande bedöms
Varje kontroll lägger till eller drar av poäng, och summan avgör. Gränsvärden och poäng kan ändras, och ingenting är en svart låda: resultatet namnger varje test.
Läs
Meddelandet tolkas och dess text normaliseras: stiliserade bokstäver, osynliga tecken och förväxlingsbara alfabet återställs.
Kontrollera
Kontrollerna för klassificerare, länkar, bilagor, autentisering, blocklistor och regler körs samtidigt, var och en med en tidsgräns.
Poäng
Varje test lägger till eller drar av poäng. Vid 5 är ett meddelande spam; vid 15 bör en e-postserver neka det.
Fråga
Gränsfall kan skickas till en språkmodell, som lägger till upp till 6 poäng eller drar av upp till 3.
- under 5acceptera
- 5 till 15märk som spam
- 15 och uppåtavvisa
Vad det kontrollerar
Ord är en signal. Länkar, avsändare, bilagor och autentisering säger lika mycket, och ingen av dem beror på meddelandets språk.
En klassificerare för varje skriftsystem
Ord, ordpar, länkar, avsändare, HTML och bilagor, räknade och kombinerade på samma sätt som SpamBayes gör, med ett ärligt ”osäker” när ledtrådarna går isär.
Hur det avgörAlla språk, med omsorg
Unicode-ordsegmentering för kinesiska, japanska och thailändska, förklädnader som återställs, och inget straff för ett språk som modellen sett lite ham på.
SpråkNätfiske
Förväxlingsbara domäner med kyrilliska eller omkastade bokstäver, länkar vars text visar en annan adress, varumärken i visningsnamn och Cloudflares resolver mot skadlig kod.
Kontroll av nätfiskeBilagor
Körbara filer som känns igen på sina byte, även när de bytt namn till .pdf; dubbla filändelser; program i ZIP-filer; Office-makron; aktiva PDF-filer; ClamAV.
Kontroll av bilagorAutentisering
SPF, DKIM, DMARC och ARC, DNS-blocklistor, tillåt- och blocklistor samt en regel för e-post som förfalskar din egen domän.
AutentiseringSpråkmodeller
Gränsfall går till en modell: Ollama på din egen dator, eller Claude, ChatGPT, Gemini och alla OpenAI-kompatibla servrar.
Språkmodeller
Alla språk, utan gissningar
Ord hittas med Unicode-reglerna, så språk som skrivs utan mellanslag fungerar, och förklädnader återställs innan ord räknas. Det här är de ord som klassificeraren räknar, beräknade när den här sidan byggdes.
Ett språk som den medföljande modellen sett lite ham på får ”osäker” i stället för ”spam”, så vanlig e-post på arabiska eller koreanska flaggas aldrig på grund av sitt skriftsystem. Språk
Claim your fr␣ee prіze: V1agra 𝐅𝐑𝐄𝐄
- claim
- your
- free
- prize
- viagra
- free
Ett nollbreddsmellanslag, ett kyrilliskt і, en siffra i stället för en bokstav och matematiska fetstilta bokstäver
恭喜您获得一百万元大奖
- 恭喜
- 您
- 获得
- 一
- 百万
- 元
- 大奖
Segmenterad med en ordlista
ยินดีด้วยคุณได้รับรางวัลหนึ่งล้านบาท
- ยินดี
- ด้วย
- คุณ
- ได้
- รับ
- รางวัล
- หนึ่ง
- ล้าน
- บาท
Segmenterad med en ordlista
Поздравляем! Вы выиграли миллион
- поздравляем
- вы
- выиграли
- миллион
Gemener enligt Unicode-reglerna
Kopplas in i din e-postserver
En milter för Postfix och Sendmail, en SpamAssassin-kompatibel spamd-server för spamc, Exim och Haraka, ett innehållsfilter, ett HTTP-API, en TCP-server och biblioteket.
Alla lägger till X-Spam-Flag, X-Spam-Score, X-Spam-Status-huvuden och tar bort sådana som en avsändare har förfalskat.
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 kontrollerar e-post under SMTP-sessionen, så spam som når gränsen för avvisning nekas innan den tas emot. Postfix-guide
spamscanner spamd --port 783 --auth
spamc -c < message.eml # prints 16.3/5.0 and exits 1En SpamAssassin-kompatibel spamd-server: stoppa spamd, starta Spam Scanner på samma port, så fortsätter SpamAssassin-klienterna att fungera. spamd-guide
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, för smtp-server, Haraka-insticksprogram eller vilken tjänst som helst som hanterar e-post. API-referens
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"För alla programspråk och alla servrar som kan göra en HTTP-förfrågan. Guide till HTTP-API:t
En språkmodell för gränsfallen
Tydlig spam och tydlig ham når den aldrig. När poängen ligger nära gränsen eller klassificeraren är osäker läser en modell meddelandet och svarar spam, nätfiske, bedrägeri, skadlig kod eller ham. Kör en på din egen dator eller använd en molnbaserad, med valfri URL, port och autentisering.
Instruktioner som gömts i ett meddelande för AI-filter poängsätts som spam, och modellen får veta att meddelandet är data. End-to-end-testerna kontrollerar detta mot en riktig 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:4bKonturmarkerad: körs på din egen dator. Personuppgifter tas bort innan ett meddelande skickas till en molnbaserad leverantör.
| Ollama | Licens | Storlek |
|---|---|---|
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 |
Rekommenderade öppna modeller. Alla rekommendationer
Uppmätt och träningsbar
Den medföljande modellen är tränad på offentliga dataset och testad på meddelanden den inte har sett. En modell som tränats på din egen e-post blir bättre: träna den från mbox-filer, Maildir-kataloger eller dataset, mät den och lär den från knappar för ”rapportera spam”.
| Undanhållna meddelanden | Meddelanden | Precision | Täckning | Falska positiva |
|---|---|---|---|---|
| engelska | 6 564 | 100,0 % | 97,1 % | 0,0 % |
| ryska | 1 682 | 100,0 % | 97,4 % | 0,0 % |
| italienska | 1 389 | 98,1 % | 85,3 % | 1,8 % |
| tyska | 1 309 | 97,7 % | 76,1 % | 2,2 % |
| spanska | 1 281 | 97,5 % | 82,6 % | 2,6 % |
| Alla | 13 840 | 99,2 % | 85,1 % | 0,6 % |
Enbart klassificeraren, på vart tionde meddelande i dess offentliga träningsdata, som hållits undan. Osäkra meddelanden räknas som missade. Tyska, italienska och spanska kommer från syntetiska dataset med brusiga etiketter. Om den medföljande modellen
Byggt för Forward Email
Forward Email sparar inga loggar över meddelandeinnehåll och kunde därför inte skicka e-post till en extern filtertjänst. Spam Scanner körs på dina egna servrar, skickar ingenting någonstans om det inte är konfigurerat att göra det, och förklarar varje beslut utan att någon person läser e-posten. Forward Email och uppgradering
Ett projekt från Forward Email, e-posttjänsten med fokus på integritet.
