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
CommencerRegarder la vidéo (1:58)
- 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.
Lire
Le message est analysé et son texte normalisé : les lettres stylisées, les caractères invisibles et les alphabets sosies sont neutralisés.
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.
Score
Chaque test ajoute ou retire des points. À 5, un message est du spam ; à 15, un serveur de messagerie devrait le refuser.
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
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écideToutes 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.
LanguesHameç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çonnagePiè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 jointesAuthentification
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.
AuthentificationModè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
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
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
恭喜您获得一百万元大奖
- 恭喜
- 您
- 获得
- 一
- 百万
- 元
- 大奖
Segmenté à l’aide d’un dictionnaire
ยินดีด้วยคุณได้รับรางวัลหนึ่งล้านบาท
- ยินดี
- ด้วย
- คุณ
- ได้
- รับ
- รางวัล
- หนึ่ง
- ล้าน
- บาท
Segmenté à l’aide d’un dictionnaire
Поздравляем! Вы выиграли миллион
- поздравляем
- вы
- выиграли
- миллион
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.
spamscanner milter --port 7831 --auth --subject-tag "[SPAM]"
# /etc/postfix/main.cf
smtpd_milters = inet:127.0.0.1:7831
milter_default_action = acceptUn 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
spamscanner spamd --port 783 --auth
spamc -c < message.eml # prints 16.3/5.0 and exits 1Un serveur spamd compatible avec SpamAssassin : arrêtez spamd, lancez Spam Scanner sur le même port, et les clients SpamAssassin continuent de fonctionner. Guide 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
}La bibliothèque, pour smtp-server, les plugins Haraka ou tout service qui traite du courrier. Référence de l’API
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"Pour tout langage et tout serveur capable d’envoyer une requête HTTP. Guide de l’API HTTP
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
ollama pull qwen3.5:4b
spamscanner llm-test --llm ollama --llm-model qwen3.5:4b
spamscanner milter --llm ollama --llm-model qwen3.5:4bEn 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é.
| Ollama | Licence | Taille |
|---|---|---|
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 |
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 ».
| Messages mis de côté | Messages | Précision | Rappel | Faux positifs |
|---|---|---|---|---|
| anglais | 6 564 | 100,0 % | 97,1 % | 0,0 % |
| russe | 1 682 | 100,0 % | 97,4 % | 0,0 % |
| italien | 1 389 | 98,1 % | 85,3 % | 1,8 % |
| allemand | 1 309 | 97,7 % | 76,1 % | 2,2 % |
| espagnol | 1 281 | 97,5 % | 82,6 % | 2,6 % |
| Tout | 13 840 | 99,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é.
