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.

  1. Läs

    Meddelandet tolkas och dess text normaliseras: stiliserade bokstäver, osynliga tecken och förväxlingsbara alfabet återställs.

  2. Kontrollera

    Kontrollerna för klassificerare, länkar, bilagor, autentisering, blocklistor och regler körs samtidigt, var och en med en tidsgräns.

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

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

Se det på 1:58

Hur ett meddelande poängsätts, hur alla språk läses, när en språkmodell tillfrågas och hur det kopplas in i Postfix, Exim, Haraka och Node.js.

Berättad på engelska, med engelska undertexter.

Videons titelbild: Spam Scanner-logotypen.

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ör
  • Alla 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åk
  • Nä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ätfiske
  • Bilagor

    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 bilagor
  • Autentisering

    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.

    Autentisering
  • Språ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 tester och deras poängSå fungerar det

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

Förklädd engelska

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

Kinesiska, utan mellanslag

恭喜您获得一百万元大奖

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

Segmenterad med en ordlista

Thailändska, utan mellanslag

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

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

Segmenterad med en ordlista

Ryska

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

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

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.

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

En milter kontrollerar e-post under SMTP-sessionen, så spam som når gränsen för avvisning nekas innan den tas emot. Postfix-guide

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

Konturmarkerad: körs på din egen dator. Personuppgifter tas bort innan ett meddelande skickas till en molnbaserad leverantör.

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

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

Träning

Undanhållna meddelandenMeddelandenPrecisionTäckningFalska positiva
engelska6 564100,0 %97,1 %0,0 %
ryska1 682100,0 %97,4 %0,0 %
italienska1 38998,1 %85,3 %1,8 %
tyska1 30997,7 %76,1 %2,2 %
spanska1 28197,5 %82,6 %2,6 %
Alla13 84099,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.