コンテナ上で動かしている 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 に処理が流れます。
| 層 | 役割 | よくある問題 |
|---|---|---|
| WordPress | wp_mail() で通知メールを生成する | 送信元、宛先、プラグイン設定が不適切 |
| PHP | mail() や 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 || trueWordPress の公式系コンテナや 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 587Postfix リレー側で見ること
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 のメール送信が遅い原因 – sendmail、Postfix、名前解決を切り分ける
- Ubuntu 22.04 WordPress – Apache / PHP / MariaDB で CMS を構築する
- WordPress の予約投稿が 9 時間ずれる原因 – Docker / Kubernetes 環境のタイムゾーンを確認する
- Ubuntu 22.04 Postfix ローカル MTA – サーバー通知メールの最小構成
- Ubuntu 22.04 Postfix 内部向けメールサーバー – relayhost と配送設計



