2026年5月30日
2026年5月30日
Postfixのヘッダー・本文フィルタを設定する方法
はじめに
WordPressから送信されるメールのFromアドレスやSubjectを変更したい・Postfixで特定のパターンを含むスパムメールをブロックしたい・header_checksとbody_checksの設定方法がわからないといった問題の解決方法を解説します。
症状・原因
header_checksの正規表現の書き方が間違っていてフィルターが動作しないbody_checksでHTMLメールの本文を検索できないpostmapでhash形式に変換し忘れてフィルターが適用されない- フィルターのルールが複雑すぎて正当なメールまでブロックされる
解決手順
ステップ1:header_checks の基本設定
# ✅ /etc/postfix/main.cf にフィルター設定を追加
sudo nano /etc/postfix/main.cf
# ✅ ヘッダーフィルター(受信・送信両方に適用)
header_checks = regexp:/etc/postfix/header_checks
# ✅ 本文フィルター
body_checks = regexp:/etc/postfix/body_checks
# ✅ SMTP クライアントのヘッダーフィルター(送信のみ)
smtp_header_checks = regexp:/etc/postfix/smtp_header_checks
# ✅ ルールファイルの形式
# /pattern/ action optional_message
# pattern: 正規表現(大文字小文字区別なし)
# action: REJECT, WARN, IGNORE, HOLD, DISCARD, PREPEND, REPLACE
# ✅ /etc/postfix/header_checks を作成
sudo nano /etc/postfix/header_checks
# ✅ スパムによく使われるヘッダーをブロック
/^Subject:.*\$\$\$/ REJECT Spam detected in subject
/^Subject:.*(?i)(free money|casino)/ REJECT Spam keyword in subject
# ✅ X-Mailer ヘッダーでスパムクライアントをブロック
/^X-Mailer:.*(?i)(mass mailer)/ REJECT Spam mailer detected
# ✅ Received ヘッダーの偽装を検出
/^Received:.*localhost.localdomain/ WARN Suspicious received header
# ✅ 特定の差出人をブロック
/^From:.*@spam-domain\.com/ REJECT Blocked sender domain
ステップ2:body_checks でメール本文をフィルタリングする
# ✅ /etc/postfix/body_checks を作成
sudo nano /etc/postfix/body_checks
# ✅ フィッシングサイトのURLパターンをブロック
/(?i)click here.*http:\/\/[0-9]{1,3}\.[0-9]+/ REJECT Suspicious URL pattern
# ✅ 特定のキーワードをブロック
/(?i)(enlarge|replica watches|cheap viagra)/ REJECT Spam keyword in body
# ✅ 大量の記号(スパム特有のパターン)
/\*{10,}/ REJECT Too many asterisks
# ✅ HTML インジェクションを検出
/<script.*>/ REJECT Script tag in body
ステップ3:PCRE 形式でより高度なフィルタリング
# ✅ PCRE(Perl互換正規表現)を使う(より強力)
# main.cf を変更
# header_checks = pcre:/etc/postfix/header_checks.pcre
sudo nano /etc/postfix/header_checks.pcre
# ✅ PCRE フォーマット(/パターン/フラグ アクション)
# フラグ: i=大文字小文字無視, x=コメント許可
# ✅ Base64 エンコードされた怪しいコンテンツ
/^Subject:\s*=\?UTF-8\?B\?/i WARN Encoded subject
# ✅ WordPress 通知メールのFromを書き換え
/^From:\s*WordPress <wordpress@localhost>/
REPLACE From: WordPress <noreply@example.com>
# ✅ 特定のSubjectパターンを置換
/^Subject:\s*\[WordPress\] /
REPLACE Subject: [My Site] $1
# ✅ PCRE をインストール(必要な場合)
sudo apt install postfix-pcre -y
# ✅ PCRE フィルターを有効化
sudo postconf -e "header_checks = pcre:/etc/postfix/header_checks.pcre"
ステップ4:フィルター設定を反映・テストする
# ✅ regexp 形式は postmap 不要
# pcre 形式も postmap 不要
# hash 形式の場合のみ postmap が必要
# sudo postmap /etc/postfix/header_checks ← hash形式の場合
# ✅ Postfix を再読込
sudo postfix reload
# ✅ フィルターが機能しているか確認
# テストメールを送信してログを確認
echo "Test with spam keyword" | mail -s "FREE MONEY click here" test@example.com
sudo tail -f /var/log/mail.log | grep -E "header_checks|body_checks|REJECT|WARN"
# → NOQUEUE: reject: MAIL from ...: 550 5.7.1 Spam keyword in subject
# ✅ フィルタールールをテスト(postfixのチェックコマンド)
sudo postfix check
# → 設定ファイルのエラーを検出
# ✅ ヘッダーチェックのデバッグ
sudo postconf -d header_checks
# → 現在のheader_checks設定を表示
ステップ5:WordPress のメール送信を制御する
# ✅ WordPress から送信されるメールのFromを書き換える
# /etc/postfix/sender_canonical を作成
sudo tee /etc/postfix/sender_canonical << 'EOF'
# ✅ wordpress@localhost → noreply@example.com に書き換え
/^wordpress@localhost$/ noreply@example.com
/^www-data@.*/ noreply@example.com
EOF
# ✅ main.cf に設定を追加
sudo postconf -e "sender_canonical_maps = pcre:/etc/postfix/sender_canonical"
sudo postfix reload
# ✅ WordPress のメールフッターを追加する header_checks
sudo tee -a /etc/postfix/header_checks << 'EOF'
# ✅ WordPress からのメールにX-ヘッダーを追加
/^From:.*noreply@example\.com/ PREPEND X-Sent-By: WordPress on example.com
EOF
# ✅ 設定のテスト
wp eval "wp_mail('test@example.com', 'Filter Test', 'Testing header filter');" \
--path=/var/www/html/
sudo tail -5 /var/log/mail.log
# → from=<noreply@example.com> → 書き換え成功
注意事項
header_checksとbody_checksのルールは上から順に評価され、最初にマッチしたルールが適用されます。REJECTルールは慎重に設定してください。正当なメールまでブロックするとビジネスに影響が出ます- 本番環境では最初に
WARNアクションで検証してからログで確認し、問題がなければREJECTに変更するアプローチを推奨します
まとめ
Postfixのヘッダー・本文フィルタは①main.cfにheader_checks = regexp:/etc/postfix/header_checksとbody_checks = regexp:/etc/postfix/body_checksを設定、②header_checksにスパムの件名・差出人・X-Mailerをブロックするregexpパターンを記述・REJECT/WARN/IGNORE/REPLACEアクションを使い分け、③body_checksでURLパターン・スパムキーワード・HTMLスクリプトタグをフィルタリング・postfix-pcreで高度なPCRE正規表現を使用、④postfix reloadで設定反映・テストメール送信・/var/log/mail.logでREJECT/WARNを確認、⑤sender_canonical_mapsでWordPressのwordpress@localhostをnoreply@example.comに書き換え・PREPENDでカスタムヘッダーを追加の手順で設定します。