• 締切済み

メールアドレスチェックの方法

こんにちは。いつもお世話になります。 今回は、メールアドレスのチェックについて教えてください。 簡単な正規表現によるチェックは、いくつかのサイトで見かけるのですが、 もう少しアレンジしたくて投稿しました。 一発でチェックする正規表現より、まず原始的な方法で考えました。 1)@以下だけ考えます。 $pathmail = explode("@", $email); $dotcheck = explode(".", $pathmail[1]); この時のピリオドの回数ですが、現実に下記のようなものはありますか? xxx@yyy.ccc.aaa.yyy.jjj.ooo.com(.comはgTLDであれば何でもいいです) 僕がいままで出くわした実在するメールアドレスは、 @以下のピリオド数の最高が、xxx@yyy.zzzz.ne.jp と3つでした。 ■ 3つ以上のピリオドは存在しますか? 2)1の場合、サブドメインは、yyyだと思いますが、 サブドメインの法則といいますか、それをチェックする正規表現が あれば、教えて下さい。 特に英数字に囲まれたハイフン(-)が2つ連記される場合は存在しますか? まずは、これだけ教えて下さい。 どうか、よろしくおねがいします。

みんなの回答

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

というか、そんな調べ方をしても実在するかどうかは 保障されるわけではありません。 どうせやるなら以下のようにしてみるとよいでしょう。 問題ないなら0を返してきます。 負荷がかかるのでアカウントが有効かどうかまでは 調べてませんが、場合によってはsocketなどでチェック してみてもよいかも知れません。(個人的には比推奨) <?php function checkMail($num) { if (preg_match("/[^-._~@\w]+/", $num)) return 1; $hostname = substr($num, strpos($num, "@")+1); $mxcheck = getmxrr($hostname, $mxhosts); $hostcheck = ($hostname != gethostbyname($hostname)); if (!$mxcheck and !$hostcheck) return 2; return 0; } ?>

参考URL:
http://www.php.net/manual/ja/function.getmxrr.php
waterclock
質問者

お礼

どうもありがとうございます。 凄いと思いました。究極だと思います。 テストしましたが、おっしゃるようにかなり負担が大きいです。 通常のメールチェックでは云われるように使わない方が無難ですね。 使うにしてもネストさせた正規表現で通ったものにだけ、 $mxcheck, $hostcheckをさせるやり方になるでしょうか。 もう少し、教えて下さい。

waterclock
質問者

補足

次のコードを見てもらえばスキルがわかるでしょうが、 全くの素人です。そこを笑わないでください。 教えて頂きたいのは、コードを改訂整理して欲しいのです。 どうか、おねがいします。 -- mail check function ---------- function checkEmail($num) { $pathmail = explode("@", $num); $hostname = substr($num, strpos($num, "@")+1); $dot = explode(".", $pathmail[1]); $error = 0; if(!preg_match('/\@/',$num)){ $error++; } if(!preg_match('/^[a-z0-9][a-z0-9\_\.\-]+[^\.]$/i',$pathmail[0])){ $error++; } if(!preg_match('/^[a-z0-9]/i',$hostname)){ $error++; } if(preg_match('/_|,|\.[a-z0-9]\.|(\.{2})/i',$hostname)){ $error++; } //if(!preg_match('/\.[a-z]{2,6}$/i',$hostname)){ $error++; } if(!preg_match('/\.(com|net|org|...(全部で271)..|zm|zw)$/i',$hostname)){ $error++; } preg_match('/(ac|co|go|or|ad|ne|gr|ed|lg)\.jp$/i',$hostname,$jptld); preg_match('/(co|me|org)\.uk$/i',$hostname,$uktld); if(preg_match('/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/', $hostname)){ for($i=0; $i<4; $i++){ if($dot[$i] < 0 || $dot[$i] > 255){ $error++; } } } if($dot[2] == ''){ if(!preg_match('/[a-z0-9-]+/',$dot[0]) || preg_match('/-$/',$dot[0])){ $error++; } if(preg_match('/^([a-z0-9]{0,2})(-{3})/i',$dot[0])){ $error++; } }elseif($dot[3] == ''){ if($jptld || $uktld){ if(!preg_match('/[a-z0-9-]+/',$dot[0]) || preg_match('/-$/',$dot[0])){ $error++; } if(preg_match('/^([a-z0-9]{0,2})(-{3})/i',$dot[0])){ $error++; } }else{ if(!preg_match('/[a-z0-9-]+/',$dot[1]) || preg_match('/-$/',$dot[1])){ $error++; } if(preg_match('/^([a-z0-9]{0,2})(-{3})/i',$dot[1])){ $error++; } } }elseif($dot[4] == ''){ if($jptld || $uktld){ if(!preg_match('/[a-z0-9-]+/',$dot[1]) || preg_match('/-$/',$dot[1])){ $error++; } if(preg_match('/^([a-z0-9]{0,2})(-{3})/i',$dot[1])){ $error++; } } } if($error == 0){ return true; }else{ return false; } }

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

RFC952 http://www.ietf.org/rfc/rfc952.txt のASSUMPTIONS の部分 アルファベット、数字、マイナスとピリオドで構成される24文字までの文字列で ピリオドはドメインの区切りとしてだけ利用する 英字で始まり、マイナスまたはピリオドで終わってはならない。 とあります。 このルールでいうと ”英数字に囲まれたハイフン(-)が2つ連記される場合” というのは、OKですね。 >3つ以上のピリオドは存在しますか? 私もナンセンスだと思います。 存在するかも知れないし、あっても別におかしくない。

waterclock
質問者

お礼

お礼が遅れましてどうもすみません。 ありがとうございます。ずっと考えていました。 確かに@以下のピリオドで判断するのはナンセンスですね。 http://www.yourname.ne.nu/だと、8.8.8.8.8.8.8のも 登録できるようだし。1発の正規表現でチェックできるものでも なさそうだし、考える事自体ナンセンスに思えてきました。

回答No.1

1. 何段階まで子ドメインを作れるのかが決まっているのか私は知りませんが、 決まっていたとしても256段階とか、そんなオーダーだと思いますよ。きっと。 ピリオドの数でメールアドレスの正当性を検証するのはナンセンスだと思います。 経験則でピリオド3つとかじゃなくて、仕様書を探すべきだと思います。 2. ちょっと調べた感じだと RFC1035 (例えばhttp://www.faqs.org/rfcs/rfc1035.html) の 2.3.1 Preferred name sysntax のところなんかが参考になるかも。 preferredとか言っているので曖昧ですが、 ここに書いてある範囲で、--は許されるようです。

waterclock
質問者

お礼

どうもありがとうございます。 お礼が遅れまして申し訳ありません。 ちょっと考えていました。

関連するQ&A