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中。
试试看进展如何。
您最好忽略它,因为:
- smtp验证电子邮件类可以接收多个电子邮件地址,其中任何一个都可能引发错误
- 如果一个域存在多个smtp服务器(例如,gmail地址可能会咨询多个smtp服务器-我大约有8个
它必须在类本身中固定。。。