dongxian3574 2013-11-12 14:27
浏览 403
已采纳

使用PHP EHLO进行SMTP验证

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
");

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
"); 
  $res=fgets($connection); 
echo $res;
  if(substr($res,0,3) != "250") echo $res; 

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

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

  // The message 
  fputs($connection, "DATA
"); 
  $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
From: $from
Subject: $subject
$message
.
"); 
  $res=fgets($connection); 
echo $res; 
  if(substr($res,0,3) != "250") echo $res;

  // Say bye bye 
  fputs($connection,"QUIT
"); 
  $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
"; 
 if($connection) { 
  if($success==0) fputs($connection, "QUIT
"); 
  fclose ($connection); 
 } 
 return $success?TRUE:FALSE; 
}
  • 写回答

1条回答 默认 最新

  • dongxian6653 2013-11-12 15:05
    关注
      fputs($connection, "EHLO $mydomain
    "); 
    

    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
    ");
    

    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.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!