API HTTP, servidor TCP y spamd

API HTTP#

Shell
spamscanner http --port 7832 --token "$SPAMSCANNER_TOKEN"

Escucha en 127.0.0.1 salvo que --host indique otra cosa. Con un token, todas las peticiones excepto /health necesitan Authorization: Bearer <token>. Ponlo detrás de un proxy inverso con TLS antes de exponerlo fuera de la máquina.

Método y rutaCuerpoRespuesta
GET /health{"ok": true, "version": "7.0.0"}
POST /scanEl mensaje sin procesarEl resultado del análisis en JSON
POST /checkEl mensaje sin procesarEl mensaje con los encabezados X-Spam-* añadidos, como message/rfc822
POST /learn/spamEl mensaje sin procesar{"ok": true, "learned": "spam"}; necesita un token
POST /learn/hamEl mensaje sin procesar{"ok": true, "learned": "ham"}; necesita un token

Los parámetros de consulta describen la sesión SMTP:

ParámetroSignificado
ipLa dirección IP del cliente
hostnameSu nombre DNS inverso verificado
heloSu nombre en HELO o EHLO
fromEl remitente del sobre
toUn destinatario; repítelo o separa varios con comas
verbose=1/scan: devuelve también la lista de palabras y el asunto
subjectTag/check: añade un prefijo al asunto del spam, por ejemplo %5BSPAM%5D

/check también devuelve X-Spam-Flag, X-Spam-Score y X-Spam-Action como encabezados de la respuesta, así que un cliente puede decidir sin procesar el mensaje.

Los mensajes de más de 25 MB reciben 413. Un análisis que falla recibe 500 con {"error": "..."}.

Shell
curl -s -X POST -H "Authorization: Bearer $SPAMSCANNER_TOKEN" \
  --data-binary @message.eml "http://127.0.0.1:7832/scan?ip=203.0.113.5&to=bob@example.org" | jq '.isSpam, .score, .tests'

Con --out model.json, lo que enseña /learn se guarda en ese archivo después de cada petición. Sin esa opción, el aprendizaje dura hasta que se reinicia el servidor.

Desde Node.js:

JavaScript
const response = await fetch('http://127.0.0.1:7832/scan?ip=203.0.113.5', {
  method: 'POST',
  headers: {authorization: `Bearer ${process.env.SPAMSCANNER_TOKEN}`},
  body: rawMessage,
});
const {isSpam, score, action} = await response.json();

Desde Python:

Python
import os, urllib.request

request = urllib.request.Request(
    'http://127.0.0.1:7832/scan',
    data=open('message.eml', 'rb').read(),
    headers={'Authorization': f"Bearer {os.environ['SPAMSCANNER_TOKEN']}"},
    method='POST',
)
print(urllib.request.urlopen(request).read().decode())

Servidor TCP#

Shell
spamscanner server --port 7830

Envía el mensaje sin procesar, cierra el lado de envío de la conexión y lee una línea de JSON:

Shell
nc -N 127.0.0.1 7830 < message.eml

Con --verbose, la respuesta es en cambio una línea de texto: SPAM 16.3/5.0 BAYES_999,PHISHING_LOOKALIKE_DOMAIN,DECEPTIVE_LINK,FROM_NAME_BRAND o HAM -2.5/5.0 BAYES_00.

spamd#

Shell
spamscanner spamd --port 783

Un servidor compatible con SpamAssassin para spamc, Exim, Haraka y otros clientes de SpamAssassin. Configurar Exim y Haraka

ComandoRespuesta
CHECKSpam: True ; 16.3 / 5.0
SYMBOLSEl veredicto y los nombres de las pruebas que se activaron
REPORTEl veredicto y una tabla de pruebas, puntos y motivos
REPORT_IFSPAMComo REPORT, con un informe vacío para el ham
PROCESSEl veredicto y el mensaje con los encabezados X-Spam-*
HEADERSEl veredicto y el bloque de encabezados del mensaje con los encabezados X-Spam-*
PINGPONG
SKIPNada
TELLAprende spam o ham, con --allow-tell; guarda en --out

Las peticiones comprimidas (Compress: zlib) se rechazan.

Editar esta página en GitHub · Markdown ·