DMARC+Postfix週次自動レポートをWordPressに自動投稿する:完成版(v1.6.3)

Postfix-log

Postfix 拒否ログDMARC集計を統合し、WordPress記事として自動投稿する仕組みがついに完成しました。

カテゴリ・タグ・アイキャッチまで全自動。
さらに「過去7日間にDMARC失敗送信元がなかった場合」は「データなし」と出力し、空白記事を防止します。


1. はじめに

PostfixやDMARCのログは、メール運用の健康診断に欠かせない情報です。 しかし「見る人」が限られてしまう。 これをWordPressに自動投稿できれば、運用履歴が可視化され、 SEO・監査・チーム共有にも役立ちます。


2. 全体構成(アーキテクチャ)

  • Postfix → MariaDB(postfix_rejects
  • DMARCレポート(IMAP→XML→MariaDB reports
  • WordPress MUプラグイン(postfix-log-report.php
  • 週次cronでWP-CLI実行 → 記事自動投稿

構成図イメージ:

Postfix ─▶ MariaDB(拒否・DMARC集計) │ ▼ MUプラグイン ─▶ WordPress投稿(カテゴリ/タグ/アイキャッチ付) ▲ │ cron(週次)

3. MUプラグイン v1.6.3 の特徴

  • タグ100%反映(2段階処理+UIキャッシュ更新)
  • 本文ハッシュで重複投稿防止
  • アイキャッチ自動登録postfix-reject-ogp.png
  • Postfix+DMARC実データ表示(7日間集計)
  • データが無い週は「過去7日間に失敗なし」メッセージを表示

4. 実データ生成部分(Postfix/DMARC)

Postfix 拒否ログ(過去7日間)

SELECT reason, COUNT(*) AS cnt
FROM postfix_rejects
WHERE log_time >= DATE_SUB(NOW(), INTERVAL 7 DAY)
GROUP BY reason
ORDER BY cnt DESC
LIMIT 10;

DMARC 失敗送信元(過去7日間)

SELECT source_ip, COUNT(*) AS cnt
FROM reports
WHERE (dkim_passed=0 OR spf_passed=0) AND end_date >= DATE_SUB(NOW(), INTERVAL 7 DAY)
GROUP BY source_ip
ORDER BY cnt DESC
LIMIT 10;

7日以内に失敗がなければ次の文が自動で出力されます:

<p><em>過去7日間にDMARC失敗送信元はありませんでした。</em></p>

5. WordPressとの連携

  • カテゴリ:「Postfix」(自動作成される)
  • タグ:「Postfix」「DMARC」「ログ集計」
  • 投稿者:「masaやん」
  • アイキャッチ:postfix-reject-ogp.png
  • DB接続:dmarc_reports(Postfix/DMARC用)+ WordPress本体DB

6. 週次cron設定(自動実行)

sudo crontab -u apache -e # 毎週月曜 7時に実行(週次レポート)
0 7 * * MON /usr/local/bin/wp-a --path=/var/www/html/wpm postfix-log report \
--tags="Postfix,DMARC,ログ集計" >> /var/log/wp-postfix-report.log 2>&1

成功時ログ例:

[postfix-log-report v1.6.3] [DONE] created post_id=1311
Success: Created post_id=1311 hash=d273f6f5c03f60cc...

7. トラブルシュート(実録)

✅ タグが反映されない

最初の壁でした。プラグインのタグ処理を何度呼び出しても、 WordPress管理画面では「タグなし」と表示。 原因は意外なところにありました。

8. PHP-FPMプール分離環境の罠:タグが入らない理由

現象

投稿自体は成功(post_id発行済)。 しかし wp_term_relationships にタグが登録されない。

原因

  • WordPress本体のDBと、DMARC用DBを分けていた。
  • さらにPHP-FPMのプールを wp-admin / wp-frontend / dmarc に分割。
  • 結果:タグ追加処理が「DMARC側DB」に対して実行」されていた!

対策

  1. $mysqliでDMARC用DBを使う処理の後は必ず $mysqli->close()
  2. タグ登録はWordPress本体の $wpdb を明示的に利用。
  3. wp_update_post()do_action('save_post') を呼び出し、キャッシュを更新。

結果、タグは完全に反映。 検証用 term-test.php の試行で全パターン比較したところ、 この方法以外はどれも「見かけだけ成功・実際は反映なし」でした。

教訓

「PHP-FPMプール分離 × MUプラグイン × 外部DB」構成では、 接続順序とクローズの管理が命。

PostfixやDMARCなど、別DBを読む場合は常に 「今この瞬間どのDBに接続しているか」を意識することが大切です。


9. カテゴリ・タグ・SEO設計

  • カテゴリ:Postfix
  • タグ:Postfix, DMARC, ログ集計
  • パーマリンク例:/2025/10/postfix-dmarc-weekly-report-1.6/
  • OGP画像:青背景+「Postfix × DMARC Weekly Report」

10. おわりに

これで完全自動投稿が実現しました。 Postfixの拒否率やDMARC整合率が、毎週自動でWordPress上に記録される。 しかも「失敗ゼロの週」も確実にログとして残せる。

この仕組みをベースに、今後は次の拡張を予定しています:

  • --range=14--range=30 など期間指定
  • --force オプションによる再投稿
  • 複数ドメイン選択(hd0.biz / senkeien.net)切替スイッチ

更新履歴

  • v1.5.x:タグ反映調整(2段階処理)
  • v1.6.0:実データ+アイキャッチ自動登録
  • v1.6.1:postfix_rejects対応
  • v1.6.3:DMARC7日間で0件時に「データなし」表示

Author:masaやん

コメント