- ベストアンサー
メールの特定にphpを使っているのですが、From欄のアドレスを取得す
メールの特定にphpを使っているのですが、From欄のアドレスを取得するために、 if (eregi("From:[ \t]*([^\r\n]+)", $head, $freg)) { としていましたが、GmailやYahooメールだと、ヘッダーにDomainKey-Signatureがあり、その中のfrom:がヒットしてしまいます(Fromのメールアドレスが取得できない)。上手く取得する方法はありませんでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
この場合、Fromは大文字小文字を区別した方がよいような・・・ なのでi修飾子はつかわないほうがよくないですか?
その他の回答 (3)
- bm_hiro
- ベストアンサー率51% (200/388)
そちらがやっている事とは別のアプローチですので、見当違いな回答だったらすみません。 とりあえず、確認なのですが、メールサーバで受けたメールをPHPにパイプして、file_get_contents("php://stdin"); みたいな感じで、受け取ってると解釈していいでしょうか? メールサーバとかPHPの設定によるのかもしれませんが、$_SERVER['SENDER'];で 送信者のアドレスは取れるはずです。 メールサーバはPostfixで 個人で遊びでやっているだけなので、稼動実績とかはありませんが、yahooメールもGmailも これで 送信者のアドレスは受け取れてます。
お礼
いろいろと勉強になりました。情報、ありがとうございました。
メールアドレスを正規表現であらわし、下記のようにしたらどうでしょうか。 なお、PHP5ではeregシリーズは非推奨となったので、preg_match関数を使っています。 preg_match('/^From(.*)[0-9a-z!#\$%\&'\*\+\/\=\?\^\|\-\{\}\.]+@[0-9a-z!#\$%\&'\*\+\/\=\?\^\|\-\{\}\.]+/i', $head, $freg);
お礼
いろいろと勉強になりました(教えていただいた方法では、上手くいきませんでした)。情報、ありがとうございました。
- beefisdead
- ベストアンサー率63% (92/145)
(1) その正規表現をgオプションか何かでリストとして取得し、DomainKey-Signatureの場合を除けば動くのではないでしょうか。 (2) メール全体ではなく、行ごとに処理する方が普通です。その場合、"^From:[\s\t]*(.+)$"みたいに、行頭からFrom:があるものを(ヘッダ領域に関して)調べれば問題ないはず。(正規表現の細かいところとか改行に関しては把握してません)
補足
回答ありがとうございます。 (2)の方で、やっているのですが、確かに、 From : *****@gmail.com となっている単なる文字列(空白はタブ)ですが、教えていただいた"^From:[\s\t]*(.+)$"や、"^From[\t]:[\t]*([^\r\n]+)"でも、取れませんでした(すいません、勉強不足です)。どこか誤っていますでしょうか。
お礼
遅くなってすいません。i修飾子なしで、上手くいきました。ありがとうございました。