HTTP API, TCP-szerver és spamd

HTTP API#

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

A 127.0.0.1 címen figyel, hacsak a --host mást nem ad meg. Token esetén a /health kivételével minden kéréshez Authorization: Bearer <token> szükséges. Mielőtt a gépen kívülről is elérhetővé válna, TLS-t használó fordított proxy mögé kell helyezni.

Metódus és útvonalTörzsVálasz
GET /health{"ok": true, "version": "7.0.0"}
POST /scanA nyers levélA vizsgálat eredménye JSON-ként
POST /checkA nyers levélA levél a hozzáadott X-Spam-* fejlécekkel, message/rfc822 típusként
POST /learn/spamA nyers levél{"ok": true, "learned": "spam"}; tokent igényel
POST /learn/hamA nyers levél{"ok": true, "learned": "ham"}; tokent igényel

A lekérdezési paraméterek az SMTP-munkamenetet írják le:

ParaméterJelentés
ipA kliens IP-címe
hostnameAz ellenőrzött fordított DNS-neve
heloA HELO vagy EHLO neve
fromA boríték szerinti feladó
toEgy címzett; ismételhető, vagy több is megadható vesszővel elválasztva
verbose=1/scan: a szólistát és a tárgyat is visszaadja
subjectTag/check: előtag a spam tárgyához, például %5BSPAM%5D

A /check válaszfejlécként az X-Spam-Flag, az X-Spam-Score és az X-Spam-Action értékét is visszaadja, így a kliens a levél feldolgozása nélkül is dönthet.

A 25 MB-nál nagyobb levelek 413 választ kapnak. A sikertelen vizsgálat 500 választ kap {"error": "..."} törzzsel.

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'

A --out model.json kapcsolóval a /learn által tanítottak minden kérés után ebbe a fájlba kerülnek. Nélküle a tanultak a szerver újraindításáig maradnak meg.

Node.js-ből:

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();

Pythonból:

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())

TCP-szerver#

Shell
spamscanner server --port 7830

Küldje el a nyers levelet, zárja le a kapcsolat küldő oldalát, és olvasson be egy sor JSON-t:

Shell
nc -N 127.0.0.1 7830 < message.eml

A --verbose kapcsolóval a válasz ehelyett egy szövegsor: SPAM 16.3/5.0 BAYES_999,PHISHING_LOOKALIKE_DOMAIN,DECEPTIVE_LINK,FROM_NAME_BRAND vagy HAM -2.5/5.0 BAYES_00.

spamd#

Shell
spamscanner spamd --port 783

SpamAssassin-kompatibilis szerver a spamc, az Exim, a Haraka és más SpamAssassin-kliensek számára. Az Exim és a Haraka beállítása

ParancsVálasz
CHECKSpam: True ; 16.3 / 5.0
SYMBOLSAz ítélet és a teljesült tesztek nevei
REPORTAz ítélet és a tesztek, pontok és okok táblázata
REPORT_IFSPAMMint a REPORT, de ham esetén üres jelentéssel
PROCESSAz ítélet és a levél az X-Spam-* fejlécekkel
HEADERSAz ítélet és a levél fejlécblokkja az X-Spam-* fejlécekkel
PINGPONG
SKIPSemmi
TELLSpamet vagy hamet tanul a --allow-tell kapcsolóval; a --out fájlba ment

A tömörített kéréseket (Compress: zlib) visszautasítja.

Az oldal szerkesztése a GitHubon · Markdown ·