Php verification email address class (Classic)

Source: Internet
Author: User
Tags php email preg mx record
Php verification email address class (Classic)
Share a php class to verify the email address. generally, we will verify it through js regular expressions. the code we share here is implemented using native php. if you need it, refer to it.

This php email verification class provided in this article has the following features: 1. you can perform simple email address verification. 2. check whether the email address belongs to a valid email exchange record domain. 3. you can try to connect to the mail server to check whether the mailbox actually exists. 4. for windows platforms, functions not available in getmxrr are implemented, and DNS resolution classes of Moriyoshi Koizumi are used.

Code:

     next_token;         }         for($character=0;$character
     
      next_token=substr($string,$found+1);             return(substr($string,0,$found));         }         else         {             $this->next_token="";             return($string);         }     }     Function OutputDebug($message)     {         $message.="\n";         if($this->html_debug)             $message=str_replace("\n","
      
\n",HtmlEntities($message)); echo $message; flush(); } 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("S $line"); return($line); } } } Function PutLine($connection,$line) { if($this->debug) $this->OutputDebug("C $line"); return(fputs($connection,"$line\r\n")); } Function ValidateEmailAddress($email) { if(IsSet($this->preg)) { if(strlen($this->preg)) return(preg_match($this->preg,$email)); } else { $this->preg=(function_exists("preg_match") ? "/".str_replace("/", "\\/", $this->email_regular_expression)."/" : ""); return($this->ValidateEmailAddress($email)); } return(eregi($this->email_regular_expression,$email)!=0); } Function ValidateEmailHost($email,&$hosts) { if(!$this->ValidateEmailAddress($email)) return(0); $user=$this->Tokenize($email,"@"); $domain=$this->Tokenize(""); $hosts=$weights=array(); $getmxrr=$this->getmxrr; if(function_exists($getmxrr) && $getmxrr($domain,$hosts,$weights)) { $mxhosts=array(); for($host=0;$host exclude_address)==0 || strcmp(@gethostbyname($this->exclude_address),$ip))) $hosts[]=$domain; } return(count($hosts)!=0); } Function VerifyResultLines($connection,$code) { while(($line=$this->GetLine($connection))) { $this->last_code=$this->Tokenize($line," -"); if(strcmp($this->last_code,$code)) return(0); if(!strcmp(substr($line, strlen($this->last_code), 1)," ")) return(1); } 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 debug) $this->OutputDebug("Resolving host name \"".$hosts[$host]."\"..."); if(!strcmp($ip=@gethostbyname($domain),$domain)) { if($this->debug) $this->OutputDebug("Could not resolve host name \"".$hosts[$host]."\"."); continue; } } if(strlen($this->exclude_address) && !strcmp(@gethostbyname($this->exclude_address),$ip)) { if($this->debug) $this->OutputDebug("Host address of \"".$hosts[$host]."\" is the exclude address"); continue; } if($this->debug) $this->OutputDebug("Connecting to host address \"".$ip."\"..."); if(($connection=($this->timeout ? @fsockopen($ip,25,$errno,$error,$this->timeout) : @fsockopen($ip,25)))) { $timeout=($this->data_timeout ? $this->data_timeout : $this->timeout); if($timeout && function_exists("socket_set_timeout")) socket_set_timeout($connection,$timeout,0); 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($result) { if($this->PutLine($connection,"DATA")) $result=($this->VerifyResultLines($connection,"354")!=0); } else { if(strlen($this->last_code) && !strcmp($this->last_code[0],"4")) $result=-1; } if($this->debug) $this->OutputDebug("This host states that the address is ".($result ? ($result>0 ? "valid" : "undetermined") : "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); } }; ?> //GetMXRR function emulation need to make the class work properly under Windows and other platforms without this function (needs DNS.php mentioned in the Related links section). All Rights Reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ------------------------------------------------------------------------ */ if(IsSet($_NAMESERVERS) && (GetType($_NAMESERVERS)!="array" || count($_NAMESERVERS)==0)) Unset($_NAMESERVERS); /*************************************************************************** Description $_NAMESERVER[] The array that contains IP addresses or domain names of name servers used for DNS resolution. If nothing is set before require()'ing this library, the values will automatically prepared. bool getmxrr( string $hostname, arrayref $mxhosts, arrayref $weight ); This function works in the same way as getmxrr(), however the third parameter cannot be omitted. If you need no MX preference information, please do like: getmxrr( 'example.com', $mxhosts, ${''} ); ------------------------------------------------------------------------- Configuration If you are doing with win32 environments and don't set $_NAMESERVER manually, make sure that ipconfig.exe is within the PATH. ipconfig.exe is generally distributed with any Microsoft(R) Windows distributions except for Windows 95. ***************************************************************************/ require_once( 'DNS.php' ); /* rewrite this path to the same as the box's configuration if you run scripts on *NIX platforms */ define( 'RESOLV_CONF_PATH', '/etc/resolv.conf' ); if( !isset( $_NAMESERVERS ) ) { $_NAMESERVERS = array(); if( strncmp( PHP_OS, "WIN", 3 ) == 0 ) { unset( $res ); exec( 'ipconfig /all', $res ); $cnt = count( $res ); for( $i = 0; $i < $cnt; ++$i ) { if( strpos( $res[$i], 'DNS Servers' ) !== false ) { $_NAMESERVERS[] = substr( $res[$i], strpos( $res[$i], ': ' ) + 2 ); break; } } while( $i<$cnt-1 && strpos( $res[++$i], ':' ) === false ) { $_NAMESERVERS[] = trim( $res[$i] ); } } elseif( file_exists( RESOLV_CONF_PATH ) ) { $lines = file( RESOLV_CONF_PATH ); $cnt = count( $lines ); for( $i = 0; $i < $cnt; ++$i ) { list( $dr, $val ) = split( '[ \t]', $lines[$i] ); if( $dr == 'nameserver' ) { $_NAMESERVERS[] = rtrim( $val ); } } unset( $lines ); } } if(count($_NAMESERVERS)) $__PHPRESOLVER_RS = new DNSResolver( $_NAMESERVERS[0] ); else { Unset($_NAMESERVERS); Unset($__PHPRESOLVER_RS); } function GetMXRR( $hostname, &$mxhosts, &$weight ) { global $__PHPRESOLVER_RS; if(!IsSet($__PHPRESOLVER_RS)) return(false); $dnsname = & DNSName::newFromString( $hostname ); $answer = & $__PHPRESOLVER_RS->sendQuery( new DNSQuery( new DNSRecord( $dnsname, DNS_RECORDTYPE_MX ) ) ); if( $answer === false || $answer->rec_answer === false ) { return false; } else { $i = count( $answer->rec_answer ); $mxhosts = $weight = array(); while( --$i >= 0 ) { if( $answer->rec_answer[$i]->type == DNS_RECORDTYPE_MX ) { $rec = &$answer->rec_answer[$i]->specific_fields; $mxhosts[] = substr( $rec['exchange']->getCanonicalName(), 0, -1 ); $weight[] = $rec['preference']; } } return true; } } ?> //TEST SCRIPT Test for Manuel Lemos's PHP E-mail validation class Test for Manuel Lemos's PHP E-mail validation class getmxrr="_getmxrr"; } */ /* how many seconds to wait before each attempt to connect to the destination e-mail server */ $validator->timeout=10; /* how many seconds to wait for data exchanged with the server. set to a non zero value if the data timeout will be different than the connection timeout. */ $validator->data_timeout=0; /* user part of the e-mail address of the sending user (info@phpclasses.org in this example) */ $validator->localuser="info"; /* domain part of the e-mail address of the sending user */ $validator->localhost="phpclasses.org"; /* Set to 1 if you want to output of the dialog with the destination mail server */ $validator->debug=1; /* Set to 1 if you want the debug output to be formatted to be displayed properly in a HTML page. */ $validator->html_debug=1; /* When it is not possible to resolve the e-mail address of destination server (MX record) eventually because the domain is invalid, this class tries to resolve the domain address (A record). If it fails, usually the resolver library assumes that could be because the specified domain is just the subdomain part. So, it appends the local default domain and tries to resolve the resulting domain. It may happen that the local DNS has an * for the A record, so any sub-domain is resolved to some local IP address. This prevents the class from figuring if the specified e-mail address domain is valid. To avoid this problem, just specify in this variable the local address that the resolver library would return with gethostbyname() function for invalid global domains that would be confused with valid local domains. Here it can be either the domain name or its IP address. */ $validator->exclude_address=""; if(IsSet($_GET["email"])) $email=$_GET["email"]; if(IsSet($email) && strcmp($email,"")) { if(($result=$validator->ValidateEmailBox($email))<0) echo " It was not possible to determine if $email is a valid deliverable e-mail box address. \n"; else echo " $email is ".($result ? "" : "not ")."a valid deliverable e-mail box address. \n"; } else { $port=(strcmp($port=getenv("SERVER_PORT"),"") ? intval($port) : 80); $site="http://".(strcmp($site=getenv("SERVER_NAME"),"") ? $site : "localhost").($port==80 ? "" : ":".$port).GetEnv("REQUEST_URI"); echo "Access this page using a URL like: $site?email= your@test.email.here\n"; } ?>

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.