API-referens

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

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

Skapa en skanner och återanvänd den: den läser in modellen en gång och cachar svar från DNS och språkmodellen.

Alternativ#

Alla alternativ kan skickas till konstruktorn. De flesta kan också skickas till scan() för ett enskilt meddelande, och slås då ihop ovanpå konstruktorns.

AlternativStandardBetydelse
threshold5Poäng där ett meddelande är spam
rejectThreshold15Poäng där action är reject
scores{}Poäng per test: inställningsnycklar eller testnamn (tester och poäng)
classifiermedföljande modellEn Classifier, ett modellobjekt, en sökväg till en modellfil eller false
classifierOptions{}Alternativ för den medföljande modellen (se Klassificerare)
allowedLanguages[]ISO 639-1-koder; andra språk får LANGUAGE_NOT_ALLOWED
phishing.cloudflaretrueFråga Cloudflares filtrerande resolvrar om länkarnas värdar
phishing.adulttrueFråga även familjeresolvern, som blockerar webbplatser med vuxeninnehåll
phishing.maxHosts25Antal länkvärdar som slås upp per meddelande
phishing.homograph{}brands (ersätter den inbyggda listan), extraBrands, allowlist (domäner som aldrig flaggas), strictMode
dnsbl{ip: [], domain: []}DNS-blocklistzoner för klientens IP och för länkdomäner
dns{servers: null, timeout: 3000}Namnservrar för DNS-kontroller (standard: systemets)
attachmentstrueGranska bilagor
macrostrueFlagga makron, aktiva PDF-filer och RTF-objekt
arbitrarytrueKör reglerna
authenticationfalsetrue, eller {dnsServers, timeout, mta, weights}: SPF, DKIM, DMARC, ARC
reputationfalse{allowlist, denylist, apiUrl, headers, timeout}
allowlist, denylistIP-adresser, domäner eller adresser; kortform för reputation
clamavfalsetrue (standardsocket), {socket} eller {host, port}
llmnullInställningar för språkmodellen, med mode, minScore, maxScore
toxicityfalse{model, threshold = 0.7}: en modell vars classify([text]) svarar som @tensorflow-models/toxicity
nsfwfalse{model, threshold = 0.6}: en modell vars classify(imageBuffer) svarar som nsfwjs
maxLength100000Antal tecken i brödtexten som läses
timeout10000Millisekunder som tillåts för varje nätverkskontroll
session{}Standardvärden för SMTP-sessionen

scan() tar också emot 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 redan har kontrollerat SPFSender Policy Framework: en DNS-post som listar de servrar som får skicka e-post för en domän., DKIMDomainKeys Identified Mail: en signatur över ett meddelande, som kontrolleras med en publik nyckel publicerad i avsändarens DNS., DMARCEn DNS-policy som talar om för mottagare vad de ska göra när e-post som utger sig för att komma från en domän inte klarar SPF- och DKIM-anpassningen. och ARCAuthenticated Received Chain: signaturer som för autentiseringsresultat vidare genom servrar som vidarebefordrar e-post. (med mailauth) kan skicka med resultaten som authenticationResults, och då poängsätts de i stället för att kontrolleras igen:

JavaScript
import {authenticate} from 'mailauth';

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

Metoder#

MetodReturnerar
scan(source, options)Resultatet. source är en Buffer, en sträng, en Uint8Array eller en läsbar ström
scanFile(path, options)Resultatet för en meddelandefil
learn(source, 'spam' | 'ham')Lär klassificeraren ett meddelande
unlearn(source, 'spam' | 'ham')Ångrar learn
saveModel(path, options)Skriver klassificeraren till en fil (options: minCount, maxFeatures, metadata)
getClassifier()Den Classifier som används, eller null
getClassification(features)Klassificerarens utslag för egenskaper från getFeatures
getFeatures(mail){features, words, language, script, links, hosts, text, hidden} för ett meddelande
getTokens(text, locale)Orden i en text
getTokensAndMailFromSource(source){tokens, features, mail}
parse(source){raw, mail}, med mail från mailparser

I getFeatures är text den text som ett e-postprogram visar, som orden läses ur, och hidden hur många tecken text som HTML-koden döljer.

scanner.metrics innehåller totalScans, averageTime och 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},
}

Fynd i phishing, attachments, executables, macros, viruses och arbitrary är objekt med en type och ett message. String(finding) är meddelandet.

Exporter#

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';

Klassificerare#

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}
AlternativStandardBetydelse
strength, unknown0.45, 0.5Robinsons s och x: hur starkt sällsynta egenskaper dras mot 0,5
minDistance0.1Egenskaper som ligger närmare 0,5 än detta ignoreras
maxClues150Antal starkaste egenskaper som kombineras per meddelande
hamCutoff, spamCutoff0.2, 0.99Gränserna för intervallet unsure
minLanguageExamples, languageShare1000, 0.02Antal meddelanden av varje klass som krävs på ett språk för full konfidens
languagePriortrueVäg ord mot räkningen för deras eget språk

merge(other), toJSON(options), Classifier.fromJSON(json), size och entries() finns också.

Träning#

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 emot poster av formen {label, features}, eller readExamples(sources), som läser samma källor som train, och returnerar antal, precision, täckning (recall), F1, träffsäkerhet samt andelar falska positiva, falska negativa och osäkra.

Servrar#

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 läser och skriver rapporter om missbruk (RFC 5965), formatet som e-postleverantörer använder för att rapportera spamklagomål:

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() returnerar null i stället för att kasta ett fel för meddelanden som inte är rapporter, och isArfMessage(mail) kontrollerar ett tolkat meddelande.

Redigera den här sidan på GitHub · Markdown ·