先日、Online Lesson Booking (OLB) プラグインについて、「予約申し込みを行なった際、予約通知メールが届かないようだ」とのご相談がありました。
調査の結果、ご相談者のサーバーにおいては、wp_mail() の第1引数("to":宛先)に渡すアドレスが "User <user@example.com>" 形式だと送信されない(falseを返す)ことがわかり、対処方法を考えることにしました。

 

確認環境

サーバー お名前.com 共用サーバーSD
WordPress 3.9.2
テーマ Twenty Twelve 1.4
プラグイン OLBsystem 0.6.3
WP Multibyte Patch 2.0

 

症状

具体的には、こういうことが起きています。

メールが送信されるケース
宛先(to)が "user@example.com" だけなら送信されます。

 

メールが送信されないケース
宛先が "User <user@example.com>" 形式だと送信されません。

phpの mail() や mb_send_mail() でも試しましたが、同様に送信されませんでした。
他のサーバーではちゃんと送信されるのに、何かおかしいです。

 

仕様

wp_mail() で宛先(to)に使用できるアドレス形式は、以下のようになっています。

■Function Reference/wp mail « WordPress Codex
http://codex.wordpress.org/Function_Reference/wp_mail

Valid Address Formats

All email addresses supplied to wp_mail() as the $to parameter must comply with RFC 2822. Some valid examples:

  • user@example.com
  • user@example.com, anotheruser@example.com
  • User <user@example.com>
  • User <user@example.com>, Another User <anotheruser@example.com>

宛先の指定形式が間違っている、というわけではなさそうです。

 

例外?

phpの mail関数のドキュメントに、下記のような注意書きがありました。

■PHP: mail - Manual
http://php.net/manual/ja/function.mail.php

注意:

mail() の Windows 版実装は、Unix 版実装とは 多くの点で違います。
...(中略)...
第二に、 From: や Cc:・ Bcc:・ Date: のようなカスタムヘッダは MTA ではなく PHP によってパースされます。
そのため、to 引数には "Something <someone@example.com>" 形式の メールアドレスを与えることはできません。 MTA と通信する際に mail コマンドはこれを適切にパースできません。

"User <user@example.com>" 形式が使えないケースについて明記されています。

いろいろ検索しましたが他にこれといった情報も見つけられず、とりあえず「そういうケースがあるらしい」ということで、できる範囲の対処を考えることにしました。

 

対処

例外的に使えないケースがあるようなので、その場合は、"User <user@example.com>" からメールアドレス部分だけを抽出して、宛先(to)を設定し直すことにしました。