#native_company# #native_desc#
#native_cta#

More Email Validation

By Troy Vinson
on June 13, 2003

Version: 1

Type: Function

Category: Other

License: GNU General Public License

Description: Email regex validation with MX check and communication. Sample code included. Returns bool valid code, bool condition code and str message.

<?php

//sample code
//$eMail = "[email protected]";
//$IsItValid = validateEmail($eMail);
//echo "<p>";
//$valid = (!$IsItValid[0]) ? "FALSE" : "TRUE"; 
//echo $eMail." is a valid email address: ".$valid."<br>n";
//$spcmsg = (!$IsItValid[1]) ? "FALSE" : "TRUE"; 
//echo "Special validation condition exists: ".$spcmsg."<br>n";
//$strmsg = $IsItValid[2];
//echo "Returned validation message: ".$strmsg."<br>n";
//echo "</p>n";
//exit;

/*
Function:  validateEmail()
Date:      02/03/2003
Usage:	   validateEmail(email_address,<$DEBUG=true>)
Returns:   array $Return
           $Return[0]: int 0 = invalid email
                       int 1 = valid email
           $Return[1]: int 0 = no special validation condition
                       int 1 = special validation condition exists
           $Return[2]: str 'text of return message' 
Platforms: Unix,Linux
Versions:  PHP3, PHP4
Notes:
- Special Validation Conditions return TRUE based on criteria which 
make it impossible to validate an email address against a mail server.
For example, these conditions may exist if MX records are munged or 
returned in an unexpected format, or if there is a system error 
preventing the lookup and extraction of the MX server, or if the 
answering mail server just refuses permission to logon (AOL mostly).
*/
function validateEmail($eMail,$DEBUG=false) {
  if (!$DEBUG) error_reporting(0);
  global $HTTP_HOST;
  $myhost = $HTTP_HOST;
  if ($DEBUG) echo "Checking format of ".$eMail.".<br>n";
  //verify email address format
  if (!eregi("^[_a-z0-9_-]+(.[_a-z0-9_-]+)*@[a-z0-9_-]+(.[a-z0-9_-]+)*(.[a-z]{2,3})$", $eMail)) { 
    //return with an invalid address error
    $returnMsg = $eMail." is an invalid email address format.<br><br>n";
    if ($DEBUG) echo $returnMsg;
    $Return[0] = FALSE;
    $Return[1] = FALSE;
    $Return[2] = $returnMsg;
    return $Return;
  } else {
    if ($DEBUG) echo "Format of ".$eMail." verified.<br><br>n";
  }
  list($userName,$domainName ) = split ("@",$eMail);
  $domainName = $domainName.".";
  if (checkdnsrr($domainName,"MX"))  {
    if (getmxrr($domainName,$mxRecord))  {  
      //save the MX hostname
      $mailSvr = $mxRecord[0];
    } else {
      //MX record exists but failed to retrieve
      //return with a system error message NOT an invalid address
      //set special condition flag $Return[1]
      $returnMsg = "System error - problem with MX record lookup. Email address may be valid.";
      if ($DEBUG) echo $returnMsg;
      $Return[0] = TRUE;
      $Return[1] = TRUE;
      $Return[2] = $returnMsg;
      return $Return;
    }
  } else {
    //no MX record found, assume $domainName is also the mail server
    $mailSvr = $domainName;
  }
  
  if ($DEBUG) echo "Using mail server ".$mailSvr."...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>n";
  if ($DEBUG) echo "Trying ".$mailSvr." on SMTP port 25...<br><br>n";
  $Connection = fsockopen($mailSvr, 25, $errno, $errstr, 10);
  if ($Connection) {
    $InitConnect = fgets($Connection, 1024);
    if ($DEBUG) echo "Connection Made to ".$mailSvr.".<br><br>n";
    if ($DEBUG) echo $mailSvr."> ".$InitConnect."<br><br>n";
    //start the SMTP validation
    if (ereg("^220",$InitConnect)) {
      //it's a friendly SMTP server, start communication
      //store the response 
      $mailOpenQ = "HELO " .$myhost. "rn";
      fputs($Connection, "$mailOpenQ");  
      $mailOpenA = fgets($Connection, 1024);
      if ($DEBUG) echo $myhost."> ".$mailOpenQ."<br>n";
      if ($DEBUG) echo $mailSvr."> ".$mailOpenA."<br><br>n";
      
      //Ask it to accept mail from phpemailtester@$myhost
      //store the response
      $mailFromQ = "MAIL FROM: <phpemailtester@$myhost>rn";
      fputs($Connection, "$mailFromQ");  
      $mailFromA = fgets($Connection,1024); 
      if ($DEBUG) echo $myhost."> ".htmlspecialchars($mailFromQ)."<br>n";
      if ($DEBUG) echo $mailSvr."> ".$mailFromA."<br><br>n";
      
      //Ask it to accept mail for delivery to $eMail user
      //store the response
      $mailToQ = "RCPT TO: <$eMail>rn";
      fputs($Connection, "$mailToQ");  
      $mailToA = fgets($Connection,1024);
      if ($DEBUG) echo $myhost."> ".htmlspecialchars($mailToQ)."<br>n";
      if ($DEBUG) echo $mailSvr."> ".$mailToA."<br><br>n";
      
      //Close the connection
      $mailQuit = "QUITrn";
      fputs ($Connection, $mailQuit); 
      socket_set_timeout($Connection,1,1); 
      fclose($Connection); 
      if ($DEBUG) echo $myhost."> ".$mailQuit."<br><br>n";
      
      //look for a "250" response in $mailTo
      if (ereg("^250", $mailToA)) {
        // return with a successful validation
        $returnMsg = $mailSvr." replied that ".$eMail." exists or is, at least, syntactically correct.<br>n";
        if ($DEBUG) echo $returnMsg;
        $Return[0] = TRUE;
        $Return[1] = FALSE;
        $Return[2] = $returnMsg;
        return $Return;
      } else {
        // the server refused the user so return with invalid address error
        $returnMsg = $mailSvr." returned bad or non-existent address error.";
        if ($DEBUG) echo $returnMsg;
        $Return[0] = FALSE;
        $Return[1] = FALSE;
        $Return[2] = $returnMsg;
        return $Return;
      }
    } else if (ereg("^550)", $InitConnect)) {
	//connected to an unfriendly mail server or received an error response
	//most likley from AOL, must accept $eMail as valid 
	//set special condition flag $Return[1]
	if (ereg("aol.com$", $eMail) || ereg("AOL", $InitConnect)) {
          $returnMsg = "Unfriendly AOL mailserver (".$mailSvr.") - cannot verify ".$eMail.".<br>n";
	} else {
          $returnMsg = "Unfriendly mail server (".$mailSvr.") will not let us verify ".$eMail.".<br>n";
	}
	//attempt to close nicely anyway, if needed
        fputs ($Connection, "QUITrn");  
        fclose($Connection); 

        if ($DEBUG) echo $returnMsg;
        $Return[0] = TRUE;
        $Return[1] = TRUE;
        $Return[2] = $returnMsg;
        return $Return;
    } else {
      //connection made, but it failed to identfy itself as an SMTP server 
      //so return with an invalid address error
      $returnMsg = "Connected to ".$mailSvr.", but does not appear to be a mail server. Address verification fails.";
      //attempt to close nicely, if needed
      fputs ($Connection, "QUITrn");  
      fclose($Connection); 

      if ($DEBUG) echo $returnMsg;
      $Return[0] = FALSE;
      $Return[1] = FALSE;
      $Return[2] = $returnMsg;
      return $Return;
    }
  } else {
    // the connection failed - return with an invalid address error
    $returnMsg = "Connection to ".$mailSvr." failed. Address verification fails.";
    if ($DEBUG) echo $returnMsg;
    $Return[0] = FALSE;
    $Return[1] = FALSE;
    $Return[2] = $returnMsg;
    return $Return;
  }
}
?>