0

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
4

2 回答 2

1

本质上,您链接的代码获取电子邮件地址,查找与域相关的 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 中。

试试看,看看效果如何。

于 2013-06-27T10:11:55.257 回答
0

你最好忽略它,因为:

  1. smtp-validate-email 类可以接收多个电子邮件地址,其中任何一个都可以引发错误。
  2. 如果一个域存在多个 smtp 服务器(例如,gmail 地址可能会咨询多个 SMTP 服务器 - 我大约有 8 个?)只有一个人需要确认该地址的地址不会被退回(这确实是所有类检查)。

它必须在课堂本身中修复......

于 2014-12-14T06:44:53.517 回答