PHP电子邮件验证脚本
我在这里的第一篇文章,虽然我已经多次使用这个网站来查找代码的修复 我一直在使用一个脚本来验证我的旧主机上的电子邮件,这很好,但是新主机(123 reg)根本无法正确验证它们 这个脚本实际上验证电子邮件的存在,而不仅仅是它的格式 请查看以下链接 t43.co.uk/emailcheck.php?电子邮件=asdasdasd@hotmail.com(工程罚款) smile database.co.uk/emailcheck.php?电子邮件=asdasdasd@hotmail.com(当我知道无效时,总是说有效) 我的剧本在下面PHP电子邮件验证脚本,php,validation,email,Php,Validation,Email,我在这里的第一篇文章,虽然我已经多次使用这个网站来查找代码的修复 我一直在使用一个脚本来验证我的旧主机上的电子邮件,这很好,但是新主机(123 reg)根本无法正确验证它们 这个脚本实际上验证电子邮件的存在,而不仅仅是它的格式 请查看以下链接 t43.co.uk/emailcheck.php?电子邮件=asdasdasd@hotmail.com(工程罚款) smile database.co.uk/emailcheck.php?电子邮件=asdasdasd@hotmail.com(当我知道无效时
function checkEmail( $email, $chFail = false )
{
$msgs = Array();
$msgs[] = 'Received email address: '.$email;
if( !preg_match( "/^(([^<>()[\]\\\\.,;:\s@\"]+(\.[^<>()[\]\\\\.,;:\s@\"]+)*)|(\"([^\"\\\\\r]|(\\\\[\w\W]))*\"))@((\[([0-9]{1,3}\.){3}[0-9]{1,3}\])|(([a-z\-0-9áàäçéèêñóòôöüæøå]+\.)+[a-z]{2,}))$/i", $email ) )
{
$msgs[] = 'Email address was not recognised as a valid email pattern<br><br>';
return $chFail ? Array( false, $msgs ) : false;
}
$msgs[] = 'Email address was recognised as a valid email pattern';
//get the mx host name
if( preg_match( "/@\[[\d.]*\]$/", $email ) )
{
$mxHost[0] = preg_replace( "/[\w\W]*@\[([\d.]+)\]$/", "$1", $email );
$msgs[] = 'Email address contained IP address '.$mxHost[0].' - no need for MX lookup';
}
else
{
//get all mx servers - if no MX records, assume domain is MX (SMTP RFC)
$domain = preg_replace( "/^[\w\W]*@([^@]*)$/i", "$1", $email );
if( !getmxrr( $domain, $mxHost, $weightings ) )
{
$mxHost[0] = $domain;
$msgs[] = 'Failed to obtain MX records, defaulting to '.$domain.' as specified by SMTP protocol';
}
else
{
array_multisort( $weightings, $mxHost );
$cnt = ''; $co = 0; foreach( $mxHost as $ch ) { $cnt .= ( $cnt ? ', ' : '' ) . $ch . ' (' . $weightings[$co] . ')'; $co++; }
$msgs[] = 'Obtained the following MX records for '.$domain.': '.$cnt;
}
}
//check each server until you are given permission to connect, then check only that one server
foreach( $mxHost as $currentHost )
{
$msgs[] = 'Checking MX server: '.$currentHost;
if( $connection = @fsockopen( $currentHost, 25 ) )
{
$msgs[] = 'Created socket ('.$connection.') to '.$currentHost;
if( preg_match( "/^2\d\d/", $cn = fgets( $connection, 1024 ) ) )
{
$msgs[] = $currentHost.' sent SMTP connection header - no futher MX servers will be checked: '.$cn;
while( preg_match( "/^2\d\d-/", $cn ) )
{
$cn = fgets( $connection, 1024 );
$msgs[] = $currentHost.' sent extra connection header: '.$cn;
}
if( !$_SERVER )
{
global $HTTP_SERVER_VARS; $_SERVER = $HTTP_SERVER_VARS;
}
//attempt to send an email from the user to themselves (not <> as some misconfigured servers reject it)
echo $_SERVER['HTTP_HOST'] . "<BR>";
$localHostIP = gethostbyname(preg_replace("/^.*@|:.*$/",'',$_SERVER['HTTP_HOST']));
echo $localHostIP . "<BR>";
$localHostName = gethostbyaddr($localHostIP);
fputs( $connection, 'HELO '.($localHostName?$localHostName:('['.$localHostIP.']'))."\r\n" );
if( $success = preg_match( "/^2\d\d/", $hl = fgets( $connection, 1024 ) ) )
{
$msgs[] = $currentHost.' sent HELO response: '.$hl;
fputs( $connection, "MAIL FROM: <$email>\r\n" );
if( $success = preg_match( "/^2\d\d/", $from = fgets( $connection, 1024 ) ) )
{
$msgs[] = $currentHost.' sent MAIL FROM response: '.$from;
fputs( $connection, "RCPT TO: <$email>\r\n" );
if( $success = preg_match( "/^2\d\d/", $to = fgets( $connection, 1024 ) ) )
{
$msgs[] = $currentHost.' sent RCPT TO response: '.$to;
}
else
{
$msgs[] = $currentHost.' rejected recipient: '.$to;
}
}
else
{
$msgs[] = $currentHost.' rejected MAIL FROM: '.$from;
}
}
else
{
$msgs[] = $currentHost.' rejected HELO: '.$hl;
}
fputs( $connection, "QUIT\r\n");
fgets( $connection, 1024 ); fclose( $connection );
//see if the transaction was permitted (i.e. does that email address exist)
$msgs[] = $success ? ('Email address was accepted by '.$currentHost) : ('Email address was rejected by '.$currentHost);
return $chFail ? Array( $success, $msgs ) : $success;
}
elseif ( preg_match( "/^550/", $cn ) )
{
$msgs[] = 'Mail domain denies connections from this host - no futher MX servers will be checked: '.$cn;
return $chFail ? Array( false, $msgs ) : false;
}
else
{
$msgs[] = $currentHost.' did not send SMTP connection header: '.$cn;
}
}
else
{
$msgs[] = 'Failed to create socket to '.$currentHost;
}
}
$msgs[] = 'Could not establish SMTP session with any MX servers';
return $chFail ? Array( false, $msgs ) : false;
}
echo "<br><br>Email Validation Check<br><br>";
$return_msgs = checkEmail( $_REQUEST['email'], true );
if ( $return_msgs[0] == 0 )
{
echo "<img src='img/Fail.png'> May be invalid<br>".$_REQUEST['email'];
}
elseif ( $return_msgs[0] == 1 )
{
echo "<img src='img/OK.png'> Valid<br>".$_REQUEST['email'];
}
else
{
echo "<img src='img/Caution.png'> Caution<br>".$_REQUEST['email'];
}
功能检查电子邮件($email,$chFail=false)
{
$msgs=Array();
$msgs[]=“收到的电子邮件地址:”。$email;
(3)如果(3)孕(3)要是要是(3)孕(3)要是要是(3)孕(3)要是要是要是(3)孕(3)要是要是要是要是(3)孕(3)要是要是要是要是要是)进行匹配((((//)(((((((^^()()[[[[[[10 10 10万万(10万[10万[10万[10万[10万[10万[10万[10万[10万[10万[10万[10万[10万]切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切切+[a-z]{2,}))$/i“,$email))
{
$msgs[]=“电子邮件地址未被识别为有效的电子邮件模式
”;
返回$chFail?数组(false,$msgs):false;
}
$msgs[]=“电子邮件地址被识别为有效的电子邮件模式”;
//获取mx主机名
如果(预匹配(“/@\[[\d.]*\]$/”,$email))
{
$mxHost[0]=preg\u replace(“/[\w\w]*@\[([\d.]+)\]$/”、“$1”、$email);
$msgs[]=“包含IP地址的电子邮件地址”。$mxHost[0]。-无需MX查找”;
}
其他的
{
//获取所有mx服务器-如果没有mx记录,则假定域为mx(SMTP RFC)
$domain=preg_replace(“/^[\w\w]*@([^@]*)$/i”,“$1”,“$email”);
如果(!getmxrr($domain,$mxHost,$weightings))
{
$mxHost[0]=$domain;
$msgs[]='无法获取MX记录,默认为SMTP协议指定的'$domain';
}
其他的
{
数组_multisort($weightings,$mxHost);
$cnt='';$co=0;foreach($mxHost作为$ch){$cnt.=($cnt?'),':''。$ch.('.$weightings[$co].');$co++;}
$msgs[]='获得了“$domain.”的以下MX记录:“.$cnt;
}
}
//检查每台服务器,直到您获得连接权限,然后仅检查该服务器
foreach($mxHost作为$currentHost)
{
$msgs[]=“正在检查MX服务器:”。$currentHost;
如果($connection=@fsockopen($currentHost,25))
{
$msgs[]='已创建到'.$connection.''的套接字('.$connection.');
if(preg_match(“/^2\d\d/”,$cn=fgets($connection,1024)))
{
$msgs[]=$currentHost。'sent SMTP连接头-不会再检查MX服务器:'.$cn;
while(preg_match(“/^2\d\d-/”,$cn))
{
$cn=fgets($connection,1024);
$msgs[]=$currentHost.“已发送额外连接头:”。$cn;
}
如果(!$\u服务器)
{
全局$HTTP\u SERVER\u VARS;$\u SERVER=$HTTP\u SERVER\u VARS;
}
//尝试从用户向自己发送电子邮件(并非因为某些配置错误的服务器拒绝)
echo$_服务器['HTTP_主机]。“
”;
$localHostIP=gethostbyname(preg_replace(“/^.*@|:.*$/”,“,$”服务器['HTTP_HOST'));
echo$localHostIP。“
”;
$localHostName=gethostbyaddr($localHostIP);
fputs($connection,'HELO'。($localHostName?$localHostName:('['.$localHostIP.]'))。“\r\n”);
如果($success=preg\u match(“/^2\d\d/”,$hl=fgets($connection,1024)))
{
$msgs[]=$currentHost。'sent HELO response:'。$hl;
fputs($connection,“邮件发件人:\r\n”);
如果($success=preg\u match(“/^2\d\d/”,$from=fgets($connection,1024)))
{
$msgs[]=$currentHost。'sent MAIL FROM response:'。$FROM;
fputs($connection,“RCPT TO:\r\n”);
如果($success=preg\u match(“/^2\d\d/”,$to=fgets($connection,1024)))
{
$msgs[]=$currentHost。'sent RCPT TO response:'。$TO;
}
其他的
{
$msgs[]=$currentHost.“拒绝的收件人:”。$to;
}
}
其他的
{
$msgs[]=$currentHost.“拒绝邮件发件人:”.$FROM;
}
}
其他的
{
$msgs[]=$currentHost.“拒绝的直升机:”.$hl;
}
fputs($connection,“QUIT\r\n”);
fgets($connection,1024);fclose($connection);
//查看交易是否被允许(即该电子邮件地址是否存在)
$msgs[]=$success?('Email address已被'.$currentHost'接受):('Email address已被'.$currentHost'拒绝);
返回$chFail?数组($success,$msgs):$success;
}
其他(预匹配(“^550/”,$cn))
{
$msgs[]='邮件域拒绝来自此主机的连接-不会再检查MX服务器:'。$cn;
返回$chFail?数组(false,$msgs):false;
}
其他的
{
$msgs[]=$currentHost。'未发送SMTP连接头:'。$cn;
}
}
其他的
{
$msgs[]='无法创建到'.$currentHost'的套接字;
}
}
$msgs[]='无法与任何MX服务器建立SMTP会话';
返回$chFail?数组(false,$msgs):false;
}
回显“
电子邮件验证检查
”;
$return\u msgs=checkEmail($\u REQUEST['email'],true);
如果(