あらゆる言語を読み、すべての判定を説明するスパムフィルター。
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
メッセージの判定方法
各検査が点数を加算または減算し、合計で判定します。しきい値と点数は変更でき、ブラックボックスはありません。結果には各テストの名前が示されます。
読む
メッセージを解析し、テキストを正規化します。装飾文字、不可視文字、紛らわしい文字体系は元に戻します。
確認
分類器、リンク、添付ファイル、認証、ブロックリスト、ルールの各検査は同時に実行され、それぞれにタイムアウトがあります。
スコア
各テストが点数を加算または減算します。5点でスパム、15点でメールサーバーが拒否すべきメッセージです。
質問する
際どい判定は言語モデルに回せます。モデルは最大6点を加算し、最大3点を減算します。
- 5未満受信
- 5〜15スパムとしてタグ付け
- 15以上拒否
検査する内容
単語は手がかりの一つにすぎません。リンク、送信者、添付ファイル、認証も同じくらい多くを語り、いずれもメッセージの言語には左右されません。
どの文字体系にも対応する分類器
単語、単語の組、リンク、送信者、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ヘッダーを追加し、送信者が偽造したものは削除します。
spamscanner milter --port 7831 --auth --subject-tag "[SPAM]"
# /etc/postfix/main.cf
smtpd_milters = inet:127.0.0.1:7831
milter_default_action = acceptmilterはSMTPセッション中にメールを検査するため、拒否のしきい値に達したスパムは受け取る前に拒否されます。 Postfixガイド
spamscanner spamd --port 783 --auth
spamc -c < message.eml # prints 16.3/5.0 and exits 1SpamAssassin互換のspamdサーバー。spamdを止めて同じポートでSpam Scannerを起動すれば、SpamAssassinのクライアントはそのまま動きます。 spamdガイド
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
}smtp-server、Harakaプラグイン、その他メールを扱うあらゆるサービス向けのライブラリ。 APIリファレンス
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"HTTPリクエストを送れる任意の言語とサーバー向け。 HTTP APIガイド
判定が際どいときは言語モデルに
明らかなスパムと明らかなハムはモデルに渡りません。スコアが際どいときや分類器が判定できないときに、モデルがメッセージを読み、スパム、フィッシング、詐欺、マルウェア、ハムのいずれかで答えます。自分のマシンで動かすことも、ホスト型を使うこともでき、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
ollama pull qwen3.5:4b
spamscanner llm-test --llm ollama --llm-model qwen3.5:4b
spamscanner milter --llm ollama --llm-model qwen3.5:4b枠線付きのものは自分のマシンで動作します。ホスト型のプロバイダーにメッセージを送る前に、個人データは削除されます。
| Ollama | ライセンス | サイズ |
|---|---|---|
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 |
推奨のオープンモデル。 すべての推奨モデル
計測済みで、学習も可能
同梱モデルは公開データセットで学習し、学習に使っていないメッセージでテストしています。自分のメールで学習したモデルのほうが精度は上がります。mboxファイル、Maildir、データセットから学習させ、精度を計測し、「迷惑メールとして報告」ボタンから学習させてください。
| 評価用に取り分けたメッセージ | メッセージ | 適合率 | 再現率 | 誤検知 |
|---|---|---|---|---|
| 英語 | 6,564 | 100.0% | 97.1% | 0.0% |
| ロシア語 | 1,682 | 100.0% | 97.4% | 0.0% |
| イタリア語 | 1,389 | 98.1% | 85.3% | 1.8% |
| ドイツ語 | 1,309 | 97.7% | 76.1% | 2.2% |
| スペイン語 | 1,281 | 97.5% | 82.6% | 2.6% |
| すべて | 13,840 | 99.2% | 85.1% | 0.6% |
分類器単体の結果です。公開学習データの10件に1件を学習から除外して評価しています。判定不能のメッセージは見逃しとして数えます。ドイツ語、イタリア語、スペイン語は、ラベルにノイズのある合成データセットによるものです。 同梱モデルについて
Forward Emailのために開発
Forward Emailはメッセージ内容のログを残さないため、外部のフィルタリングサービスにメールを送ることはできませんでした。Spam Scannerは自分のサーバーで動作し、設定しない限りどこにも何も送らず、人がメールを読まなくてもすべての判定を説明します。 Forward Emailとアップグレード
プライバシー重視のメールサービス、Forward Emailのプロジェクトです。
