API-referanse

JavaScript
import SpamScanner from 'spamscanner';             // ESM
const SpamScanner = require('spamscanner');        // CommonJS

const scanner = new SpamScanner(options);
const result = await scanner.scan(rawMessage, scanOptions);

Opprett én skanner og gjenbruk den: den laster inn modellen én gang og mellomlagrer svar fra DNS og språkmodeller.

Alternativer#

Alle alternativer kan sendes til konstruktøren. De fleste kan også sendes til scan() for én melding, og flettes da inn over konstruktørens.

AlternativStandardBetydning
threshold5Poengsum der en melding er spam
rejectThreshold15Poengsum der action er reject
scores{}Poeng per test: innstillingsnøkler eller testnavn (tester og poeng)
classifiermedfølgende modellEn Classifier, et modellobjekt, en sti til en modellfil eller false
classifierOptions{}Alternativer for den medfølgende modellen (se Klassifiserer)
allowedLanguages[]ISO 639-1-koder; andre språk får LANGUAGE_NOT_ALLOWED
phishing.cloudflaretrueSpør Cloudflares filtrerende resolvere om vertene i lenker
phishing.adulttrueSpør også familieresolveren, som blokkerer voksennettsteder
phishing.maxHosts25Lenkeverter som slås opp per melding
phishing.homograph{}brands (erstatter den innebygde listen), extraBrands, allowlist (domener som aldri flagges), strictMode
dnsbl{ip: [], domain: []}Soner for DNS-blokkeringslister for klientens IP og for domener i lenker
dns{servers: null, timeout: 3000}Navneservere for DNS-sjekker (standard: systemets)
attachmentstrueUndersøk vedlegg
macrostrueFlagg makroer, aktive PDF-er og RTF-objekter
arbitrarytrueKjør reglene
authenticationfalsetrue, eller {dnsServers, timeout, mta, weights}: SPF, DKIM, DMARC, ARC
reputationfalse{allowlist, denylist, apiUrl, headers, timeout}
allowlist, denylistIP-adresser, domener eller adresser; kortform for reputation
clamavfalsetrue (standard-socket), {socket} eller {host, port}
llmnullInnstillinger for språkmodellen, med mode, minScore, maxScore
toxicityfalse{model, threshold = 0.7}: en modell der classify([text]) svarer som @tensorflow-models/toxicity
nsfwfalse{model, threshold = 0.6}: en modell der classify(imageBuffer) svarer som nsfwjs
maxLength100000Antall tegn av brødteksten som leses
timeout10000Millisekunder tillatt for hver nettverkssjekk
session{}Standardopplysninger om SMTP-økten

scan() tar også imot session:

JavaScript
await scanner.scan(raw, {
  session: {
    remoteAddress: '203.0.113.5',             // the client's IP address
    resolvedClientHostname: 'mx.example.com', // its verified reverse DNS name
    helo: 'mx.example.com',
    envelope: {
      mailFrom: {address: 'alice@example.com'},
      rcptTo: [{address: 'bob@example.org'}],
    },
  },
});

En server som allerede har sjekket SPFSender Policy Framework: en DNS-post som lister opp serverne som har lov til å sende e-post for et domene., DKIMDomainKeys Identified Mail: en signatur over en melding, kontrollert med en offentlig nøkkel publisert i avsenderens DNS., DMARCEn DNS-policy som forteller mottakere hva de skal gjøre når e-post som utgir seg for å komme fra et domene, ikke består SPF- og DKIM-justering. og ARCAuthenticated Received Chain: signaturer som tar med autentiseringsresultater gjennom videresendende servere. (med mailauth), kan sende resultatene som authenticationResults, og da gis de poeng i stedet for å sjekkes på nytt:

JavaScript
import {authenticate} from 'mailauth';

const auth = await authenticate(raw, {ip, helo, sender, mta});
await scanner.scan(raw, {authenticationResults: auth});

Metoder#

MetodeReturnerer
scan(source, options)Resultatet. source er en Buffer, en streng, en Uint8Array eller en lesbar strøm
scanFile(path, options)Resultatet for en meldingsfil
learn(source, 'spam' | 'ham')Lærer klassifisereren opp på én melding
unlearn(source, 'spam' | 'ham')Angrer learn
saveModel(path, options)Skriver klassifisereren til en fil (options: minCount, maxFeatures, metadata)
getClassifier()Classifier som er i bruk, eller null
getClassification(features)Klassifisererens vurdering av egenskaper fra getFeatures
getFeatures(mail){features, words, language, script, links, hosts, text, hidden} for en melding
getTokens(text, locale)Ordene i en tekst
getTokensAndMailFromSource(source){tokens, features, mail}
parse(source){raw, mail}, med mail fra mailparser

I getFeatures er text teksten en e-postklient viser, som ordene leses fra, og hidden hvor mange tegn tekst HTML-en skjuler.

scanner.metrics inneholder totalScans, averageTime og lastScanTime.

Resultatet#

JavaScript
{
  isSpam: true,
  score: 16.25,
  threshold: 5,
  rejectThreshold: 15,
  action: 'reject',                       // 'accept', 'tag' or 'reject'
  message: 'Spam (BAYES_999, PHISHING_LOOKALIKE_DOMAIN, DECEPTIVE_LINK, FROM_NAME_BRAND)',
  tests: [
    {name: 'BAYES_999', score: 6.25, description: 'Classifier spam probability 99.9%'},
    {name: 'PHISHING_LOOKALIKE_DOMAIN', score: 5, description: '"paypa1-secure.top" imitates paypal by swapping characters'},
    // ...
  ],
  results: {
    classification: {probability, category, spam, ham, clues, coverage},
    phishing: [],        // lookalike domains, deceptive links, Cloudflare and URIBL findings
    uncheckedHosts: 0,   // link hosts beyond phishing.maxHosts, not looked up
    attachments: [],     // every attachment finding
    executables: [],     // the executable findings among them
    macros: [],          // macros, active PDFs, RTF objects
    viruses: [],         // ClamAV findings: {filename, virus: [names], message}
    arbitrary: [],       // rules strong enough to mark spam alone
    obfuscation: {invisible, mixed, styled},
    authentication: null, // mailauth's results with a score, when checked
    reputation: null,
    dnsbl: [],           // {zone, value} for each listing
    language: {language, script, notAllowed},
    llm: null,           // the language model's verdict, when asked
    toxicity: [],
    nsfw: [],
    idnHomographAttack: {detected, domains, riskScore},
  },
  links: ['http://paypa1-secure.top/login'],
  language: 'en',
  tokens: ['dear', 'customer', /* ... */],
  mail: {/* the parsed message, from mailparser */},
  version: '7.0.0',
  metrics: {totalTime: 42},
}

Funn i phishing, attachments, executables, macros, viruses og arbitrary er objekter med en type og en message. String(finding) er meldingen.

Eksporter#

JavaScript
import SpamScanner, {
  Classifier, getFeatures, segmentWords, detectLanguage,
  LLMClassifier, PROVIDERS, RECOMMENDED_MODELS, CLASSIFIER_MODELS,
  DEFAULT_SCORES, scoreResults, spamHeaders, rewriteMessage,
  loadModel, saveModel, defaultModelPath, loadDefaultModel,
  train, evaluate, readExamples,
  MilterServer, createHttpServer, createTcpServer, createSpamdServer,
  DEFAULTS, VERSION,
} from 'spamscanner';

import ArfParser from 'spamscanner/arf';

Klassifiserer#

JavaScript
const classifier = new Classifier({spamCutoff: 0.99, hamCutoff: 0.2});
classifier.learn(getFeatures(mail).features, 'spam');
classifier.classify(features); // {probability, category, spam, ham, clues, coverage}
AlternativStandardBetydning
strength, unknown0.45, 0.5Robinsons s og x: hvor sterkt sjeldne egenskaper trekkes mot 0,5
minDistance0.1Egenskaper nærmere 0,5 enn dette ignoreres
maxClues150De sterkeste egenskapene som kombineres per melding
hamCutoff, spamCutoff0.2, 0.99Grensene for unsure-området
minLanguageExamples, languageShare1000, 0.02Meldinger av hver klasse som trengs på et språk for full tillit
languagePriortrueVei ord mot tellingene for deres eget språk

merge(other), toJSON(options), Classifier.fromJSON(json), size og entries() er også tilgjengelige.

Trening#

JavaScript
import {train, evaluate, saveModel} from 'spamscanner';

const {classifier, spam, ham} = await train({
  spam: ['/mail/Junk'],
  ham: ['/mail/Archive', '/mail/archive.mbox'],
  datasets: [{file: 'extra.csv', textColumn: 'body', labelColumn: 'kind'}],
});
saveModel(classifier, 'model.json');

evaluate(classifier, examples) tar imot {label, features}-elementer, eller readExamples(sources), som leser de samme kildene som train, og returnerer antall, presisjon, gjenkalling, F1, nøyaktighet og andelene falske positiver, falske negativer og usikre.

Servere#

JavaScript
import SpamScanner, {MilterServer, createHttpServer, createSpamdServer} from 'spamscanner';

const scanner = new SpamScanner({authentication: true});
const milter = new MilterServer(scanner, {reject: true, rejectCode: 451, subjectTag: '[SPAM]'});
milter.on('scan', ({session, result}) => console.log(session.remoteAddress, result.score));
await milter.listen(7831);

createHttpServer(scanner, {token: process.env.SPAMSCANNER_TOKEN}).listen(7832, '127.0.0.1');
createSpamdServer(scanner).listen(783, '127.0.0.1');

ARF-rapporter#

spamscanner/arf leser og skriver rapporter om misbruk (RFC 5965), formatet e-postleverandører bruker til å rapportere spamklager:

JavaScript
import ArfParser from 'spamscanner/arf';

const report = await ArfParser.parse(rawReport);
console.log(report.feedbackType, report.sourceIp, report.originalHeaders.subject);

const raw = ArfParser.create({
  feedbackType: 'abuse', userAgent: 'MyService/1.0',
  from: 'abuse@example.com', to: 'fbl@example.net',
  originalMessage, sourceIp: '192.0.2.1',
});

ArfParser.tryParse() returnerer null i stedet for å kaste en feil for meldinger som ikke er rapporter, og isArfMessage(mail) sjekker en tolket melding.

Rediger denne siden på GitHub · Markdown ·