Question

I'm trying to do email verification and I can't seem to get it going. At present it would make the connection to the domain but after that it seems to time out. Does anyone know why this is? It seems to be hanging here:

$res=fgets($connection, "EHLO $mydomain\n");

Would anyone be able to inform me as to why this is? My code is below:

if(isset($_POST['email']) && filter_var($_POST['email'], FILTER_VALIDATE_EMAIL))

{

 // Could get this from the php ini? 
  $from="xxxx@xxxx-int.net";
 $to=$_POST['email'];
 $subject="Test";
 $message="Testing";
 list($me,$mydomain) = split("@",$from); 

 // Now look up the mail exchangers for the recipient 
 list($user,$domain) = split("@",$to,2); 
 if(getmxrr($domain,$mx,$weight) == 0)  return FALSE; 

 // Try them in order of lowest weight first 
 array_multisort($mx,$weight); 
 $success=0; 

 foreach($mx as $host) { 
  // Open an SMTP connection 
  $connection = fsockopen ($host, 25, $errno, $errstr, 1); 
  if (!$connection) 
    continue; 
  $res=fgets($connection); 
echo $res;
  if(substr($res,0,3) != "220") echo $res;

  // Introduce ourselves 
  fputs($connection, "EHLO $mydomain\n"); 
  $res=fgets($connection); 
echo $res;
  if(substr($res,0,3) != "250") echo $res; 

  // Envelope from 
  fputs($connection, "MAIL FROM: $from\n"); 
  $res=fgets($connection); 
echo $res; 
  if(substr($res,0,3) != "250") echo $res; 

  // Envelope to 
  fputs($connection, "RCPT TO: $to\n"); 
  $res=fgets($connection); 
echo $res; 
  if(substr($res,0,3) != "250") echo $res;

  // The message 
  fputs($connection, "DATA\n"); 
  $res=fgets($connection); 
echo $res; 
  if(substr($res,0,3) != "354") echo $res;

  // Send To:, From:, Subject:, other headers, blank line, message, and finish 
  // with a period on its own line. 
  fputs($connection, "To: $to\nFrom: $from\nSubject: $subject\n$message\n.\n"); 
  $res=fgets($connection); 
echo $res; 
  if(substr($res,0,3) != "250") echo $res;

  // Say bye bye 
  fputs($connection,"QUIT\n"); 
  $res=fgets($connection); 
echo $res; 
  if(substr($res,0,3) != "221") echo $res;

  // It worked! So break out of the loop which tries all the mail exchangers. 
  $success=1; 
  break; 
 } 
 // Debug for if we fall over - uncomment as desired 
 // print $success?"Mail sent":"Failure: $res\n"; 
 if($connection) { 
  if($success==0) fputs($connection, "QUIT\n"); 
  fclose ($connection); 
 } 
 return $success?TRUE:FALSE; 
}
Was it helpful?

Solution

  fputs($connection, "EHLO $mydomain\n"); 

you only send line feeds at the end, but smtp rfc requires CRLF. This causes your script to "hang" because the email server will not respond to your invalid line ending. you'd have to change this to

  fputs($connection, "EHLO $mydomain\r\n");

etc.

Please note that email validation will NOT WORK in many cases, even if you get your script to talk RFC compliant SMTP. Many servers simply accept (and later bounce) all messages to invalid recipients. Others do recipient verification at the data stage instead of rcpt to (exchange 2013..sigh) etc etc.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top