HTTP API, TCP-сервер и spamd

HTTP API#

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

Сервер слушает 127.0.0.1, если в --host не указано иное. Если задан токен, каждому запросу, кроме /health, нужен Authorization: Bearer <token>. Прежде чем открывать доступ к нему за пределами машины, поставьте перед ним обратный прокси с TLS.

Метод и путьТелоОтвет
GET /health{"ok": true, "version": "7.0.0"}
POST /scanИсходное письмоРезультат проверки в JSON
POST /checkИсходное письмоПисьмо с добавленными заголовками X-Spam-* как message/rfc822
POST /learn/spamИсходное письмо{"ok": true, "learned": "spam"}; нужен токен
POST /learn/hamИсходное письмо{"ok": true, "learned": "ham"}; нужен токен

Параметры запроса описывают SMTP-сессию:

ПараметрЗначение
ipIP-адрес клиента
hostnameЕго проверенное имя в обратной зоне DNS
heloЕго имя из HELO или EHLO
fromОтправитель в конверте
toПолучатель; повторите параметр или перечислите нескольких через запятую
verbose=1/scan: также вернуть список слов и тему
subjectTag/check: добавлять префикс к теме спама, например %5BSPAM%5D

/check также возвращает X-Spam-Flag, X-Spam-Score и X-Spam-Action в заголовках ответа, чтобы клиент мог принять решение, не разбирая письмо.

На письма больше 25 МБ возвращается 413. На неудачную проверку возвращается 500 с {"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'

С --out model.json всё, чему обучает /learn, сохраняется в этот файл после каждого запроса. Без него обучение действует до перезапуска сервера.

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

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

TCP-сервер#

Shell
spamscanner server --port 7830

Отправьте исходное письмо, закройте передающую сторону соединения и прочитайте одну строку JSON:

Shell
nc -N 127.0.0.1 7830 < message.eml

С --verbose ответом вместо этого будет строка текста: SPAM 16.3/5.0 BAYES_999,PHISHING_LOOKALIKE_DOMAIN,DECEPTIVE_LINK,FROM_NAME_BRAND или HAM -2.5/5.0 BAYES_00.

spamd#

Shell
spamscanner spamd --port 783

Сервер, совместимый со SpamAssassin, для spamc, Exim, Haraka и других клиентов SpamAssassin. Настройка Exim и Haraka

КомандаОтвет
CHECKSpam: True ; 16.3 / 5.0
SYMBOLSВердикт и имена сработавших тестов
REPORTВердикт и таблица тестов, баллов и причин
REPORT_IFSPAMКак REPORT, но с пустым отчётом для ham
PROCESSВердикт и письмо с заголовками X-Spam-*
HEADERSВердикт и блок заголовков письма с заголовками X-Spam-*
PINGPONG
SKIPНичего
TELLОбучение на спаме или ham, с --allow-tell; сохраняет в --out

Сжатые запросы (Compress: zlib) отклоняются.

Редактировать эту страницу на GitHub · Markdown ·