smtp验证电子邮件未捕获异常';SMTP_Validate_Email_Exception_Timeout


smtp-validate-email Uncaught exception 'SMTP_Validate_Email_Exception_Timeout'

https://github.com/zytzagoo/smtp-validate-email/blob/master/smtp-validate-email.php通过一些修改来检查邮件地址的存在


<?php
require('smtp-validate-email.php');
$from = 'removed'; // for SMTP FROM:<> command
$con = mysql_connect('localhost', 'root', '');
if (!$con)
{
    die('Could not connect: ' . mysql_error());
}
mysql_select_db('mailverf', $con);
$sql="SELECT * 
FROM  `mailvalid` where statut=0 limit 0,30";
$result = mysql_query($sql);
if($result === FALSE) {
    die(mysql_error()); 
    while($row = mysql_fetch_array($result))
    {
        $email = $row['mail'];
        $validator = new SMTP_Validate_Email($email, $from);
        $smtp_results = $validator->validate();
        $mail=str_replace(' ','',$row['mail']);
        // var_dump($smtp_results);
        if($smtp_results[$email])
        {
            $sql1="UPDATE  mailvalid SET  statut = 1 WHERE  id =".$row['id']."";
            mysql_query($sql1) or  die(mysql_error());
        }
        else
        {
            $sql2="INSERT INTO mailnonvalid (mail) VALUES ('".$row['mail']."')";
            mysql_query($sql2) or  die(mysql_error());
            $sql3="DELETE FROM mailvalid WHERE id = ".$row['id']."";
            mysql_query($sql3) or  die(mysql_error());
        }
        // var_dump($email);
        echo $row['id'].'</br>';
    } 
    $sql="SELECT * 
    FROM  `mailvalid` where statut=0 limit 0,30";
    $result = mysql_query($sql);
    if($result === FALSE) {
        die(mysql_error()); 
    }
    if($row = mysql_fetch_array($result)){
        echo '<script>window.location.reload(); </script>';}else {echo 'end';}
    }
}
?>

这很好,它工作,除了一段时间后出现这个错误消息:

Fatal error: Uncaught exception 'SMTP_Validate_Email_Exception_Timeout' with message 'Timed out in recv' in C: ' xampp ' htdocs ' verif ' smtp-validate-email.php: 626
Stack trace:
# 0 C: ' xampp ' htdocs ' verif ' smtp -validate-email.php (650) SMTP_Validate_Email-> recv (3)
# 1 C: ' xampp ' htdocs ' verif ' smtp-validate-email.php (554) SMTP_Validate_Email-> expect (Array, 3)
# 2 C: ' xampp ' htdocs ' verif ' smtp-validate-email.php (311) SMTP_Validate_Email-> rset ()
# 3 C: ' xampp ' htdocs ' verif ' index.php (28): SMTP_Validate_Email-> validate ()
# 4 {main} thrown in C: ' xampp ' htdocs ' verif ' smtp-validate-email.php on line 626

本质上,您链接到的代码获取电子邮件地址,查找与域相关的MX记录,然后连接到与该域相关的SMTP服务器,并询问电子邮件地址是否有效。

您看到当前错误,因为被请求的服务器没有响应。

这可能有几个原因,服务器可能没有启动,电子邮件地址可能是无稽之谈,域可能根本不存在。

如果是我,我会将验证封装在try-catch中,如果我捕获到"SMTP_validate_Email_Exception_Timeout"错误,那么我会将地址标记为可能不真实。过了一段时间,我会回去检查是否可以再次验证地址。

编辑

只是为了回答你下面的问题。

你可以尝试用以下代码替换while循环中的代码:

$email = $row['mail'];
$validator = new SMTP_Validate_Email($email, $from);
$emailError = false;
    try 
    {
        $smtp_results = $validator->validate();
    } 
    catch (Exception $e) 
    {
        $emailError = true;
    }
    $mail=str_replace(' ','',$row['mail']);
    // var_dump($smtp_results);
    if($smtp_results[$email] && !$emailError)
    {
        $sql1="UPDATE  mailvalid SET  statut = 1 WHERE  id =".$row['id']."";
        mysql_query($sql1) or  die(mysql_error());
    }
    else
    {
        $emailError = false;
        $sql2="INSERT INTO mailnonvalid (mail) VALUES ('".$row['mail']."')";
        mysql_query($sql2) or  die(mysql_error());
        $sql3="DELETE FROM mailvalid WHERE id = ".$row['id']."";
        mysql_query($sql3) or  die(mysql_error());
    }
    // var_dump($email);
    echo $row['id'].'</br>';

现在,如果遇到错误,它会将电子邮件地址视为不在$smtp_results中。

试试看进展如何。

您最好忽略它,因为:

  1. smtp验证电子邮件类可以接收多个电子邮件地址,其中任何一个都可能引发错误
  2. 如果一个域存在多个smtp服务器(例如,gmail地址可能会咨询多个smtp服务器-我大约有8个

它必须在类本身中固定。。。