PHP script to test the validity of email addresses

December 2016

Issue


I wonder if there is a PHP solution (or other) to test the validity of an email address?

Solution


Try this:
function validate_email($email){
   $mailparts=explode("@",$email);
   $hostname = $mailparts[1];

   // validate email address syntax
   $exp = "^[a-z\'0-9]+([._-][a-z\'0-9]+)*@([a-z0-9]+([._-][a-z0-9]+))+$";
   $b_valid_syntax=eregi($exp, $email);

   // get mx addresses by getmxrr
   $b_mx_avail=getmxrr( $hostname, $mx_records, $mx_weight );
   $b_server_found=0;

   if($b_valid_syntax && $b_mx_avail){
     // copy mx records and weight into array $mxs
     $mxs=array();


     for($i=0;$i<count($mx_records);$i++){
     $em1 = array_pop($mx_weight);
     $em2 = array_pop($mx_records);
       $mxs[$em1]=$em2;
     }

     // sort array mxs to get servers with highest prio
     ksort ($mxs, SORT_NUMERIC );
     reset ($mxs);

     while (list ($mx_weight, $mx_host) = each ($mxs) ) {
       if($b_server_found == 0){

         //try connection on port 25
         $fp = @fsockopen($mx_host,25, $errno, $errstr, 2);
         if($fp){
           $ms_resp="";
           // say HELO to mailserver
           $ms_resp.=send_command($fp, "HELO microsoft.com");

           // initialize sending mail
           $ms_resp.=send_command($fp, "MAIL FROM:<support@microsoft.com>");

           // try receipent address, will return 250 when ok..
           $rcpt_text=send_command($fp, "RCPT TO:<".$email.">");
           $ms_resp.=$rcpt_text;
          
           if(substr( $rcpt_text, 0, 3) == "250")
             $b_server_found=1;

           // quit mail server connection
           $ms_resp.=send_command($fp, "QUIT");

         fclose($fp);

         }

       }
   }
  }
  return $b_server_found;
}

function send_command($fp, $out){

  fwrite($fp, $out . "\r\n");
  return get_data($fp);
}

function get_data($fp){
  $s="";
  stream_set_timeout($fp, 2);

  for($i=0;$i<2;$i++)
   $s.=fgets($fp, 1024);

  return $s;
}

// support windows platforms
if (!function_exists ('getmxrr') ) {
  function getmxrr($hostname, &$mxhosts, &$mxweight) {
   if (!is_array ($mxhosts) ) {
     $mxhosts = array ();
   }

   if (!empty ($hostname) ) {
     $output = "";
     @exec ("nslookup.exe -type=MX $hostname.", $output);
     $imx=-1;

     foreach ($output as $line) {
       $imx++;
       $parts = "";
       if (preg_match ("/^$hostname\tMX preference = ([0-9]+), mail exchanger = (.*)$/", $line, $parts) ) {
         $mxweight[$imx] = $parts[1];
         $mxhosts[$imx] = $parts[2];
       }
     }
     return ($imx!=-1);
   }
   return false;
  }
}


et l'appelle toujours :
Function ControleContact($email,$nomorganization,$service,$fonction){
	$msg="";
  $email = trim($email);  
	if(empty($nomorganization)):
		$msg .= "Le champs <B>Nom de l'organization</B> est obligatoire<BR>";
	endif;
	if(!is_string($nomorganization))
		$msg .= "Le champs <B>Nom de l'organization</B> doit être une chaine de caractére<BR>";
	if(empty($service))
		$msg .= "Au moins une case <B>service</B> doit être cochée<BR>";
	if(empty($fonction))
		$msg .= "Une <B>fonction</B> doit être séléctionnée<BR>";
	if(empty($email))
    $msg .="Le champ <B>email</B> est obligatoire<BR>";
  elseif(!ereg("^(.+)@(.+)\\.(.+)$",$email))
    $msg .="Le champ <B>email</B> est obligatoire 22<BR>";
  elseif(validate_email($email) == 0) {
    echo 'Invalid email address!';
    $msg .='Invalid email address!';
    }
  else {
     echo 'Email address is valid';
    }    
	return ($msg);
}




Thanks to P@ for this tip.

Related :

This document entitled « PHP script to test the validity of email addresses » from CCM (ccm.net) is made available under the Creative Commons license. You can copy, modify copies of this page, under the conditions stipulated by the license, as this note appears clearly.