Forward Email

Spam Scanner vytvořil Forward Email, e-mailová služba s otevřeným zdrojovým kódem zaměřená na soukromí, pro vlastní poštovní servery. Forward Email neuchovává žádné záznamy o obsahu zpráv, takže žádná externí filtrovací služba nepřicházela v úvahu: filtr musel běžet na jeho vlastních serverech a vysvětlit každé rozhodnutí, aniž by poštu četl člověk.

Tato stránka ukazuje, jak ho používá poštovní server, jako je ten od Forward Email, a co se změnilo pro kód napsaný pro Spam Scanner 5 nebo 6.

Na serveru příchozí pošty#

Forward Email přijímá poštu pomocí smtp-server. Vzor pro jakýkoli server postavený na něm:

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() přijímá stream SMTP přímo. Pokud už máte k dispozici výsledky z mailauth, vynechte authentication a předejte jen IP adresu.

Odpověď 421 nebo 451 způsobí, že odesílající server zprávu zařadí do fronty a zkusí to později znovu. Nová pravidla pro odmítání tak mohou začít s dočasným kódem a přejít na 550, až budou jejich výsledky ověřené, aniž by se mezitím ztratila pošta.

Přechod z verze 5 nebo 6#

Verze 7 je přepsaná od základu. Konstruktor, scan() a pole výsledku, která čte kód pro verze 5 a 6, stále fungují; změnil se klasifikátor, model a volitelné kontroly s TensorFlow.

Beze změny#

  • new SpamScanner(options) a await scanner.scan(source).
  • require('spamscanner') vrací třídu a import SpamScanner from 'spamscanner' funguje.
  • result.isSpam, result.message a result.results.classification, .phishing, .executables, .arbitrary, .viruses, .macros a .idnHomographAttack.
  • Každá položka v results.phishing, .executables, .arbitrary a .viruses se převede na stejný druh textu zprávy jako dřív (String(item), šablonové literály, message.includes('adult-related content')). Nyní jsou to objekty s type, message a podrobnostmi.
  • getTokensAndMailFromSource(), getClassification() a getTokens().
  • Tyto volby se převádějí na nové názvy: clamscan na clamav, enableMacroDetection: false na macros: false, enableArbitraryDetection: false na arbitrary: false, enableAuthentication s authOptions na authentication a session, enableReputation s reputationOptions.apiUrl na reputation, strictIDNDetection na phishing.homograph.strictMode, a allowlist a denylist. logger a memoize se přijímají a ignorují.

Změněno#

DříveNyní
scan('path/to/file.eml') přečetl souborŘetězec je text zprávy. Použijte scanFile(path) nebo předejte Buffer
Naivní Bayesův model slov (classifier.json), který už nelze načístNový klasifikátor a formát modelu; přetrénujte pomocí spamscanner train (trénování)
Kontroly toxicity a NSFW načítaly při prvním použití modely TensorFlow ze sítěPoužijte vlastní model: toxicity: {model} a nsfw: {model} přijímají jakýkoli objekt s metodou classify(), například z @tensorflow-models/toxicity a nsfwjs
results.arbitrary uváděl každý vzor, který odpovídalUvádí pravidla dost silná na to, aby samy označila spam; všechna pravidla jsou v result.tests
Odpověď ano, nebo neresult.score, result.action (accept, tag nebo reject) a result.tests, každý s body a důvodem
isSpam rozhodoval klasifikátor nebo kterákoli jednotlivá kontrolaisSpam znamená skóre 5 nebo více; prahy i body lze změnit
Kontroly reputace proti koncovému bodu Forward EmailObecná služba reputace, vypnutá, dokud není nastaveno reputation.apiUrl

Nové#

  • Jazykové modely pro hraniční případy, lokální nebo hostované.
  • SPFSender Policy Framework: záznam v DNS se seznamem serverů, které smějí za doménu odesílat poštu., DKIMDomainKeys Identified Mail: podpis zprávy ověřovaný veřejným klíčem zveřejněným v DNS odesílatele., DMARCZásada v DNS, která příjemcům říká, co dělat s poštou, jež se hlásí k doméně, ale neprojde zarovnáním SPF a DKIM. a ARCAuthenticated Received Chain: podpisy, které přenášejí výsledky ověření přes přeposílající servery.; DNS blocklisty; filtrovací resolvery Cloudflare.
  • Kontroly příloh podle obsahu: maskované spustitelné soubory, archivy, makra, aktivní PDF.
  • Milter, HTTP API, TCP server a server spamd a příkazová řádka.
  • Trénování, vyhodnocování a učení z hlášení, z příkazové řádky nebo přes API.

Upravit tuto stránku na GitHubu · Markdown ·