先日、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" だけなら送信されます。
1 |
wp_mail( 'user@example.com', $subject, $message, $header ); |
メールが送信されないケース
宛先が "User <user@example.com>" 形式だと送信されません。
1 |
wp_mail( 'User <user@example.com>', $subject, $message, $header ); |
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)を設定し直すことにしました。
1 2 3 4 5 6 7 8 9 |
$to = "User <user@example.com>, hoge@example.com"; $ret = wp_mail( $to, $subject, $message, $header ); if ( $ret == false ) { if( preg_match_all( "/(\w+[-+\w.]+@[-\w.]+\.\w{2,5})/", $to, $matches ) ){ $addr = array_unique( $matches[0], SORT_STRING ); $send_to = implode( ',', $addr ); $ret = wp_mail( $send_to, $subject, $message, $header ); } } |
コメントを残す