Un filtro de spam que lee todos los idiomas y explica cada decisión.

Spam Scanner detecta spam, phishing, estafas y malware para Node.js, la línea de comandos y servidores de correo como Postfix, Exim y Haraka. Cada resultado enumera las pruebas que se activaron y por qué.

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

Cómo se evalúa un mensaje

Cada comprobación suma o resta puntos, y el total decide. Los umbrales y los puntos se pueden cambiar, y nada es una caja negra: el resultado nombra cada prueba.

  1. Leer

    El mensaje se analiza y su texto se normaliza: se deshacen las letras estilizadas, los caracteres invisibles y los alfabetos parecidos.

  2. Comprobar

    Las comprobaciones del clasificador, de enlaces, adjuntos, autenticación, listas de bloqueo y reglas se ejecutan a la vez, cada una con un tiempo límite.

  3. Puntuación

    Cada prueba suma o resta puntos. Con 5, un mensaje es spam; con 15, un servidor de correo debería rechazarlo.

  4. Consultar

    Los casos dudosos pueden pasar a un modelo de lenguaje, que suma hasta 6 puntos o resta hasta 3.

  • menos de 5aceptar
  • de 5 a 15marcar como spam
  • 15 o másrechazar

Míralo en 1:58

Cómo se puntúa un mensaje, cómo se lee cada idioma, cuándo se consulta a un modelo de lenguaje y cómo se conecta con Postfix, Exim, Haraka y Node.js.

Narrado en inglés, con subtítulos en inglés.

El fotograma del título del video: el logotipo de Spam Scanner.

Qué comprueba

Las palabras son una señal. Los enlaces, los remitentes, los adjuntos y la autenticación dicen tanto como ellas, y ninguno depende del idioma del mensaje.

  • Un clasificador para cualquier escritura

    Palabras, pares de palabras, enlaces, remitentes, HTML y adjuntos, contados y combinados como lo hace SpamBayes, con un «dudoso» honesto cuando los indicios no coinciden.

    Cómo decide
  • Todos los idiomas, con cuidado

    Segmentación de palabras de Unicode para chino, japonés y tailandés, disfraces deshechos y ninguna penalización para un idioma del que el modelo vio poco ham.

    Idiomas
  • Phishing

    Dominios parecidos con letras cirílicas o cambiadas, enlaces cuyo texto muestra otra dirección, marcas en los nombres visibles y el resolutor de malware de Cloudflare.

    Comprobaciones de phishing
  • Adjuntos

    Ejecutables detectados por sus bytes, también si se renombran a .pdf; extensiones dobles; programas dentro de archivos ZIP; macros de Office; PDF activos; ClamAV.

    Comprobaciones de adjuntos
  • Autenticación

    SPF, DKIM, DMARC y ARC, listas de bloqueo DNS, listas de permitidos y bloqueados, y una regla para el correo que suplanta tu propio dominio.

    Autenticación
  • Modelos de lenguaje

    Los casos dudosos pasan a un modelo: Ollama en tu propia máquina, o Claude, ChatGPT, Gemini y cualquier servidor compatible con OpenAI.

    Modelos de lenguaje

Todas las pruebas y sus puntosCómo funciona

Todos los idiomas, sin adivinar

Las palabras se encuentran con las reglas de Unicode, así que funcionan los idiomas que se escriben sin espacios, y los disfraces se deshacen antes de contar. Estas son las palabras que cuenta el clasificador, calculadas al generar esta página.

Un idioma del que el modelo incluido vio poco ham recibe «dudoso» en lugar de «spam», así que el correo normal en árabe o coreano nunca se marca por su escritura. Idiomas

Inglés disfrazado

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

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

Un espacio de ancho cero, una і cirílica, un dígito en lugar de una letra y letras matemáticas en negrita

Chino, sin espacios

恭喜您获得一百万元大奖

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

Segmentado con un diccionario

Tailandés, sin espacios

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

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

Segmentado con un diccionario

Ruso

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

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

En minúsculas según las reglas de Unicode

Se conecta a tu servidor de correo

Un milter para Postfix y Sendmail, un servidor spamd compatible con SpamAssassin para spamc, Exim y Haraka, un filtro de contenido, una API HTTP, un servidor TCP y la biblioteca.

Todos añaden encabezados X-Spam-Flag, X-Spam-Score, X-Spam-Status y eliminan los que haya falsificado un remitente.

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 revisa el correo durante la sesión SMTP, así que el spam que llega al umbral de rechazo se rechaza antes de aceptarlo. Guía de Postfix

Un modelo de lenguaje para los casos dudosos

El spam claro y el ham claro nunca llegan a él. Cuando la puntuación está cerca del umbral o el clasificador tiene dudas, un modelo lee el mensaje y responde spam, phishing, estafa, malware o ham. Ejecuta uno en tu propia máquina o usa uno alojado, con cualquier URL, puerto y autenticación.

Las instrucciones ocultas en un mensaje para los filtros de IA se puntúan como spam, y al modelo se le indica que el mensaje son datos. Las pruebas de extremo a extremo lo comprueban con un modelo real a través de 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

Con contorno: se ejecuta en tu propia máquina. Los datos personales se eliminan antes de que un mensaje vaya a un proveedor alojado.

OllamaHugging FaceLicenciaTamaño
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

Modelos abiertos recomendados. Todas las recomendaciones

Medido y entrenable

El modelo incluido está entrenado con conjuntos de datos públicos y probado con mensajes que no vio. Un modelo entrenado con tu propio correo funciona mejor: entrénalo con archivos mbox, Maildirs o conjuntos de datos, mídelo y enséñale con los botones de «denunciar spam».

Entrenamiento

Mensajes reservadosMensajesPrecisiónExhaustividadFalsos positivos
inglés6564100,0 %97,1 %0,0 %
ruso1682100,0 %97,4 %0,0 %
italiano138998,1 %85,3 %1,8 %
alemán130997,7 %76,1 %2,2 %
español128197,5 %82,6 %2,6 %
Todos13.84099,2 %85,1 %0,6 %

Solo el clasificador, con uno de cada diez mensajes de sus datos de entrenamiento públicos, reservados. Los mensajes dudosos cuentan como no detectados. El alemán, el italiano y el español provienen de conjuntos de datos sintéticos con etiquetas imprecisas. Sobre el modelo incluido

Hecho para Forward Email

Forward Email no guarda registros del contenido de los mensajes, así que no podía enviar el correo a un servicio de filtrado externo. Spam Scanner se ejecuta en tus propios servidores, no envía nada a ningún sitio salvo que se configure para hacerlo y explica cada decisión sin que una persona lea el correo. Forward Email y actualización

Un proyecto de Forward Email, el servicio de correo electrónico centrado en la privacidad.