[PHP]이메일 존재 여부 검사기~

2007. 10. 1. 15:58프로그램개발/Tip!!

<?
/*
* email_validation.php
*/

class email_validation_class
{
 var $email_regular_expression="^([-!#\$%&'*+./0-9=?A-Z^_`a-z{|}~ ])+@([-!#\$%&'*+/0-9=?A-Z^_`a-z{|}~ ]+\\.)+[a-zA-Z]{2,4}\$";
 var $timeout=0;
 var $localhost="";
 var $localuser="";
 var $debug=1;

 Function OutputDebug($message)
 {
  echo $message,"<br/>\n";
 }

 Function GetLine($connection)
 {
  for($line="";;)
  {
   if(feof($connection))
    return(0);

   $line.=fgets($connection,100);
   $length=strlen($line);
   if($length>=2
   && substr($line,$length-2,2)=="\r\n")
   {
    $line=substr($line,0,$length-2);

    if($this->debug)
     $this->OutputDebug("< $line");

    return($line);
   }
  }
 }

 Function PutLine($connection,$line)
 {
  if($this->debug)
   $this->OutputDebug("> $line");

  return(fputs($connection,"$line\r\n"));
 }

 Function ValidateEmailAddress($email)
 {
  return(eregi($this->email_regular_expression,$email)!=0);
 }

 Function ValidateEmailHost($email,$hosts=0)
 {
  if(!$this->ValidateEmailAddress($email))
   return(0);

  if(!$this->ValidateMx($email))
   return(0);

  $user=strtok($email,"@");
  $domain=strtok("");

  if(GetMXRR($domain,&$hosts,&$weights))
  {
   $mxhosts=array();

   for($host=0;$host<count($hosts);$host++)
    $mxhosts[$weights[$host]]=$hosts[$host];

   KSort($mxhosts);

   for(Reset($mxhosts),$host=0;$host<count($mxhosts);Next($mxhosts),$host++)
    $hosts[$host]=$mxhosts[Key($mxhosts)];
  }
  else
  {
   $hosts=array();

   if(strcmp(@gethostbyname($domain),$domain)!=0)
    $hosts[]=$domain;
  }
  return(count($hosts)!=0);
 }

 Function VerifyResultLines($connection,$code)
 {
  while(($line=$this->GetLine($connection)))
  {
   if(!strcmp(strtok($line," "),$code))
    return(1);

   if(strcmp(strtok($line,"-"),$code))
    return(0);
  }
  return(-1);
 }

 Function ValidateEmailBox($email)
 {
  if(!$this->ValidateEmailHost($email,&$hosts))
   return(0);

  if(!strcmp($localhost=$this->localhost,"")
   && !strcmp($localhost=getenv("SERVER_NAME"),"")
   && !strcmp($localhost=getenv("HOST"),""))
   $localhost="localhost";
  }
  if(!strcmp($localuser=$this->localuser,"")
   && !strcmp($localuser=getenv("USERNAME"),"")
   && !strcmp($localuser=getenv("USER"),"")) {
   $localuser="root";
  }

  for($host=0;$host<count($hosts);$host++)
  {
   if($this->debug)
    $this->OutputDebug("Connecting to host \"".$hosts[$host]."\"...");

   if(($connection=($this->timeout ? fsockopen($hosts[$host],25,&$errno,&$error,$this->timeout) : fsockopen($hosts[$host],25))))
   {
    if($this->debug)
     $this->OutputDebug("Connected.");

    if($this->VerifyResultLines($connection,"220")>0
     && $this->PutLine($connection,"HELO $localhost")
     && $this->VerifyResultLines($connection,"250")>0
     && $this->PutLine($connection,"MAIL FROM: <$localuser@$localhost>")
     && $this->VerifyResultLines($connection,"250")>0
     && $this->PutLine($connection,"RCPT TO: <$email>")
     && ($result=$this->VerifyResultLines($connection,"250"))>=0)
    {
     if($this->debug)
      $this->OutputDebug("This host states that the address is ".($result ? "" : "not ")."valid.");

     fclose($connection);

     if($this->debug)
      $this->OutputDebug("Disconnected.");

     return($result);
    }
   
    if($this->debug)
     $this->OutputDebug("Unable to validate the address with this host.");

    fclose($connection);
   
    if($this->debug)
     $this->OutputDebug("Disconnected.");
   }
   else
   {
    if($this->debug)
     $this->OutputDebug("Failed.");
   }

  }
  return(-1);
 }

 function ValidateMx($email) {
  list($user, $host) = explode("@", $email);

  if($this->debug) {
   $this->OutputDebug("DNS Check.....");
   $this->OutputDebug("checkdnsrr...MX : ".(checkdnsrr($host, "MX") ? "Pass" : "Error!! "));
   $this->OutputDebug("checkdnsrr...A : ".(checkdnsrr($host, "A") ? "Pass" : "Error!! "));
  }

  if (!checkdnsrr($host, "MX"))
  {
   return false;
  }

  if (!checkdnsrr($host, "A")) {
   return false;
  }

  if($this->debug) {
   $this->OutputDebug("Mail Check.....");
  }

  return true;
 }
};

?>

=================================================================

<HTML>
<HEAD>
<TITLE>이메일 실제 존재여부 검사기</TITLE>
</HEAD>
<BODY>
<H1><CENTER>이메일 실제 존재여부 검사기</CENTER></H1>
<HR>
<?

 require("email_validation.php");

 $validator=new email_validation_class;
 $validator->timeout=10;

 if(IsSet($email)
 && strcmp($email,""))
 {
  if(($result=$validator->ValidateEmailBox($email))<0) {
  echo "<H2><CENTER><TT>$email</TT>존재하지 않는 Email</CENTER></H2>\n";
  }
  else
  {
   echo "<H2><CENTER><TT>$email</TT>".($result ? "은 존재하는 이메일입니다." : "은 존재하지 않는 이메일입니다.")."</CENTER></H2>\n";
  }
 }
 else
 {
  $port=(strcmp($port=getenv("SERVER_PORT"),"") ? intval($port) : 80);
  $site="http://".(strcmp($site=getenv("SERVER_NAME"),"") ? $site : "localhost").($port==80 ? "" : ":".$port).$PHP_SELF;
  echo "<H2>URL을 다음과 같이 입력하세요.: $site?email=<TT>your@test.email.here</TT></H2>\n";
  echo "<H2>아니면 아래의 입력폼을 이용하셔도 됩니다.</H2>\n";
  echo "서버에 이메일이 실재로 존재하는지를 검사합니다.\n";
 }
?>
<HR>
<form name="asd" method="get">
<input type="text" name="email" />
<input type="submit" value="이메일 존재여부 검사" />
</form>
</BODY>
</HTML>

=======================================================================

[참고]

이 제품은 모든 메일서버의 사용자 사서함을 확인할 수는 없습니다. 다양한 메일환경설정에 따라  특정 메일서버에서는 사용자의 사서함 유무에 대해 일차적인 확인절차를 생략하는 경우가 있습니다. 그러나, 대부분의 고객 이메일정보 중 적정수준 이상의 검증 효과를 가질 수 있어 고객관리비용의 절감효과를 가져 올 수 있습니다.

****************************************

테스트 해본결과 아무리 못해도  http://www.dextsolution.com/Product/dextEmail01.aspx

이정도 수준은 충분히 나옵니다.

비용절감한번 해봐용~
 


유용히 쓰시기를..

반응형

'프로그램개발 > Tip!!' 카테고리의 다른 글

MS Timezone  (0) 2016.08.20
[C#] 웹서버를 만들어 봅시다.  (2) 2015.12.25
[C#]ASC II Code  (0) 2015.11.14
[C#] 토렌토 파일을 읽어 봅시다.  (0) 2015.10.17