2013-06-27 2 views
0

https://github.com/zytzagoo/smtp-validate-email/blob/master/smtp-validate-email.php проверить наличие адресов электронной почты с некоторыми модификациямиSMTP-Validate-почта Uncaught исключение 'SMTP_Validate_Email_Exception_Timeout'


<?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 

ответ

1

По существу код, который у вас есть l подписывается на адрес электронной почты, просматривает записи MX, относящиеся к домену, а затем подключается к SMTP-серверу, связанному с этим доменом, и спрашивает, действительно ли адрес электронной почты.

Вы видите текущую ошибку, так как запрашиваемый сервер не отвечает.

Может быть несколько причин для этого, возможно, сервер не может быть, адрес электронной почты может быть вздорным, и домен может вообще не существовать.

Если бы это был я, я бы обернул проверку в попытке поймать, и если бы я поймал ошибку «SMTP_Validate_Email_Exception_Timeout», я бы обозначил адрес как потенциально не реальный. Затем через некоторое время я вернусь и проверю, могу ли я снова подтвердить адрес.

EDIT

Просто, чтобы ответить на ваш вопрос ниже.

Вы можете попробовать заменить код, который вы имеете в своем цикле в то время как с этим:

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

Попробуйте и посмотрите, как это происходит.

+0

возможно, что при обнаружении этой ошибки, удалить этот адрес электронной почты и непрерывный анализ – user2516844

+0

Проверьте выше и посмотреть, если это нормально – Jerryf

+0

да это это хорошо работает спасибо – user2516844

0

Вы лучше игнорировать его, потому что:

  1. SMTP,-Validate-электронный класс может принимать несколько адресов электронной почты и любой из них может поднимать ошибку.
  2. Если для домена существует несколько серверов smtp (адреса gmail, например, могут обращаться к нескольким SMTP-серверам - я обойти 8?), Только один должен подтвердить адрес для этого адреса, который нельзя отскочить (это все класс ДЕЙСТВИТЕЛЬНО проверяет).

Он должен быть зафиксирован в самом классе ...