先日、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" だけなら送信されます。 [crayon-68e4a10ea5b77079064544/]
メールが送信されないケース
宛先が "User <user@example.com>" 形式だと送信されません。 [crayon-68e4a10ea5b8b042583836/] 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)を設定し直すことにしました。
[crayon-68e4a10ea5b90565536598/]
コメントを残す