• ベストアンサー

メールの特定にphpを使っているのですが、From欄のアドレスを取得す

メールの特定にphpを使っているのですが、From欄のアドレスを取得するために、 if (eregi("From:[ \t]*([^\r\n]+)", $head, $freg)) { としていましたが、GmailやYahooメールだと、ヘッダーにDomainKey-Signatureがあり、その中のfrom:がヒットしてしまいます(Fromのメールアドレスが取得できない)。上手く取得する方法はありませんでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

この場合、Fromは大文字小文字を区別した方がよいような・・・ なのでi修飾子はつかわないほうがよくないですか?

mionx
質問者

お礼

遅くなってすいません。i修飾子なしで、上手くいきました。ありがとうございました。

その他の回答 (3)

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.4

そちらがやっている事とは別のアプローチですので、見当違いな回答だったらすみません。 とりあえず、確認なのですが、メールサーバで受けたメールをPHPにパイプして、file_get_contents("php://stdin"); みたいな感じで、受け取ってると解釈していいでしょうか? メールサーバとかPHPの設定によるのかもしれませんが、$_SERVER['SENDER'];で 送信者のアドレスは取れるはずです。 メールサーバはPostfixで 個人で遊びでやっているだけなので、稼動実績とかはありませんが、yahooメールもGmailも これで 送信者のアドレスは受け取れてます。

mionx
質問者

お礼

いろいろと勉強になりました。情報、ありがとうございました。

noname#111181
noname#111181
回答No.2

メールアドレスを正規表現であらわし、下記のようにしたらどうでしょうか。 なお、PHP5ではeregシリーズは非推奨となったので、preg_match関数を使っています。 preg_match('/^From(.*)[0-9a-z!#\$%\&'\*\+\/\=\?\^\|\-\{\}\.]+@[0-9a-z!#\$%\&'\*\+\/\=\?\^\|\-\{\}\.]+/i', $head, $freg);

mionx
質問者

お礼

いろいろと勉強になりました(教えていただいた方法では、上手くいきませんでした)。情報、ありがとうございました。

回答No.1

(1) その正規表現をgオプションか何かでリストとして取得し、DomainKey-Signatureの場合を除けば動くのではないでしょうか。 (2) メール全体ではなく、行ごとに処理する方が普通です。その場合、"^From:[\s\t]*(.+)$"みたいに、行頭からFrom:があるものを(ヘッダ領域に関して)調べれば問題ないはず。(正規表現の細かいところとか改行に関しては把握してません)

mionx
質問者

補足

回答ありがとうございます。 (2)の方で、やっているのですが、確かに、 From : *****@gmail.com となっている単なる文字列(空白はタブ)ですが、教えていただいた"^From:[\s\t]*(.+)$"や、"^From[\t]:[\t]*([^\r\n]+)"でも、取れませんでした(すいません、勉強不足です)。どこか誤っていますでしょうか。