Aan de slag
Spam Scanner heeft Node.js 18 of nieuwer nodig, of helemaal niets met de standalone binary.
Installeren#
Als opdrachtregeltool:
npm install --global spamscanner
spamscanner versionAls bibliotheek in een Node.js-project:
npm install spamscannerAls standalone binary voor Linux of macOS, met Node.js en het model ingebouwd:
curl -fsSL https://github.com/spamscanner/spamscanner/releases/latest/download/install.sh | bashBinaries voor Linux (x64 en arm64), macOS (Intel en Apple silicon) en Windows zijn bij elke release gevoegd.
Een bericht scannen#
Sla een bericht op als bestand (de meeste mailprogramma's noemen dit „Opslaan als” of „Origineel weergeven”) en scan het:
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.topDe exitcode is 0 voor hamGewenste mail: het tegenovergestelde van spam., 1 voor spam en 2 voor een fout, zodat scripts hem direct kunnen gebruiken. --json toont het volledige resultaat en --headers toont het bericht met toegevoegde X-Spam-*-headers.
Berichten kunnen ook via standaardinvoer binnenkomen:
cat message.eml | spamscanner scan -Gebruik vanuit 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 werkt ook:
const SpamScanner = require('spamscanner');scan() neemt het ruwe bericht aan als Buffer, string, Uint8Array of readable stream. Een string is altijd berichttekst: Spam Scanner leest nooit een bestand omdat een string op een pad lijkt. Gebruik scanner.scanFile(path) voor bestanden.
Geef informatie over de SMTP-sessie mee#
Het IP-adres van de client, de geverifieerde hostnaam, de HELO-naam en de envelope maken het resultaat nauwkeuriger: authenticatie heeft het IP-adres nodig en de self-spoofingregel heeft de ontvangers nodig.
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'}],
},
},
});Hetzelfde vanaf de opdrachtregel:
spamscanner scan message.eml --ip 203.0.113.5 --helo mail.example.com \
--from alice@example.com --to bob@example.org --authMeer controles aanzetten#
Geen van deze staat standaard aan, omdat elk een dienst of een beslissing vereist:
| Controle | Bibliotheekoptie | Opdrachtregel |
|---|---|---|
| SPF, DKIM, DMARC, ARC | authentication: true | --auth |
| IP-blocklist | dnsbl: {ip: ['zen.spamhaus.org']} | --dnsbl zen.spamhaus.org |
| Domeinblocklist voor links | dnsbl: {domain: ['dbl.spamhaus.org']} | --uribl dbl.spamhaus.org |
| ClamAV | clamav: true of clamav: {socket} | --clamav [socket] |
| Een taalmodel | llm: {provider: 'ollama', model: 'qwen3.5:4b'} | --llm ollama |
| Allow- en denylists | allowlist: [...], denylist: [...] | --allowlist, --denylist |
De filterende resolvers van Cloudflare (1.1.1.2 voor malware, 1.1.1.3 voor content voor volwassenen) worden standaard naar linkhosts gevraagd. Zet dat uit met phishing: {cloudflare: false} of --no-cloudflare. Wat de machine verlaat
Spamhaus en sommige andere blocklists beantwoorden geen queries die via publieke resolvers zoals 8.8.8.8 of 1.1.1.1 worden verstuurd. Gebruik ze met een lokale caching resolver en controleer hun gebruiksvoorwaarden voor je volume.
Volgende stappen#
- Zet het voor een mailserver: Postfix en Sendmail, andere servers.
- Leer het je eigen mail: training.
- Voeg een taalmodel toe voor twijfelgevallen: taalmodellen.