空メールからメアドを取得する方法

前にメールからプログラムを起動する方法を書いたんだけど、その補足と言うか、メールアドレスの処理について追記をしておこうかなと。

メールでPHPを起動する方法 (2011.06.04)

下記で宛先と送信元のメアドをとることができるんですが、正確にはメアドじゃなくてFromとToに入っている文字列がそのまま取れます。

#-- From フィールドの取得
$FromAddress = $mail_data->headers['from'];

#-- To フィールドの取得
$ToAddress = $mail_data->headers['to'];

つまり、Fromに「"Nanashino, Gonbe" 」と入ってくるかもしれないし、Toに至っては複数の宛先が入っているかもしれないと。
そんなわけで、そんなときには「Mail_RFC822::parseAddressList」を利用することでメールアドレスのリストをパースすることができます。

require_once 'Mail/RFC822.php';

$from = Mail_RFC822::parseAddressList($FromAddress);
$mailto = $from[0]->mailbox . ‘@’ . $from[0]->host;

って感じでメアドを組み立てられます。

んが、ソフトバンクのケータイのメールを上記のように処理するとMail_RFC822::parseAddressListがエラーを吐くんだとか。

ケータイの空メール処理でハマる : Inside ASENS

ソフトバンクのケータイからのメールを処理するときに、
Mail_RFC822::parseAddressList がエラーを吐きます(涙)

メールヘッダを解析して発見しました。

From: =?ISO-2022-JP?B?GyRCJVIlbRsoQg==?=

なんだこれ?
ISO-2022 のくだり、ダブルコーテーションでくくられて無いので、
parseAddressListが、「Invalid address spec. Unclosed bracket or quotes」を返してました。

ってことらしいです。

んで、ソフトバンクのときは(というか、Mail_RFC822::parseAddressListがエラーを吐いた場合は)「headers['sender']」を使うといいみたいです。

// for Softbank
if (is_array($from)) {
    $mailto = $from[0]->mailbox . '@' . $from[0]->host;
} else {
    $mailto = $mail_data->headers['sender'];
}