Ein Spamfilter, der jede Sprache liest und jede Entscheidung begründet.

Spam Scanner erkennt Spam, Phishing, Betrug und Malware für Node.js, die Kommandozeile und Mailserver wie Postfix, Exim und Haraka. Jedes Ergebnis nennt die ausgelösten Tests und den Grund.

npm install -g spamscanner
  • Node.js 18+
  • Milter, spamd, HTTP
  • Ollama, Claude, ChatGPT
  • Keine Telemetrie
$ 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

Wie eine Nachricht bewertet wird

Jede Prüfung fügt Punkte hinzu oder zieht sie ab, und die Summe entscheidet. Schwellenwerte und Punkte lassen sich ändern, und nichts ist eine Blackbox: Das Ergebnis nennt jeden Test.

  1. Lesen

    Die Nachricht wird geparst und ihr Text normalisiert: Zierbuchstaben, unsichtbare Zeichen und Doppelgänger-Alphabete werden aufgelöst.

  2. Prüfen

    Klassifikator, Link-, Anhangs-, Authentifizierungs-, Blocklisten- und Regelprüfungen laufen gleichzeitig, jede mit einem Timeout.

  3. Score

    Jeder Test fügt Punkte hinzu oder zieht sie ab. Ab 5 ist eine Nachricht Spam, ab 15 sollte ein Mailserver sie abweisen.

  4. Fragen

    Knappe Fälle können an ein Sprachmodell gehen, das bis zu 6 Punkte hinzufügt oder bis zu 3 abzieht.

  • unter 5annehmen
  • 5 bis 15als Spam markieren
  • ab 15abweisen

In 1:58 erklärt

Wie eine Nachricht bewertet wird, wie jede Sprache gelesen wird, wann ein Sprachmodell gefragt wird und wie Spam Scanner sich in Postfix, Exim, Haraka und Node.js einfügt.

Auf Englisch gesprochen, mit englischen Untertiteln.

Das Titelbild des Videos: das Logo von Spam Scanner.

Was geprüft wird

Wörter sind ein Signal. Links, Absender, Anhänge und Authentifizierung sagen ebenso viel aus, und keines davon hängt von der Sprache der Nachricht ab.

  • Ein Klassifikator für jede Schrift

    Wörter, Wortpaare, Links, Absender, HTML und Anhänge, gezählt und kombiniert wie bei SpamBayes, mit einem ehrlichen „unsicher“, wenn die Hinweise sich widersprechen.

    Wie entschieden wird
  • Jede Sprache, mit Sorgfalt

    Unicode-Wortsegmentierung für Chinesisch, Japanisch und Thai, aufgelöste Tarnungen und keine Strafpunkte für eine Sprache, in der das Modell wenig Ham gesehen hat.

    Sprachen
  • Phishing

    Doppelgänger-Domains mit kyrillischen oder vertauschten Buchstaben, Links, deren Text eine andere Adresse zeigt, Markennamen in Anzeigenamen und der Malware-Resolver von Cloudflare.

    Phishing-Prüfungen
  • Anhänge

    Ausführbare Dateien, an ihren Bytes erkannt, auch wenn sie in .pdf umbenannt sind; doppelte Endungen; Programme in ZIP-Dateien; Office-Makros; aktive PDFs; ClamAV.

    Anhangsprüfungen
  • Authentifizierung

    SPF, DKIM, DMARC und ARC, DNS-Blocklisten, Erlaubt- und Sperrlisten sowie eine Regel für E-Mails, die die eigene Domain fälschen.

    Authentifizierung
  • Sprachmodelle

    Knappe Fälle gehen an ein Modell: Ollama auf dem eigenen Rechner oder Claude, ChatGPT, Gemini und jeder OpenAI-kompatible Server.

    Sprachmodelle

Alle Tests und ihre PunkteFunktionsweise

Jede Sprache, ohne Raten

Wörter werden nach den Unicode-Regeln gefunden, daher funktionieren auch Sprachen, die ohne Leerzeichen geschrieben werden, und Tarnungen werden vor dem Zählen aufgelöst. Das sind die Wörter, die der Klassifikator zählt, berechnet beim Erstellen dieser Seite.

Eine Sprache, in der das mitgelieferte Modell wenig Ham gesehen hat, erhält „unsicher“ statt „Spam“. So wird gewöhnliche Post auf Arabisch oder Koreanisch nie wegen ihrer Schrift markiert. Sprachen

Getarntes Englisch

Claim your fr␣ee prіze: V1agra 𝐅𝐑𝐄𝐄

  • claim
  • your
  • free
  • prize
  • viagra
  • free

Ein Leerzeichen ohne Breite, ein kyrillisches і, eine Ziffer statt eines Buchstabens und mathematische Fettbuchstaben

Chinesisch, ohne Leerzeichen

恭喜您获得一百万元大奖

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

Mit einem Wörterbuch segmentiert

Thai, ohne Leerzeichen

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

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

Mit einem Wörterbuch segmentiert

Russisch

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

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

Nach Unicode-Regeln kleingeschrieben

Fügt sich in Ihren Mailserver ein

Ein Milter für Postfix und Sendmail, ein SpamAssassin-kompatibler spamd-Server für spamc, Exim und Haraka, ein Content-Filter, eine HTTP-API, ein TCP-Server und die Bibliothek.

Alle fügen X-Spam-Flag, X-Spam-Score, X-Spam-Status-Header hinzu und entfernen solche, die ein Absender gefälscht hat.

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

Ein Milter prüft E-Mails während der SMTP-Sitzung. Spam ab dem Ablehnungsschwellenwert wird so abgewiesen, bevor er angenommen wird. Anleitung zu Postfix

Ein Sprachmodell für knappe Fälle

Eindeutiger Spam und eindeutiger Ham erreichen es nie. Ist der Score knapp oder der Klassifikator unsicher, liest ein Modell die Nachricht und antwortet mit Spam, Phishing, Betrug, Malware oder Ham. Es kann auf dem eigenen Rechner laufen oder gehostet sein, mit beliebiger URL, beliebigem Port und beliebiger Authentifizierung.

In einer Nachricht versteckte Anweisungen an KI-Filter werden als Spam gewertet, und dem Modell wird mitgeteilt, dass die Nachricht Daten sind. Die End-to-End-Tests prüfen das mit einem echten Modell über 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

Umrandet: läuft auf dem eigenen Rechner. Personenbezogene Daten werden entfernt, bevor eine Nachricht an einen gehosteten Anbieter geht.

OllamaHugging FaceLizenzGröße
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

Empfohlene offene Modelle. Alle Empfehlungen

Gemessen und trainierbar

Das mitgelieferte Modell ist mit öffentlichen Datensätzen trainiert und an Nachrichten getestet, die es nicht gesehen hat. Ein Modell, das mit den eigenen E-Mails trainiert ist, schneidet besser ab: aus mbox-Dateien, Maildirs oder Datensätzen trainieren, messen und über „Als Spam melden“-Schaltflächen weiter anlernen.

Training

Zurückgehaltene NachrichtenNachrichtenPräzisionTrefferquoteFehlalarme
Englisch6.564100,0 %97,1 %0,0 %
Russisch1.682100,0 %97,4 %0,0 %
Italienisch1.38998,1 %85,3 %1,8 %
Deutsch1.30997,7 %76,1 %2,2 %
Spanisch1.28197,5 %82,6 %2,6 %
Alle13.84099,2 %85,1 %0,6 %

Nur der Klassifikator, auf jeder zehnten Nachricht seiner öffentlichen Trainingsdaten, die zurückgehalten wurde. Unsichere Nachrichten zählen als verfehlt. Deutsch, Italienisch und Spanisch stammen aus synthetischen Datensätzen mit verrauschten Labels. Über das mitgelieferte Modell

Gebaut für Forward Email

Forward Email protokolliert keine Nachrichteninhalte und konnte E-Mails daher nicht an einen externen Filterdienst senden. Spam Scanner läuft auf den eigenen Servern, sendet nichts nach außen, sofern nicht so konfiguriert, und begründet jede Entscheidung, ohne dass ein Mensch die E-Mail liest. Forward Email und Aktualisierung

Ein Projekt von Forward Email, dem E-Mail-Dienst mit Fokus auf Datenschutz.