Forward Email

Spam Scanner ble laget av Forward Email, e-posttjenesten med åpen kildekode og fokus på personvern, for selskapets egne e-postservere. Forward Email lagrer ingen logger over meldingsinnhold, så ingen ekstern filtreringstjeneste kunne brukes: filteret måtte kjøre på egne servere og måtte forklare hver avgjørelse uten at et menneske leste e-posten.

Denne siden viser hvordan en e-postserver som Forward Emails bruker det, og hva som er endret for kode skrevet for Spam Scanner 5 eller 6.

På en server for innkommende e-post#

Forward Email mottar e-post med smtp-server. Mønsteret, for enhver server bygget på den:

JavaScript
const SpamScanner = require('spamscanner');

const scanner = new SpamScanner({
  clamav: true,                  // clamd on its default socket
  authentication: true,          // SPF, DKIM, DMARC, ARC
  dnsbl: {ip: ['zen.spamhaus.org'], domain: ['dbl.spamhaus.org']},
  dns: {servers: ['127.0.0.1']}, // a local caching resolver
});

async function onData(stream, session, callback) {
  const scan = await scanner.scan(stream, {
    session: {
      remoteAddress: session.remoteAddress,
      resolvedClientHostname: session.clientHostname,
      helo: session.hostNameAppearsAs,
      envelope: session.envelope,
    },
  });

  if (scan.results.viruses.length > 0) {
    return callback(Object.assign(new Error(`Message contains a virus: ${scan.results.viruses[0]}`), {responseCode: 554}));
  }

  if (scan.action === 'reject') {
    // A temporary error: the sender retries, and a wrong decision can be undone.
    return callback(Object.assign(new Error(`Message rejected as spam: ${scan.message}`), {responseCode: 421}));
  }

  // scan.isSpam: deliver to the Junk folder, or add scan's headers (spamHeaders) and forward.
  callback();
}

scanner.scan() tar imot SMTP-strømmen direkte. Hvis du allerede har resultater fra mailauth, kan du hoppe over authentication og bare sende med IP-adressen.

Et svar med 421 eller 451 får avsenderserveren til å legge meldingen i kø og prøve igjen senere. Nye avvisningsregler kan starte med en midlertidig kode og gå over til 550 når resultatene er kontrollert, uten at e-post går tapt i mellomtiden.

Oppgradering fra versjon 5 eller 6#

Versjon 7 er skrevet om fra bunnen av. Konstruktøren, scan() og resultatfeltene som kode for versjon 5 og 6 leser, virker fortsatt; klassifisereren, modellen og de valgfrie TensorFlow-sjekkene er endret.

Fortsatt det samme#

  • new SpamScanner(options) og await scanner.scan(source).
  • require('spamscanner') returnerer klassen, og import SpamScanner from 'spamscanner' virker.
  • result.isSpam, result.message og result.results.classification, .phishing, .executables, .arbitrary, .viruses, .macros og .idnHomographAttack.
  • Hvert element i results.phishing, .executables, .arbitrary og .viruses gjøres om til samme type meldingsstreng som før (String(item), malstrenger, message.includes('adult-related content')). De er nå objekter med type, message og detaljer.
  • getTokensAndMailFromSource(), getClassification() og getTokens().
  • Disse alternativene er knyttet til sine nye navn: clamscan til clamav, enableMacroDetection: false til macros: false, enableArbitraryDetection: false til arbitrary: false, enableAuthentication med authOptions til authentication og session, enableReputation med reputationOptions.apiUrl til reputation, strictIDNDetection til phishing.homograph.strictMode, samt allowlist og denylist. logger og memoize godtas og ignoreres.

Endret#

FørNå
scan('path/to/file.eml') leste filenEn streng er meldingstekst. Bruk scanFile(path) eller send en Buffer
En naiv Bayes-modell av ord (classifier.json), som ikke kan lastes inn nåEn ny klassifiserer og et nytt modellformat; tren på nytt med spamscanner train (trening)
Sjekkene for toksisitet og NSFW lastet inn TensorFlow-modeller fra nettet ved første brukTa med din egen modell: toxicity: {model} og nsfw: {model} tar imot ethvert objekt med en classify()-metode, for eksempel fra @tensorflow-models/toxicity og nsfwjs
results.arbitrary listet opp alle mønstre som traffDen lister opp regler som er sterke nok til å merke spam alene; alle regler finnes i result.tests
Et ja-eller-nei-svarresult.score, result.action (accept, tag eller reject) og result.tests, hver med poeng og en begrunnelse
isSpam ble avgjort av klassifisereren eller en hvilken som helst enkeltsjekkisSpam er en poengsum på 5 eller mer; terskler og poeng kan endres
Omdømmesjekker mot et endepunkt hos Forward EmailEn generell omdømmetjeneste, av med mindre reputation.apiUrl er satt

Nytt#

  • Språkmodeller for vanskelige tilfeller, lokale eller driftede.
  • 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.; DNS-blokkeringslister; Cloudflares filtrerende resolvere.
  • Vedleggssjekker ut fra innhold: forkledde kjørbare filer, arkiver, makroer, aktive PDF-er.
  • En milter, et HTTP API, en TCP-server og en spamd-server, og en kommandolinje.
  • Trening, evaluering og læring fra rapporter, fra kommandolinjen eller API-et.

Rediger denne siden på GitHub · Markdown ·