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 |