手当たり次第に書くんだ

飽きっぽいのは本能

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

コンテナ上で動かしている WordPress から通知メールが届かない場合、原因は WordPress 本体だけにあるとは限りません。WordPress の wp_mail()、PHP の mail()、sendmail 互換コマンド、Postfix、SMTP リレー、DNS、迷惑メール判定がそれぞれ関係します。

この記事では、コンテナ上の WordPress からメールが送信できない場合に、どの層をどの順序で確認するかを整理します。Kubernetes で運用している場合は、Pod 内に MTA を入れるべきか、外部 SMTP リレーへ逃がすべきかという設計判断も重要になります。

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

WordPress のメール送信は、多くの場合 wp_mail() から始まります。ただし wp_mail() はメール配送そのものを完結させる仕組みではありません。標準では PHP のメール送信機能に渡し、そこから sendmail 互換コマンドや MTA に処理が流れます。

役割よくある問題
WordPresswp_mail() で通知メールを生成する送信元、宛先、プラグイン設定が不適切
PHPmail() や sendmail パスへ渡すsendmail_path がない、PHP 設定が合わない
コンテナsendmail 互換コマンドや MTA を提供するコンテナ内に MTA が存在しない
Postfix / SMTP外部または内部へ配送するrelayhost、認証、TLS、配送制限が合わない
DNS / 受信側SPF、DKIM、DMARC、逆引きなどで評価する送れても迷惑メール扱い、または拒否される

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

最初に、WordPress からメール送信関数が呼べるかを確認します。WP-CLI が使える環境であれば、次のように wp_mail() を直接呼び出して確認できます。宛先は検証用のアドレスに変更します。

wp eval 'var_dump(wp_mail("test@example.com", "WordPress mail test", "mail test"));'

ここで true が返っても、メールが実際に届くとは限りません。WordPress から PHP へ渡せたことと、最終的に配送されたことは別です。逆に false の場合は、WordPress 側または PHP 側の段階で失敗しています。

PHP の sendmail 設定を確認する

コンテナ内で PHP がどの sendmail パスを使う設定になっているか確認します。WordPress コンテナに sendmail 互換コマンドが存在しない場合、標準のメール送信は失敗します。

php -i | grep -i sendmail
which sendmail || true
ls -l /usr/sbin/sendmail /usr/lib/sendmail 2>/dev/null || true

WordPress の公式系コンテナや PHP アプリケーションコンテナでは、メール送信専用の MTA が入っていないことがあります。これは異常というより、コンテナではアプリケーションとメール配送を分離する設計が一般的だからです。

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

単純に考えると、WordPress コンテナ内に Postfix を入れれば送れそうに見えます。しかし、サーバー管理としてはあまりきれいな構成ではありません。アプリケーションコンテナに MTA を同居させると、ログ、キュー、再送、証明書、配送制御、監視の責務が混ざります。

方式利点注意点
WordPress コンテナ内に MTA を入れる構成が一見単純に見えるアプリと配送責務が混ざり、運用しにくい
別 Pod / 別サーバーの SMTP リレーを使う責務分離しやすいSMTP 認証、TLS、接続制御の設計が必要
外部メールサービスを使う到達性や認証を任せやすいサービス依存、費用、API/SMTP 制限がある

Kubernetes で運用しているなら、WordPress Pod は CMS として動かし、メール配送は SMTP リレーや外部メールサービスへ分離する方が自然です。

SMTP プラグインを使う場合

WordPress では SMTP プラグインを使って、PHP の mail() ではなく SMTP 経由で送信する構成もあります。この場合、確認すべき項目は sendmail パスではなく、SMTP ホスト、ポート、TLS、認証情報、送信元アドレスになります。

  • SMTP ホスト名をコンテナから名前解決できるか
  • SMTP ポートへ接続できるか
  • TLS 設定が SMTP サーバー側と一致しているか
  • 認証ユーザーとパスワードが正しいか
  • 送信元アドレスが許可されているか
  • 送信先で SPF、DKIM、DMARC により拒否されていないか
getent hosts smtp.example.com
nc -vz smtp.example.com 587

Postfix リレー側で見ること

Postfix を SMTP リレーとして使う場合、WordPress 側だけでなく Postfix 側のログを確認します。メールがリレーに届いていないのか、リレーには届いたが配送に失敗しているのかで対処が変わります。

postqueue -p
journalctl -u postfix --no-pager -n 100

リレーに届いているのに外部へ配送できない場合は、relayhost、送信元ドメイン、DNS、TLS、外部メールサーバーの拒否理由を確認します。

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

メールは送信処理が成功しても、受信側に届くとは限りません。特に外部宛てメールでは、SPF、DKIM、DMARC、逆引き DNS、送信元 IP の評判が関係します。WordPress の通知メールであっても、最終的にはメール基盤の設計問題になります。

コンテナからメールを直接外部へ送る構成は、送信元 IP、HELO 名、逆引き、SPF などを整えにくいことがあります。その意味でも、メール配送はきちんと管理された SMTP リレーに集約した方が安定しやすいです。

切り分けの順序

  • WordPress の wp_mail() が成功するか確認する
  • PHP の sendmail_path と sendmail 互換コマンドの有無を確認する
  • SMTP プラグインを使う場合は、SMTP 接続と認証を確認する
  • Postfix リレーを使う場合は、リレー側のログとキューを確認する
  • 外部配送では SPF、DKIM、DMARC、逆引き DNS を確認する
  • Kubernetes では Pod 内 MTA ではなく SMTP リレーへの責務分離を検討する

まとめ

コンテナ上の WordPress からメールが来ない場合、WordPress の設定だけを見ても解決しないことがあります。wp_mail()、PHP、sendmail 互換コマンド、Postfix、SMTP リレー、DNS、受信側の評価を順番に切り分ける必要があります。

Kubernetes や Docker で運用する場合、WordPress コンテナに MTA を同居させるより、SMTP リレーや外部メールサービスへ分離する方が管理しやすいです。メール配送はアプリケーションの付属機能ではなく、独立した運用基盤として扱う方が安定します。

参考
書籍
参考書籍

Postfix詳解 MTAの理解とメールサーバの構築・運用

Postfix を中心にメールサーバーの構築と運用を確認したい場合の参考書籍です。Dovecot と組み合わせたメール基盤を理解する補助として使えます。価格や在庫はリンク先で確認してください。

Amazon で見る

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

関連記事

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

コメントを残す

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

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

トップへ戻る