手当たり次第に書くんだ

飽きっぽいのは本能

コンテナ上の WordPress からメールが送信できない原因 – SMTP / sendmail / Postfix を切り分ける

コンテナ上の WordPress からメールが送信できない場合、原因は WordPress 本体だけではありません。PHP の mail()、sendmail コマンド、SMTP プラグイン、Postfix リレー、DNS、Firewall、迷惑メール対策のどこで止まっているかを分けて確認する必要があります。

この記事では、WordPress をコンテナや Kubernetes 上で運用している前提で、メール送信経路を切り分ける考え方を確認します。ここでは「送信できない」問題を扱い、配送が遅い問題は別記事の範囲とします。

WordPress のメール送信経路を分解する

WordPress のメール送信は、見かけ上は管理画面やプラグインから送っているだけに見えます。しかし実際には、いくつかの経路があります。

方式使われるもの確認すること
PHP mailmail() と sendmail 互換コマンドコンテナ内に送信コマンドがあるか
SMTP プラグインWordPress プラグインから外部 SMTP へ接続SMTP ホスト、認証、TLS、Firewall
Postfix リレーコンテナ外の Postfix やメールリレーリレー許可、ログ、配送先への到達性
外部メールサービスSES、SendGrid、Gmail など認証方式、送信元ドメイン、SPF / DKIM / DMARC

まず、自分の WordPress がどの方式でメールを送る設計なのかを決める必要があります。コンテナ内に Postfix を入れるのか、外部 SMTP に寄せるのか、Node や別サーバーの Postfix にリレーするのかで、見る場所が変わります。

まず WordPress から送信テストする

最初に、WordPress から実際にメール送信テストを行います。問い合わせフォーム、パスワードリセット、SMTP プラグインのテスト送信など、WordPress が使う経路で確認します。

  • 管理画面上でエラーが出るか
  • WordPress のデバッグログにエラーが出るか
  • SMTP プラグインのログに接続エラーや認証エラーが出るか
  • リレー先の Postfix にログが残るか
  • 相手先に届かないだけなのか、そもそも送信処理が始まっていないのか

この段階で重要なのは、WordPress 側で失敗しているのか、WordPress から外へ出た後に失敗しているのかを分けることです。

PHP の sendmail 設定を確認する

PHP の mail() を使う場合、PHP から呼び出される sendmail 互換コマンドが必要です。コンテナイメージによっては、sendmail コマンドも Postfix も入っていないことがあります。

コマンド

php -i | grep -i sendmail_path
which sendmail
ls -l /usr/sbin/sendmail /usr/lib/sendmail

sendmail_path が未設定、または指定先のコマンドが存在しない場合、PHP の mail() は期待通りに動きません。WordPress 側の問題というより、コンテナイメージ内のメール送信機能が不足している状態です。

コンテナ内に Postfix を入れるべきか

コンテナ内に Postfix を入れる構成は可能ですが、基本的には慎重に考えた方がよいです。Web アプリケーションのコンテナに MTA を同居させると、ログ、キュー、配送再試行、設定、監視、永続化の責務が混ざります。

構成利点注意点
コンテナ内 PostfixPHP mail との互換性を作りやすいMTA 運用責務がコンテナ内に入り、管理が重くなる
外部 SMTPWordPress から直接 SMTP で送れる認証情報、TLS、Firewall、プラグイン設定が必要
Postfix リレーメール配送を専用サーバーに寄せられるリレー許可、送信元制御、ログ確認が必要

Kubernetes 上では、WordPress コンテナに Postfix を入れるより、SMTP プラグインで外部 SMTP を使うか、内部の Postfix リレーに送る構成の方が運用しやすいことが多いです。

SMTP プラグインを使う場合

SMTP プラグインを使う場合は、WordPress から SMTP サーバーへ直接接続します。ここでは、WordPress の設定だけでなく、コンテナから SMTP サーバーへ TCP 接続できるかを確認します。

コマンド

getent hosts smtp.example.com
nc -vz smtp.example.com 587
openssl s_client -starttls smtp -connect smtp.example.com:587 -servername smtp.example.com </dev/null

587 番ポートを使う場合は Submission、465 番ポートを使う場合は SMTPS です。認証方式、TLS の方式、サーバー証明書、Firewall の許可を合わせて確認します。

Postfix リレー側で見ること

Postfix リレーを使う場合、WordPress 側からリレーへ届いているかをログで確認します。WordPress 側のテスト送信が成功しているように見えても、リレー側で拒否されている、キューに残っている、外部配送で失敗している場合があります。

コマンド

postqueue -p
journalctl -u postfix --since "10 minutes ago"
grep -i postfix /var/log/mail.log

リレー側では、送信元 IP が許可されているか、mynetworks や認証設定が意図通りか、宛先ドメインへの配送でエラーが出ていないかを見ます。Kubernetes から出た通信が Node の IP に SNAT される場合は、リレー側で見える送信元 IP も確認します。

DNS と迷惑メール判定も到達性に関係する

メール送信では、SMTP 接続が成功しても、相手に届くとは限りません。送信元ドメインの DNS 設定や迷惑メール判定も関係します。

  • 送信元ドメインの SPF が正しいか
  • DKIM 署名が必要な構成になっていないか
  • DMARC の方針と送信経路が矛盾していないか
  • 逆引き DNS と HELO / EHLO 名が不自然ではないか
  • 送信元 IP のレピュテーションに問題がないか

ただし、この記事で扱う主題は「送信できない」問題です。DNS や迷惑メール判定は到達性に関係しますが、まずは WordPress から SMTP リレーまで届いているかを先に確認します。

切り分けの順序

メール送信の切り分けは、内側から外側へ順番に見ると見通しやすくなります。

順序確認点見る場所
1WordPress の送信処理が実行されるか管理画面、プラグインログ、WordPress ログ
2PHP mail / sendmail が使えるかWordPress コンテナ
3SMTP サーバーへ TCP 接続できるかWordPress コンテナ、Kubernetes NetworkPolicy
4SMTP 認証と TLS が成功するかSMTP プラグイン、SMTP サーバー
5Postfix リレーで受け取っているかPostfix ログ、メールキュー
6外部配送と DNS 設定に問題がないかSPF / DKIM / DMARC、逆引き DNS

この順序で見れば、WordPress の問題、コンテナの問題、SMTP 接続の問題、Postfix リレーの問題、外部配送の問題を分けやすくなります。

参考書籍

参考
書籍
参考書籍
Postfix 実用ガイド

Postfix の配送経路、リレー、ログ確認、メールサーバー運用を深く確認したい場合の参考書籍です。

Amazon で見る

このリンクは Amazon アソシエイトリンクです。

関連記事

まとめ

コンテナ上の WordPress からメールが送信できない場合、WordPress だけを見ても原因は分かりません。PHP の sendmail 設定、SMTP プラグイン、Postfix リレー、DNS、Firewall、迷惑メール対策を分けて確認する必要があります。

特に Kubernetes 上では、WordPress コンテナに MTA を同居させるより、SMTP プラグインや専用の Postfix リレーに責務を分ける方が管理しやすいことが多いです。

まずは WordPress から送信処理が始まっているか、次にコンテナから SMTP サーバーへ接続できるか、最後に Postfix リレーと外部配送を確認する。この順序で見ると、メール送信できない原因を切り分けやすくなります。

参考書籍
参考書籍

Kubernetes完全ガイド 第2版

コンテナ、Kubernetes、クラスタ運用を体系的に確認したい場合の参考書籍です。WordPress をコンテナ基盤で運用する時の周辺理解にも役立ちます。価格や在庫はリンク先で確認してください。

Amazon で見る

このリンクは Amazon アソシエイトリンクです。

関連する記事
コンテナ上の WordPress からメールが送信できない原因 – SMTP / sendmail / Postfix を切り分ける

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る