Pierwsze kroki
Spam Scanner wymaga Node.js 18 lub nowszego albo niczego, jeśli używasz samodzielnego pliku binarnego.
Instalacja#
Jako narzędzie wiersza poleceń:
npm install --global spamscanner
spamscanner versionJako biblioteka w projekcie Node.js:
npm install spamscannerJako samodzielny plik binarny dla Linux lub macOS, z wbudowanym Node.js i modelem:
curl -fsSL https://github.com/spamscanner/spamscanner/releases/latest/download/install.sh | bashPliki binarne dla Linux (x64 i arm64), macOS (Intel i Apple silicon) oraz Windows są dołączone do każdego wydania.
Skanowanie wiadomości#
Zapisz wiadomość jako plik (większość programów pocztowych nazywa to „Zapisz jako” lub „Pokaż oryginał”) i przeskanuj ją:
spamscanner scan message.emlSPAM 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.topKod wyjścia to 0 dla hamu, 1 dla spamu i 2 dla błędu, więc skrypty mogą go używać bezpośrednio. --json wypisuje pełny wynik, a --headers wypisuje wiadomość z dodanymi nagłówkami X-Spam-*.
Wiadomości mogą też pochodzić ze standardowego wejścia:
cat message.eml | spamscanner scan -Użycie z Node.js#
import SpamScanner from 'spamscanner';
import {readFile} from 'node:fs/promises';
const scanner = new SpamScanner();
const result = await scanner.scan(await readFile('message.eml'));
console.log(result.isSpam, result.score, result.action);
for (const test of result.tests) {
console.log(test.name, test.score, test.description);
}CommonJS też działa:
const SpamScanner = require('spamscanner');scan() przyjmuje surową wiadomość jako Buffer, string, Uint8Array lub strumień do odczytu. Ciąg znaków to zawsze tekst wiadomości: Spam Scanner nigdy nie czyta pliku tylko dlatego, że ciąg wygląda jak ścieżka. Dla plików użyj scanner.scanFile(path).
Przekazanie danych sesji SMTP#
Adres IP klienta, jego zweryfikowana nazwa hosta, nazwa z HELO i koperta zwiększają dokładność wyniku: uwierzytelnianie wymaga adresu IP, a reguła podszywania się pod własną domenę wymaga odbiorców.
const result = await scanner.scan(raw, {
session: {
remoteAddress: '203.0.113.5',
resolvedClientHostname: 'mail.example.com',
helo: 'mail.example.com',
envelope: {
mailFrom: {address: 'alice@example.com'},
rcptTo: [{address: 'bob@example.org'}],
},
},
});To samo z wiersza poleceń:
spamscanner scan message.eml --ip 203.0.113.5 --helo mail.example.com \
--from alice@example.com --to bob@example.org --authWłączanie kolejnych kontroli#
Żadna z nich nie jest domyślnie włączona, bo każda wymaga usługi lub decyzji:
| Kontrola | Opcja biblioteki | Wiersz poleceń |
|---|---|---|
| SPF, DKIM, DMARC, ARC | authentication: true | --auth |
| Czarna lista IP | dnsbl: {ip: ['zen.spamhaus.org']} | --dnsbl zen.spamhaus.org |
| Czarna lista domen dla linków | dnsbl: {domain: ['dbl.spamhaus.org']} | --uribl dbl.spamhaus.org |
| ClamAV | clamav: true lub clamav: {socket} | --clamav [socket] |
| Model językowy | llm: {provider: 'ollama', model: 'qwen3.5:4b'} | --llm ollama |
| Listy dozwolonych i zablokowanych | allowlist: [...], denylist: [...] | --allowlist, --denylist |
Filtrujące resolvery Cloudflare (1.1.1.2 dla złośliwego oprogramowania, 1.1.1.3 dla treści dla dorosłych) są domyślnie pytane o hosty z linków. Wyłącz to przez phishing: {cloudflare: false} lub --no-cloudflare. Co opuszcza komputer
Spamhaus i niektóre inne czarne listy nie odpowiadają na zapytania wysyłane przez publiczne resolvery, takie jak 8.8.8.8 lub 1.1.1.1. Używaj ich z lokalnym resolverem buforującym i sprawdź ich warunki użytkowania dla swojego wolumenu.
Dalsze kroki#
- Postaw go przed serwerem pocztowym: Postfix i Sendmail, inne serwery.
- Naucz go swojej własnej poczty: trenowanie.
- Dodaj model językowy do trudnych przypadków: modele językowe.