2026年6月2日

2026年6月2日

SpamAssassinのインストールと設定方法(Postfix連携・迷惑メールの振り分け・学習)

SpamAssassinを自分のメールサーバーに入れると、届いたメールに点数を付け、しきい値を超えたものに迷惑メールの印(ヘッダー)を付けられます。この記事では、Ubuntu/Debianで動いているPostfix+Dovecotのサーバーを前提に、SpamAssassinのインストール、local.cf の基本設定、Postfixとの連携、迷惑メールフォルダーへの自動振り分け、学習機能の使い方、動作確認までを説明します。受信側の迷惑メール対策の話で、送ったメールが相手に迷惑メール扱いされる問題(送信ドメイン認証など)とは別の作業です。

SpamAssassinの仕組みと、先に決めておくこと

SpamAssassinは、ヘッダーの不自然さ、本文の特徴、DNSブロックリスト(DNSBL)への登録状況、ベイズ学習の結果など、多数のルールでメールを採点します。合計点が required_score(既定は5.0)以上になると迷惑メールと判定し、X-Spam-Flag: YES などのヘッダーを付けます。

ここで大切なのは、SpamAssassinは「判定して印を付ける」までが役割で、メールを捨てる処理は別に組み立てるという点です。誤判定は避けられないため、最初は削除や受信拒否をせず、迷惑メールフォルダーに振り分けるだけにしておき、数週間ほど判定の様子を見てから厳しくするのが安全です。

Postfixとのつなぎ方は主に3通りあります。

  • content_filter(spamcをパイプで呼ぶ): 受け付けたメールを一度SpamAssassinに通してから配送し直す方法。設定が少なく、この記事で扱います。
  • milter(spamass-milterなど): 受信中に判定するため、高得点のメールをSMTPの段階で拒否することもできます。
  • Amavis経由: ClamAVなどのウイルス検査とまとめて扱う構成。設定は多くなります。

また、新しく構築する場合はRspamdという選択肢もあります。採点・DKIM署名・学習などを1つで扱え、処理も軽量です。既存の構成やなじみのある道具に合わせて選んでください。

インストール

sudo apt update
sudo apt install spamassassin spamc
spamassassin --version

最近のDebian/Ubuntuでは、常駐プロセスの spamd が別パッケージに分かれ、サービス名も spamd になっています。古い版では spamassassin という名前のサービスで、/etc/default/spamassassin の ENABLED=1 で有効にする方式でした。どちらの方式かは、次のコマンドで確かめます(2026年10月現在、SpamAssassinは4.0系が使われています)。

systemctl list-unit-files | grep -iE 'spamd|spamassassin'
sudo apt install spamd   # spamd が見つからない場合
sudo systemctl enable --now spamd

ルールは sa-update で更新します。パッケージによっては毎日の自動更新(cronまたはsystemdのタイマー)が用意されています。systemctl list-timers | grep -i spam や /etc/cron.daily/ を見て、更新の仕組みが動いているかを確認し、なければ一度手で実行します。

sudo sa-update && sudo systemctl restart spamd

local.cf の基本設定

全体の設定は /etc/spamassassin/local.cf に書きます。編集前にコピーを取っておきます。

required_score      5.0
rewrite_header      Subject [SPAM]
report_safe         0

use_bayes           1
bayes_auto_learn    1

trusted_networks    127.0.0.1
  • rewrite_header Subject [SPAM] は、迷惑メールと判定したメールの件名の先頭に [SPAM] を付けます。フォルダーへの振り分けをヘッダーで行う場合は、件名を変えない運用にしても構いません。
  • report_safe 0 は、元のメールをそのまま残してヘッダーだけを追加する指定です。1 や 2 にすると、元のメールを添付ファイルにした説明付きのメールに包み直すため、利用者には扱いにくくなります。
  • trusted_networks には、自分が管理していて信頼できる中継サーバーのアドレスを書きます。手前に別の中継サーバーがある構成で設定を誤ると、送信元の判定がずれ、DNSBLの照合が正しく効かなくなります。

設定を変えたら、文法を確かめてから再起動します。

sudo spamassassin --lint
sudo systemctl restart spamd

--lint で何も表示されなければ問題ありません。エラーが出た場合は spamassassin -D --lint で詳しいログを見ると、どの行が原因かが分かります。

Postfixと連携する(content_filter)

/etc/postfix/master.cf で、外部からメールを受ける smtp の行に content_filter を追加し、その下に呼び出し先の定義を加えます。-o で始まる行と user= の行は、行頭に空白を入れて前の行の続きにします。

smtp      inet  n       -       y       -       -       smtpd
  -o content_filter=spamassassin

spamassassin unix -     n       n       -       -       pipe
  user=debian-spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}

この設定では、25番ポートで受け付けたメールを spamc に渡し、spamd が採点してヘッダーを付けたメールを sendmail コマンドで配送に戻します。戻したメールは smtpd を通らずに投入されるため、もう一度フィルターにかかってループすることはありません。

content_filter を smtp の行だけに付けているのは、利用者が587番から送るメールまで採点する必要がないためです。user=debian-spamd はDebian系のパッケージが作る専用ユーザーです。別のディストリビューションでは名前が違うことがあるため、getent passwd | grep -i spam で確かめます。

sudo postfix check
sudo systemctl reload postfix

迷惑メールフォルダーに振り分ける

判定済みのメールを迷惑メールフォルダーに入れるには、DovecotのSieve(Pigeonhole)を使います。配送をDovecotのLMTPかLDAで行っている必要があります。

sudo apt install dovecot-sieve

全員に共通のルールとして、次のようなスクリプトを置きます。

# /etc/dovecot/sieve/spam.sieve
require ["fileinto", "mailbox"];
if header :contains "X-Spam-Flag" "YES" {
  fileinto :create "Junk";
  stop;
}

Dovecotの設定で、このスクリプトを各利用者のルールより前に実行するよう指定し(sieve_before など)、sievec でコンパイルします。Dovecotは2.3系と2.4系でSieveの設定の書き方が変わっているため、インストールされている版の公式ドキュメントに従ってください。迷惑メールフォルダーの名前(Junk など)は、利用者のメールアプリが迷惑メール用として認識する名前に合わせます。

学習機能(ベイズ)を育てる

ベイズ学習は、そのサーバーに届く迷惑メールと通常のメールの傾向を覚えて採点に反映する機能です。既定では、迷惑メールと通常のメールをそれぞれ200通以上学習するまでは採点に使われません。

# 迷惑メールとして学習(Maildir の Junk フォルダーの例)
sudo -u debian-spamd sa-learn --spam /home/taro/Maildir/.Junk/cur/
# 通常のメールとして学習
sudo -u debian-spamd sa-learn --ham /home/taro/Maildir/cur/
# 学習の状況を確認
sudo -u debian-spamd sa-learn --dump magic

sa-learn は spamd と同じユーザーで実行し、同じ学習データを使うようにします。別のユーザーで実行すると、そのユーザーのホームディレクトリに別の学習データができてしまい、spamd の採点に反映されません。

誤った学習は精度を下げます。迷惑メールフォルダーに入っていても実際には必要なメールが混じっていることがあるため、学習させる前に中身を確認するか、利用者が手で迷惑メールフォルダーに移したものだけを学習させる運用にします。

動作確認

GTUBEという、SpamAssassinが迷惑メールと判定するように作られたテスト用の文字列があります。まずサーバー内で採点だけを試します。

cat > /tmp/gtube.eml <<'EOF'
Subject: GTUBE test
From: test@example.org
To: taro@example.com

XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
EOF
spamc -R < /tmp/gtube.eml

spamc -R は採点結果の内訳を表示します。高い点数と GTUBE のルール名が出れば、spamd は動いています。

次に、外部のアドレスから同じ文字列を本文に入れたメールを自分宛に送り、届いたメールのヘッダーに X-Spam-Flag: YES と X-Spam-Status: Yes, score=... が付き、迷惑メールフォルダーに入るかを確認します。通常のメールには X-Spam-Status: No, score=... が付きます。ヘッダーが付かない場合は、/var/log/mail.log で spamassassin へのパイプが呼ばれているか、journalctl -u spamd に処理の記録があるかを見ます。

つまずきやすい点

  • DNSBLが効かない: Spamhausなどのブロックリストは、Google Public DNSのような公共のDNSリゾルバー経由の問い合わせを拒否することがあります。その場合、照合結果が正しく得られず、ルールが効きません。サーバー内にUnboundなどのキャッシュDNSを立てて、そこを使うのが一般的です。利用条件は各ブロックリストの規約で確認してください。
  • 大きなメールが採点されない: spamc は既定で一定サイズを超えるメールを採点せずに通します。迷惑メールの多くは小さいため通常は問題になりませんが、上限は spamc の -s オプションで変えられます。
  • 正規のメールが迷惑メールになる: 特定の取引先が誤判定される場合は、許可リストを安易に足すより、まず X-Spam-Status に出ているルール名を見て、何が点数を押し上げているかを確認します。Fromは詐称できるため、許可リストを使うなら、送信元アドレスだけで許可する welcomelist_from より、SPFやDKIMの認証に成功したときだけ許可する welcomelist_auth のほうが安全です。これらはSpamAssassin 4.0で導入された名前で、それ以前の whitelist_from・whitelist_auth も互換のために使えます。

まとめ

  • SpamAssassinは採点して印を付けるまでが役割で、削除や拒否は判定の様子を見てから別に組み立てます。
  • Debian/Ubuntuの新しい版では、常駐プロセスは spamd パッケージ・spamd サービスです。ルールは sa-update で更新します。
  • Postfixの smtp の行に content_filter を付け、spamc 経由で採点して配送に戻します。
  • 振り分けはDovecotのSieveで X-Spam-Flag を見て行います。
  • ベイズ学習は spamd と同じユーザーで実行し、学習させるメールの中身を確認してから使います。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲