あらゆる言語を読み、すべての判定を説明するスパムフィルター。

Spam Scannerは、Node.js、コマンドライン、そしてPostfix、Exim、Harakaなどのメールサーバーで、スパム、フィッシング、詐欺、マルウェアを検出します。どの結果にも、該当したテストとその理由が示されます。

npm install -g spamscanner
  • Node.js 18+
  • milter、spamd、HTTP
  • Ollama, Claude, ChatGPT
  • テレメトリーなし
$ 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

メッセージの判定方法

各検査が点数を加算または減算し、合計で判定します。しきい値と点数は変更でき、ブラックボックスはありません。結果には各テストの名前が示されます。

  1. 読む

    メッセージを解析し、テキストを正規化します。装飾文字、不可視文字、紛らわしい文字体系は元に戻します。

  2. 確認

    分類器、リンク、添付ファイル、認証、ブロックリスト、ルールの各検査は同時に実行され、それぞれにタイムアウトがあります。

  3. スコア

    各テストが点数を加算または減算します。5点でスパム、15点でメールサーバーが拒否すべきメッセージです。

  4. 質問する

    際どい判定は言語モデルに回せます。モデルは最大6点を加算し、最大3点を減算します。

  • 5未満受信
  • 5〜15スパムとしてタグ付け
  • 15以上拒否

1:58で見る

メッセージの採点方法、各言語の読み方、言語モデルに問い合わせる条件、そしてPostfix、Exim、Haraka、Node.jsへの組み込み方。

英語のナレーションと英語字幕付き。

動画のタイトル画面:Spam Scannerのロゴ。

検査する内容

単語は手がかりの一つにすぎません。リンク、送信者、添付ファイル、認証も同じくらい多くを語り、いずれもメッセージの言語には左右されません。

  • どの文字体系にも対応する分類器

    単語、単語の組、リンク、送信者、HTML、添付ファイルをSpamBayesと同じ方法で数えて組み合わせます。手がかりが食い違うときは、正直に「判定不能」と答えます。

    判定の仕組み
  • あらゆる言語を、慎重に

    中国語、日本語、タイ語をUnicodeの規則で単語に分割し、偽装を元に戻します。モデルがハムをあまり学習していない言語にペナルティは科しません。

    言語
  • フィッシング

    キリル文字や入れ替えた文字を使った類似ドメイン、表示テキストと別のアドレスを指すリンク、表示名に含まれるブランド名、Cloudflareのマルウェア対策リゾルバー。

    フィッシングの検査
  • 添付ファイル

    バイト列から見つける実行ファイル(.pdfに名前を変えたものも含む)、二重拡張子、ZIPファイル内のプログラム、Officeマクロ、アクティブなPDF、ClamAV。

    添付ファイルの検査
  • 認証

    SPF、DKIM、DMARC、ARC、DNSブロックリスト、許可リストと拒否リスト、そして自分のドメインを詐称するメール向けのルール。

    認証
  • 言語モデル

    際どい判定はモデルに回します。自分のマシンのOllama、またはClaude、ChatGPT、Gemini、OpenAI互換の任意のサーバーを使えます。

    言語モデル

全テストとその点数仕組み

あらゆる言語を、推測に頼らずに

単語はUnicodeの規則で抽出するため、スペースを使わない言語にも対応し、偽装は数える前に元に戻します。以下は分類器が数える単語で、このページのビルド時に計算したものです。

同梱モデルがハムをあまり学習していない言語は「スパム」ではなく「判定不能」になります。そのため、アラビア語や韓国語の普通のメールが文字体系を理由にスパム扱いされることはありません。 言語

偽装された英語

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

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

ゼロ幅スペース、キリル文字のі、文字の代わりの数字、数学用太字

中国語(スペースなし)

恭喜您获得一百万元大奖

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

辞書で分かち書き

タイ語(スペースなし)

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

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

辞書で分かち書き

ロシア語

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

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

Unicodeの規則で小文字化

メールサーバーに組み込める

PostfixとSendmail向けのmilter、spamc・Exim・Haraka向けのSpamAssassin互換spamdサーバー、コンテンツフィルター、HTTP API、TCPサーバー、そしてライブラリ。

どの方法でもX-Spam-Flag, X-Spam-Score, X-Spam-Statusヘッダーを追加し、送信者が偽造したものは削除します。

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はSMTPセッション中にメールを検査するため、拒否のしきい値に達したスパムは受け取る前に拒否されます。 Postfixガイド

判定が際どいときは言語モデルに

明らかなスパムと明らかなハムはモデルに渡りません。スコアが際どいときや分類器が判定できないときに、モデルがメッセージを読み、スパム、フィッシング、詐欺、マルウェア、ハムのいずれかで答えます。自分のマシンで動かすことも、ホスト型を使うこともでき、URL、ポート、認証は自由に設定できます。

AIフィルター向けにメッセージに隠された指示はスパムとして採点され、モデルにはメッセージがデータであることが伝えられます。エンドツーエンドテストでは、Ollama経由で実際のモデルを相手にこれを確認します。

  • 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

枠線付きのものは自分のマシンで動作します。ホスト型のプロバイダーにメッセージを送る前に、個人データは削除されます。

OllamaHugging Faceライセンスサイズ
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

推奨のオープンモデル。 すべての推奨モデル

計測済みで、学習も可能

同梱モデルは公開データセットで学習し、学習に使っていないメッセージでテストしています。自分のメールで学習したモデルのほうが精度は上がります。mboxファイル、Maildir、データセットから学習させ、精度を計測し、「迷惑メールとして報告」ボタンから学習させてください。

学習

評価用に取り分けたメッセージメッセージ適合率再現率誤検知
英語6,564100.0%97.1%0.0%
ロシア語1,682100.0%97.4%0.0%
イタリア語1,38998.1%85.3%1.8%
ドイツ語1,30997.7%76.1%2.2%
スペイン語1,28197.5%82.6%2.6%
すべて13,84099.2%85.1%0.6%

分類器単体の結果です。公開学習データの10件に1件を学習から除外して評価しています。判定不能のメッセージは見逃しとして数えます。ドイツ語、イタリア語、スペイン語は、ラベルにノイズのある合成データセットによるものです。 同梱モデルについて

Forward Emailのために開発

Forward Emailはメッセージ内容のログを残さないため、外部のフィルタリングサービスにメールを送ることはできませんでした。Spam Scannerは自分のサーバーで動作し、設定しない限りどこにも何も送らず、人がメールを読まなくてもすべての判定を説明します。 Forward Emailとアップグレード

プライバシー重視のメールサービス、Forward Emailのプロジェクトです。