Roskapostisuodatin, joka lukee kaikkia kieliä ja perustelee jokaisen päätöksen.

Spam Scanner tunnistaa roskapostin, tietojenkalastelun, huijaukset ja haittaohjelmat Node.js:lle, komentoriville ja postipalvelimille, kuten Postfixille, Eximille ja Harakalle. Jokainen tulos luettelee lauenneet testit ja syyt.

npm install -g spamscanner
  • Node.js 18+
  • Milter, spamd, HTTP
  • Ollama, Claude, ChatGPT
  • Ei telemetriaa
$ spamscanner scan message.eml
SPAM  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.top
$ echo $?
1

Miten viesti arvioidaan

Jokainen tarkistus lisää tai vähentää pisteitä, ja kokonaissumma ratkaisee. Rajoja ja pisteitä voi muuttaa, eikä mikään ole musta laatikko: tulos nimeää jokaisen testin.

  1. Lue

    Viesti jäsennetään ja sen teksti normalisoidaan: tyylitellyt kirjaimet, näkymättömät merkit ja samannäköiset aakkoset puretaan.

  2. Tarkista

    Luokitin sekä linkki-, liite-, todennus-, estolista- ja sääntötarkistukset ajetaan samanaikaisesti, kukin omalla aikakatkaisullaan.

  3. Pisteet

    Jokainen testi lisää tai vähentää pisteitä. 5 pisteestä alkaen viesti on roskapostia, 15 pisteestä alkaen postipalvelimen pitäisi hylätä se.

  4. Kysy

    Epäselvät tapaukset voidaan lähettää kielimallille, joka lisää enintään 6 pistettä tai vähentää enintään 3.

  • alle 5hyväksy
  • 5–15merkitse roskapostiksi
  • 15 ja ylihylkää

Katso se 1:58 minuutissa

Miten viesti pisteytetään, miten jokaista kieltä luetaan, milloin kielimallilta kysytään ja miten se liitetään Postfixiin, Eximiin, Harakaan ja Node.js:ään.

Englanninkielinen selostus ja tekstitys.

Videon otsikkoruutu: Spam Scannerin logo.

Mitä se tarkistaa

Sanat ovat yksi signaali. Linkit, lähettäjät, liitteet ja todennus kertovat yhtä paljon, eikä mikään niistä riipu viestin kielestä.

  • Luokitin jokaiselle kirjoitusjärjestelmälle

    Sanat, sanaparit, linkit, lähettäjät, HTML ja liitteet laskettuina ja yhdistettyinä SpamBayesin tapaan, ja rehellinen "epävarma", kun vihjeet ovat ristiriidassa.

    Miten se päättää
  • Jokainen kieli, huolellisesti

    Unicode-sanojen pilkkominen kiinalle, japanille ja thaille, naamioinnit purettuina, eikä rangaistusta kielestä, jolla malli näki vähän hamia.

    Kielet
  • Tietojenkalastelu

    Samannäköiset verkkotunnukset kyrillisillä tai vaihdetuilla kirjaimilla, linkit, joiden teksti näyttää toisen osoitteen, tuotemerkit näyttönimissä ja Cloudflaren haittaohjelmia estävä DNS-palvelu.

    Tietojenkalastelun tarkistukset
  • Liitteet

    Suoritettavat tiedostot tunnistetaan tavuista, myös .pdf-päätteiseksi nimettyinä; kaksoispäätteet; ohjelmat ZIP-tiedostoissa; Office-makrot; aktiiviset PDF:t; ClamAV.

    Liitetarkistukset
  • Todennus

    SPF, DKIM, DMARC ja ARC, DNS-estolistat, sallitut ja estetyt -listat sekä sääntö postille, joka väärentää oman verkkotunnuksesi.

    Todennus
  • Kielimallit

    Epäselvät tapaukset menevät mallille: Ollama omalla koneellasi tai Claude, ChatGPT, Gemini ja mikä tahansa OpenAI-yhteensopiva palvelin.

    Kielimallit

Kaikki testit ja niiden pisteetMiten se toimii

Jokainen kieli, ilman arvailua

Sanat erotellaan Unicoden sääntöjen mukaan, joten myös ilman välilyöntejä kirjoitetut kielet toimivat, ja naamioinnit puretaan ennen laskemista. Nämä ovat luokittimen laskemat sanat, laskettuina tämän sivun koostamishetkellä.

Kieli, jolla mukana tulevan mallin koulutusaineistossa oli vähän hamia, saa tuloksen "epävarma" eikä "roskaposti", joten tavallista arabian- tai koreankielistä postia ei koskaan merkitä sen kirjoitusjärjestelmän vuoksi. Kielet

Naamioitu englanti

Claim your fr␣ee prіze: V1agra 𝐅𝐑𝐄𝐄

  • claim
  • your
  • free
  • prize
  • viagra
  • free

Nollalevyinen välilyönti, kyrillinen і, numero kirjaimen tilalla ja matemaattiset lihavoidut kirjaimet

Kiina, ei välilyöntejä

恭喜您获得一百万元大奖

  • 恭喜
  • 您
  • 获得
  • 一
  • 百万
  • 元
  • 大奖

Pilkottu sanakirjan avulla

Thai, ei välilyöntejä

ยินดีด้วยคุณได้รับรางวัลหนึ่งล้านบาท

  • ยินดี
  • ด้วย
  • คุณ
  • ได้
  • รับ
  • รางวัล
  • หนึ่ง
  • ล้าน
  • บาท

Pilkottu sanakirjan avulla

Venäjä

Поздравляем! Вы выиграли миллион

  • поздравляем
  • вы
  • выиграли
  • миллион

Pienaakkosiksi Unicoden sääntöjen mukaan

Liitetään postipalvelimeesi

Milter Postfixille ja Sendmailille, SpamAssassin-yhteensopiva spamd-palvelin spamc:lle, Eximille ja Harakalle, sisältösuodatin, HTTP API, TCP-palvelin ja kirjasto.

Kaikki lisäävät X-Spam-Flag, X-Spam-Score, X-Spam-Status-otsakkeet ja poistavat lähettäjän väärentämät.

Shell
spamscanner milter --port 7831 --auth --subject-tag "[SPAM]"

# /etc/postfix/main.cf
smtpd_milters = inet:127.0.0.1:7831
milter_default_action = accept

Milter tarkistaa postin SMTP-istunnon aikana, joten hylkäysrajan ylittävä roskaposti torjutaan ennen kuin se otetaan vastaan. Postfix-opas

Kielimalli epäselviin tapauksiin

Selvä roskaposti ja selvä ham eivät koskaan päädy sille. Kun pisteet ovat lähellä rajaa tai luokitin on epävarma, malli lukee viestin ja vastaa: roskaposti, tietojenkalastelu, huijaus, haittaohjelma tai ham. Aja mallia omalla koneellasi tai käytä palveluna tarjottua, millä tahansa URL-osoitteella, portilla ja todennuksella.

Viestiin tekoälysuodattimille piilotetut ohjeet pisteytetään roskapostiksi, ja mallille kerrotaan, että viesti on dataa. Päästä päähän -testit tarkistavat tämän oikealla mallilla Ollaman kautta.

  • Ollama
  • LM Studio
  • llama.cpp server
  • vLLM
  • LocalAI
  • Jan
  • OpenAI
  • Anthropic (Claude)
  • Google Gemini
  • Mistral AI
  • Groq
  • OpenRouter
  • DeepSeek
  • xAI
  • Together AI
  • Fireworks AI
  • Cerebras
  • Hugging Face Inference Providers
  • Azure OpenAI
  • Cloudflare Clef
  • Cloudflare Clef Flash
  • TypeSafe Jev
  • TypeSafe Jev on OpenRouter
  • Any decision model server
Shell
ollama pull qwen3.5:4b
spamscanner llm-test --llm ollama --llm-model qwen3.5:4b
spamscanner milter --llm ollama --llm-model qwen3.5:4b

Ääriviivoin merkitty: toimii omalla koneellasi. Henkilötiedot poistetaan ennen kuin viesti lähetetään palveluntarjoajalle.

OllamaHugging FaceLisenssiKoko
qwen3.5:0.8bQwen/Qwen3.5-0.8BApache-2.01.3 GB
gemma4:e2bgoogle/gemma-4-E2B-itApache-2.04.6 GB
qwen3.5:4bQwen/Qwen3.5-4BApache-2.03.3 GB
qwen3.5:9bQwen/Qwen3.5-9BApache-2.06.6 GB
gpt-oss-safeguard:20bopenai/gpt-oss-safeguard-20bApache-2.014 GB

Suositellut avoimet mallit. Kaikki suositukset

Mitattu ja koulutettava

Mukana tuleva malli on koulutettu julkisilla aineistoilla ja testattu viesteillä, joita se ei nähnyt. Omalla postillasi koulutettu malli toimii paremmin: kouluta se mbox-tiedostoista, Maildir-hakemistoista tai aineistoista, mittaa se ja opeta sitä "ilmoita roskapostiksi" -painikkeiden avulla.

Koulutus

Erilleen jätetyt viestitViestitTarkkuusSaantiVäärät hälytykset
englanti6 564100,0 %97,1 %0,0 %
venäjä1 682100,0 %97,4 %0,0 %
italia1 38998,1 %85,3 %1,8 %
saksa1 30997,7 %76,1 %2,2 %
espanja1 28197,5 %82,6 %2,6 %
Kaikki13 84099,2 %85,1 %0,6 %

Pelkkä luokitin, mitattuna sen julkisen koulutusaineiston joka kymmenennellä, erilleen jätetyllä viestillä. Epävarmat viestit lasketaan ohi menneiksi. Saksa, italia ja espanja ovat peräisin synteettisistä aineistoista, joiden luokittelu on epätarkkaa. Tietoa mukana tulevasta mallista

Tehty Forward Emailille

Forward Email ei tallenna lokeja viestien sisällöstä, joten se ei voinut lähettää postia ulkopuoliselle suodatuspalvelulle. Spam Scanner toimii omilla palvelimillasi, ei lähetä mitään minnekään, ellei sitä ole niin määritetty, ja perustelee jokaisen päätöksen ilman, että kukaan lukee postia. Forward Email ja päivittäminen

Projektin takana on Forward Email, yksityisyyteen keskittyvä sähköpostipalvelu.