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.
Lue
Viesti jäsennetään ja sen teksti normalisoidaan: tyylitellyt kirjaimet, näkymättömät merkit ja samannäköiset aakkoset puretaan.
Tarkista
Luokitin sekä linkki-, liite-, todennus-, estolista- ja sääntötarkistukset ajetaan samanaikaisesti, kukin omalla aikakatkaisullaan.
Pisteet
Jokainen testi lisää tai vähentää pisteitä. 5 pisteestä alkaen viesti on roskapostia, 15 pisteestä alkaen postipalvelimen pitäisi hylätä se.
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ää
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.
KieletTietojenkalastelu
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 tarkistuksetLiitteet
Suoritettavat tiedostot tunnistetaan tavuista, myös .pdf-päätteiseksi nimettyinä; kaksoispäätteet; ohjelmat ZIP-tiedostoissa; Office-makrot; aktiiviset PDF:t; ClamAV.
LiitetarkistuksetTodennus
SPF, DKIM, DMARC ja ARC, DNS-estolistat, sallitut ja estetyt -listat sekä sääntö postille, joka väärentää oman verkkotunnuksesi.
TodennusKielimallit
Epäselvät tapaukset menevät mallille: Ollama omalla koneellasi tai Claude, ChatGPT, Gemini ja mikä tahansa OpenAI-yhteensopiva palvelin.
Kielimallit
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
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
恭喜您获得一百万元大奖
- 恭喜
- 您
- 获得
- 一
- 百万
- 元
- 大奖
Pilkottu sanakirjan avulla
ยินดีด้วยคุณได้รับรางวัลหนึ่งล้านบาท
- ยินดี
- ด้วย
- คุณ
- ได้
- รับ
- รางวัล
- หนึ่ง
- ล้าน
- บาท
Pilkottu sanakirjan avulla
Поздравляем! Вы выиграли миллион
- поздравляем
- вы
- выиграли
- миллион
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.
spamscanner milter --port 7831 --auth --subject-tag "[SPAM]"
# /etc/postfix/main.cf
smtpd_milters = inet:127.0.0.1:7831
milter_default_action = acceptMilter tarkistaa postin SMTP-istunnon aikana, joten hylkäysrajan ylittävä roskaposti torjutaan ennen kuin se otetaan vastaan. Postfix-opas
spamscanner spamd --port 783 --auth
spamc -c < message.eml # prints 16.3/5.0 and exits 1SpamAssassin-yhteensopiva spamd-palvelin: pysäytä spamd, käynnistä Spam Scanner samaan porttiin, ja SpamAssassin-asiakkaat toimivat edelleen. spamd-opas
import SpamScanner from 'spamscanner';
const scanner = new SpamScanner({authentication: true});
const result = await scanner.scan(stream, {session});
if (result.action === 'reject') {
// refuse with a 4xx or 5xx reply
}Kirjasto smtp-serverille, Haraka-laajennuksille tai mille tahansa postia käsittelevälle palvelulle. API-viite
spamscanner http --port 7832 --token "$TOKEN"
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
--data-binary @message.eml "http://127.0.0.1:7832/scan?ip=203.0.113.5"Mille tahansa kielelle ja palvelimelle, joka osaa tehdä HTTP-pyynnön. HTTP API -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
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.
| Ollama | Lisenssi | Koko |
|---|---|---|
qwen3.5:0.8b | Apache-2.0 | 1.3 GB |
gemma4:e2b | Apache-2.0 | 4.6 GB |
qwen3.5:4b | Apache-2.0 | 3.3 GB |
qwen3.5:9b | Apache-2.0 | 6.6 GB |
gpt-oss-safeguard:20b | Apache-2.0 | 14 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.
| Erilleen jätetyt viestit | Viestit | Tarkkuus | Saanti | Väärät hälytykset |
|---|---|---|---|---|
| englanti | 6 564 | 100,0 % | 97,1 % | 0,0 % |
| venäjä | 1 682 | 100,0 % | 97,4 % | 0,0 % |
| italia | 1 389 | 98,1 % | 85,3 % | 1,8 % |
| saksa | 1 309 | 97,7 % | 76,1 % | 2,2 % |
| espanja | 1 281 | 97,5 % | 82,6 % | 2,6 % |
| Kaikki | 13 840 | 99,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.
