Un filtre antispam qui lit toutes les langues et explique chaque décision.

Spam Scanner détecte le spam, l’hameçonnage, les arnaques et les logiciels malveillants pour Node.js, la ligne de commande et les serveurs de messagerie comme Postfix, Exim et Haraka. Chaque résultat liste les tests déclenchés et leur raison.

npm install -g spamscanner
  • Node.js 18+
  • Milter, spamd, HTTP
  • Ollama, Claude, ChatGPT
  • Aucune télémétrie
$ 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

Comment un message est évalué

Chaque vérification ajoute ou retire des points, et le total décide. Les seuils et les points sont modifiables, et rien n’est une boîte noire : le résultat nomme chaque test.

  1. Lire

    Le message est analysé et son texte normalisé : les lettres stylisées, les caractères invisibles et les alphabets sosies sont neutralisés.

  2. Vérifier

    Le classifieur et les vérifications des liens, des pièces jointes, de l’authentification, des listes de blocage et des règles s’exécutent en même temps, chacun avec un délai maximal.

  3. Score

    Chaque test ajoute ou retire des points. À 5, un message est du spam ; à 15, un serveur de messagerie devrait le refuser.

  4. Demander

    Les cas limites peuvent être confiés à un modèle de langage, qui ajoute jusqu’à 6 points ou en retire jusqu’à 3.

  • moins de 5accepter
  • de 5 à 15marquer comme spam
  • 15 et plusrejeter

Le voir en 1:58

Comment un message est noté, comment chaque langue est lue, quand un modèle de langage est consulté, et comment l’outil s’intègre à Postfix, Exim, Haraka et Node.js.

Narration en anglais, avec sous-titres en anglais.

L’image titre de la vidéo : le logo de Spam Scanner.

Ce qu’il vérifie

Les mots sont un signal parmi d’autres. Les liens, les expéditeurs, les pièces jointes et l’authentification en disent autant, et aucun ne dépend de la langue du message.

  • Un classifieur pour toutes les écritures

    Mots, paires de mots, liens, expéditeurs, HTML et pièces jointes, comptés et combinés comme le fait SpamBayes, avec un « incertain » honnête quand les indices se contredisent.

    Comment il décide
  • Toutes les langues, avec soin

    Segmentation des mots selon Unicode pour le chinois, le japonais et le thaï, déguisements neutralisés, et aucune pénalité pour une langue dans laquelle le modèle a vu peu de ham.

    Langues
  • Hameçonnage

    Domaines sosies avec des lettres cyrilliques ou interverties, liens dont le texte affiche une autre adresse, marques dans les noms d’affichage, et le résolveur anti-malware de Cloudflare.

    Détection de l’hameçonnage
  • Pièces jointes

    Exécutables repérés par leurs octets, même renommés en .pdf ; doubles extensions ; programmes dans des fichiers ZIP ; macros Office ; PDF actifs ; ClamAV.

    Vérification des pièces jointes
  • Authentification

    SPF, DKIM, DMARC et ARC, listes de blocage DNS, listes d’autorisation et de refus, et une règle pour le courrier qui usurpe votre propre domaine.

    Authentification
  • Modèles de langage

    Les cas limites sont confiés à un modèle : Ollama sur votre propre machine, ou Claude, ChatGPT, Gemini et tout serveur compatible OpenAI.

    Modèles de langage

Chaque test et ses pointsFonctionnement

Toutes les langues, sans deviner

Les mots sont repérés selon les règles Unicode, ce qui permet de traiter les langues écrites sans espaces, et les déguisements sont neutralisés avant le comptage. Voici les mots que compte le classifieur, calculés lors de la génération de cette page.

Une langue dans laquelle le modèle fourni a vu peu de ham obtient « incertain » au lieu de « spam » : un message ordinaire en arabe ou en coréen n’est jamais signalé à cause de son écriture. Langues

Anglais déguisé

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

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

Une espace sans chasse, un і cyrillique, un chiffre à la place d’une lettre et des lettres mathématiques en gras

Chinois, sans espaces

恭喜您获得一百万元大奖

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

Segmenté à l’aide d’un dictionnaire

Thaï, sans espaces

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

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

Segmenté à l’aide d’un dictionnaire

Russe

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

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

Mis en minuscules selon les règles Unicode

S’intègre à votre serveur de messagerie

Un milter pour Postfix et Sendmail, un serveur spamd compatible avec SpamAssassin pour spamc, Exim et Haraka, un filtre de contenu, une API HTTP, un serveur TCP et la bibliothèque.

Tous ajoutent les en-têtes X-Spam-Flag, X-Spam-Score, X-Spam-Status et suppriment ceux qu’un expéditeur aurait falsifiés.

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 vérifie le courrier pendant la session SMTP : le spam qui atteint le seuil de rejet est refusé avant d’être accepté. Guide Postfix

Un modèle de langage pour les cas limites

Le spam évident et le ham évident ne lui parviennent jamais. Quand le score est serré ou que le classifieur hésite, un modèle lit le message et répond spam, hameçonnage, arnaque, logiciel malveillant ou ham. Exécutez-en un sur votre propre machine, ou utilisez un modèle hébergé, avec n’importe quelle URL, n’importe quel port et n’importe quelle authentification.

Les instructions cachées dans un message à destination des filtres d’IA sont notées comme du spam, et le modèle est averti que le message est une donnée. Les tests de bout en bout le vérifient avec un vrai modèle 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

En contour : s’exécute sur votre propre machine. Les données personnelles sont retirées avant qu’un message soit envoyé à un fournisseur hébergé.

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

Modèles ouverts recommandés. Toutes les recommandations

Mesuré, et entraînable

Le modèle fourni est entraîné sur des jeux de données publics et testé sur des messages qu’il n’a pas vus. Un modèle entraîné sur votre propre courrier fait mieux : entraînez-le à partir de fichiers mbox, de Maildirs ou de jeux de données, mesurez-le, et faites-le apprendre grâce aux boutons « signaler comme spam ».

Entraînement

Messages mis de côtéMessagesPrécisionRappelFaux positifs
anglais6 564100,0 %97,1 %0,0 %
russe1 682100,0 %97,4 %0,0 %
italien1 38998,1 %85,3 %1,8 %
allemand1 30997,7 %76,1 %2,2 %
espagnol1 28197,5 %82,6 %2,6 %
Tout13 84099,2 %85,1 %0,6 %

Le classifieur seul, sur un message sur dix de ses données d’entraînement publiques, mis de côté. Les messages incertains comptent comme manqués. L’allemand, l’italien et l’espagnol proviennent de jeux de données synthétiques aux étiquettes bruitées. À propos du modèle fourni

Conçu pour Forward Email

Forward Email ne conserve aucun journal du contenu des messages : il ne pouvait donc pas envoyer le courrier à un service de filtrage externe. Spam Scanner s’exécute sur vos propres serveurs, n’envoie rien nulle part sauf configuration contraire, et explique chaque décision sans que personne ne lise le courrier. Forward Email et mise à niveau

Un projet de Forward Email, le service de messagerie axé sur la confidentialité.