先日、メールサーバーの迷惑メール対策を見直していたとき、受信メールのヘッダーも確認してみました。
私が使っているCORESERVERでは、迷惑メールの判定に「SpamAssassin」というソフトが使われています。
メールヘッダーには、次のように書かれていました。
X-Spam-Level: ******
X-Spam-Status: Yes, score=6.5 required=6.0
スパムスコアが6.5で、アスタリスク(*)が6個。スコアとアスタリスクの数が関係しているようです。
ところが、ほかのメールも見てみると、スコアがマイナスになっていたり、スコアが3.0なのにアスタリスクが2個しかなかったりします。
どういう仕組みなのか気になったので、Apacheの公式資料を調べてみました。忘れないように、調べた内容をまとめておきます。
SpamAssassinとは?迷惑メールを判定するソフト
SpamAssassin(スパムアサシン)は、Apache Software Foundationが公開しているオープンソースの迷惑メール判定ソフトです。長年にわたって、さまざまなメールサーバーで利用されています。
メールの送信元や本文などを複数の方法で検査し、その結果を点数にして、迷惑メールかどうかを判定します。この点数が「スパムスコア」です。
私の利用環境は、CORESERVER V1、WebメールはSquirrelMail 1.4.22です。
2026年10月26日に受信メールのヘッダーを確認したところ、SpamAssassin 3.4.6が使われていました。
SpamAssassin自体はCORESERVER専用のものではありません。
以下で紹介するスコアの考え方は、ほかのメールサーバーで使われているSpamAssassinにも共通するものです。
X-Spam-Statusの見方!scoreとrequiredは何を意味する?
SpamAssassinの判定結果は、メールヘッダーの「X-Spam-Status」で確認できます。
実際に受信したメールには、次のように書かれていました。

X-Spam-Status: No, score=-1.9 required=6.0 です。
| 表示 | 意味 |
|---|---|
| No | 迷惑メールとは判定されず |
| score=-1.9 | このメールのスパムスコア |
| required=6.0 | 迷惑メールと判定する基準値 |
このメールのスコアは-1.9。判定基準の6.0より低いため、「No」と表示されています。
一方、別のメールには次のように書かれていました。

X-Spam-Status: Yes, score=6.5 required=6.0 です。
こちらはスコアが6.5で、基準値の6.0以上になっているため「Yes」(迷惑メール判定)です。
つまり、基本的には「scoreがrequired以上ならYes、未満ならNo」となります。
なお、requiredの値は環境によって異なります。SpamAssassinの標準設定は5.0ですが、私の環境では6.0になっています。
また、「No」は迷惑メールと判定されなかったという意味で、そのメールが必ず安全だと保証するものではありません。
X-Spam-Levelとは?アスタリスクの数とスパムスコアの関係
次に「X-Spam-Level」です。こちらには、スパムスコアに応じた数のアスタリスクが付きます。
【例】X-Spam-Level: ******
基本的には、スパムスコアの小数部分を切り捨てた数だけアスタリスクが付きます。
アスタリスクの数とスパムスコアの関係は、次のとおりです。
| X-Spam-Level | スパムスコアの範囲 |
|---|---|
| なし | 1.0未満(マイナスを含む) |
| * | 1.0以上2.0未満 |
| ** | 2.0以上3.0未満 |
| *** | 3.0以上4.0未満 |
| **** | 4.0以上5.0未満 |
| ***** | 5.0以上6.0未満 |
| ****** | 6.0以上7.0未満 |
| ******* | 7.0以上8.0未満 |
| ******** | 8.0以上9.0未満 |
※この表は、SpamAssassinが内部で計算したスパムスコアをもとにしています。
例えば、スコアが2.5ならアスタリスクは2個、6.5なら6個です。
ただし、実際のメールでは、X-Spam-Statusに表示されるスコアとアスタリスクの数が一致しないことがあります。
スパムスコアが3.0なのにアスタリスクが2個?その理由は
実際に受信したメールに、次のようなものがありました。

X-Spam-Level: **
X-Spam-Status: No, score=3.0 required=6.0
です。
スコアは3.0なのに、アスタリスクは2個。先ほどの表と合わないように見えます。
Apacheの公式Wiki「RoundingIssues」を読むと、この理由がわかりました。
SpamAssassinでは、スコアを小数第3位まで計算しています。
ただし、X-Spam-Statusには通常、小数第1位に丸めた数値が表示されます。
一方、X-Spam-Levelのアスタリスク数は、丸める前の数値の小数部分を切り捨てて決まります。
例えば、内部スコアが2.970だったとします。
| 項目 | 数値・表示 |
|---|---|
| 内部スコア | 2.970 |
| X-Spam-Status | score=3.0 |
| X-Spam-Level | ** |
内部スコアは3.0未満なのでアスタリスクは2個ですが、表示されるスコアは丸められて3.0になります。
今回のメールの内部スコアが実際に2.970だったと確認できたわけではありませんが、この仕組みなら、スコア3.0でアスタリスクが2個という表示も説明できます。
なお、判定基準値の直前では、丸めによって基準値に達したように見えないよう、例外的な表示処理が行われる場合もあります。
スパムスコアはどうやって決まる?マイナスになる理由も
SpamAssassinは、複数の検査ルールに該当した結果を合計してスパムスコアを出しています。
迷惑メールらしい特徴にはプラスの点数、正常なメールらしい特徴にはマイナスの点数が付くことがあります。
メールのどんなところを調べている?
検査の対象には、例えば次のようなものがあります。
- メールの送信元に関する情報
- SPFやDKIMなどのメール認証の結果
- メール本文の内容や特徴
- 本文に含まれるURL
- ベイズフィルターによる判定
ベイズフィルターは、学習したメールの特徴をもとに、迷惑メールらしさを統計的に判定する仕組みです。
実際に受信したメールのヘッダーには、tests=の後に「BAYES_00」「SPF_HELO_PASS」「URIBL_BLOCKED」などのルール名が並んでいました。

BAYES_00は、ベイズフィルターで迷惑メールの可能性が低いと判断された場合のルールです。
SPF_HELO_PASSは、送信側が名乗るHELO/EHLOのドメインについてSPFの検証に成功したことを示します。
URIBL_BLOCKEDは少し紛らわしい名前です。
メール内のURLがブラックリストに載っているという意味ではなく、URLの評判を調べる外部サービスへの問い合わせがブロックされたことを示します。
こうしたルールごとの点数は、設定やルールの更新状況によって異なります。
なぜスパムスコアがマイナスになる?
別のメールでは、スパムスコアが-1.9になっていました。

SpamAssassinにはマイナスの点数が付くルールもあるため、合計スコアが0より小さくなることがあります。
ただし、スコアがマイナスだからといって、そのメールが必ず安全というわけではありません。あくまでSpamAssassinによる判定結果です。
スパムスコアが6.0以上になったらメールは自動削除される?
私の環境では、迷惑メールの判定基準が6.0になっています。
では、スコアが6.0以上のメールは自動的に削除されるのでしょうか。
SpamAssassinで「Yes」と判定されたからといって、必ず削除されるわけではありません。
SpamAssassinはメールを検査して迷惑メールかどうかを判定します。
その結果を使って削除したり、迷惑メール用のフォルダへ振り分けたりする処理は、メールサーバーなどの設定によって変わります。
つまり、迷惑メールと判定されることと、実際にメールが削除されることは別です。
誤判定で必要なメールまで削除してしまう可能性もあるので、自動削除を設定するときには注意が必要です。
まとめ
今回、実際に受信したメールのヘッダーをもとに、SpamAssassinのスパムスコアについて調べてみました。
- X-Spam-Statusでは、判定結果、スパムスコア、判定基準値がわかる。
- X-Spam-Levelのアスタリスクは、基本的にスコアの整数部分に対応する。
- 表示スコアの丸め処理によって、スコア3.0でもアスタリスクが2個になることがある。
- マイナスの点数が付くルールもあるため、合計スコアがマイナスになることがある。
- 迷惑メール判定と、実際の削除・振り分けは別の処理。
特に、スコアが3.0なのにアスタリスクが2個になる理由は、今回調べるまで知りませんでした。
メールヘッダーを見ると、普段は気にしていなかった迷惑メール判定の仕組みがわかってきます。


