2026年5月30日

2026年5月30日

Postfixのヘッダー・本文フィルタを設定する方法

はじめに

WordPressから送信されるメールのFromアドレスやSubjectを変更したい・Postfixで特定のパターンを含むスパムメールをブロックしたい・header_checksbody_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_checksbody_checksのルールは上から順に評価され、最初にマッチしたルールが適用されます。REJECTルールは慎重に設定してください。正当なメールまでブロックするとビジネスに影響が出ます
  • 本番環境では最初にWARNアクションで検証してからログで確認し、問題がなければREJECTに変更するアプローチを推奨します

まとめ

Postfixのヘッダー・本文フィルタは①main.cfheader_checks = regexp:/etc/postfix/header_checksbody_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@localhostnoreply@example.comに書き換え・PREPENDでカスタムヘッダーを追加の手順で設定します。

お気軽にご相談ください

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