新規注文の通知メールが管理者の Gmail の受信トレイに届いていませんでした。迷惑メールに入るのではなく、まったく届かないのです。困ったことに、WordPress 自身の wp_mail() 関数は毎回成功を返していたため、メール関数の呼び出しミス、プラグインの競合、サーバー障害といったよくある原因は除外されました。
「送信した」は「届いた」ではない理由
wp_mail() が true を返すのは、メッセージがサーバーのローカルなメール配送システムに正常に渡されたことを確認しているだけです。その後に何が起きるか、つまり受信側のメールサーバー(今回は Gmail)が実際に受け取ったのか、黙って破棄したのかについては何もわかりません。
本当の問題を隠していたヘッダー
本当の原因はメールのヘッダーにありました。WooCommerce に設定された送信元(From)アドレスは @gmail.com のメールだったのに、メッセージ自体は Google ではなく、ホスティングサーバー自身のメール配送システムから送られていました。Gmail の SPF(Sender Policy Framework)レコードは、@gmail.com のアドレスを名乗るメールの送信を Google 自身のインフラにしか許可していません。Gmail を名乗りながら無関係なサーバーから送られたメールはこのチェックに即座に失敗し、Gmail の迷惑メール対策は、自社のアドレスを装って SPF に失敗したメールを強いなりすましのサインとして扱います。受信者も Gmail アドレスの場合は特にそうです。
その結果、メッセージはどの受信トレイにも届くずっと前に黙って破棄されるか迷惑メールとして除外されており、だからこそ迷惑メールフォルダにすら現れなかったのです。
1 行で済んだ解決策
ストア自身のドメインには、ホスティング会社のメールサーバーを許可する有効な SPF レコードがすでにありました。ただ、送信元アドレスが Gmail を指していたため使われていなかっただけです。WooCommerce のメールの送信元アドレスを、送信サーバーが実際に許可されているドメイン(orders@[storedomain].com)に変えると、すぐに解決しました。テスト注文のメールは 1 分以内に受信トレイに届き、新しいプラグインも、SMTP リレーも、DNS の変更も必要ありませんでした。
ポイントのまとめ
- 「関数が成功を返した」と「メールが配信された」は別のことです。メールの到達性を調べるには、送信処理だけでなく認証を確認する必要があります。
- Google のサーバーから送られていないメールに Gmail アドレスを送信元として使うのは、SPF に失敗して黙って除外されるほぼ確実な方法です。
- 新しい SMTP プラグインに手を出す前に、ドメインの既存の SPF レコードを確認しましょう。許可はすでにあって、単に使われていないだけのことがよくあります。
関連記事:Web サイト保守で実際に行うこと、キャッシュの TTL が原因の断続的な 403 エラー。
ご自身の WooCommerce や WordPress の管理画面で同じような制約にお困りですか?ご相談ください。ArtinTech Solution はまさにこうしたストア向けのカスタムツールを開発しています。