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と同じユーザーで実行し、学習させるメールの中身を確認してから使います。