3

我正在尝试进行电子邮件验证,但似乎无法进行。目前它会连接到域,但之后它似乎超时。有人知道为什么吗?它似乎挂在这里:

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

谁能告诉我这是为什么?我的代码如下:

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; 
}
4

1 回答 1

4
  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.

于 2013-11-12T15:05:43.587 回答