在PHP中使用DNS检查进行电子邮件域验证
我现在更喜欢使用SMTP发送大量电子邮件。在发送邮件之前,我需要检查这些邮件id是否有效。我有一个代码来检查它&我在下面添加了它。它来自Github。我只需要与您确认,通过使用此DNS端口检查,是否会使我们的服务器在检查大量无效邮件时陷入黑名单等问题在PHP中使用DNS检查进行电子邮件域验证,php,email,github,dns,filter-validate-email,Php,Email,Github,Dns,Filter Validate Email,我现在更喜欢使用SMTP发送大量电子邮件。在发送邮件之前,我需要检查这些邮件id是否有效。我有一个代码来检查它&我在下面添加了它。它来自Github。我只需要与您确认,通过使用此DNS端口检查,是否会使我们的服务器在检查大量无效邮件时陷入黑名单等问题 <?php function verifyEmail($toemail, $fromemail, $getdetails = false){ $email_arr = explode("@", $toemail); $doma
<?php
function verifyEmail($toemail, $fromemail, $getdetails = false){
$email_arr = explode("@", $toemail);
$domain = array_slice($email_arr, -1);
$domain = $domain[0];
// Trim [ and ] from beginning and end of domain string, respectively
$domain = ltrim($domain, "[");
$domain = rtrim($domain, "]");
if( "IPv6:" == substr($domain, 0, strlen("IPv6:")) ) {
$domain = substr($domain, strlen("IPv6") + 1);
}
$mxhosts = array();
if( filter_var($domain, FILTER_VALIDATE_IP) )
$mx_ip = $domain;
else
getmxrr($domain, $mxhosts, $mxweight);
if(!empty($mxhosts) )
$mx_ip = $mxhosts[array_search(min($mxweight), $mxhosts)];
else {
if( filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) ) {
$record_a = dns_get_record($domain, DNS_A);
}
elseif( filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) ) {
$record_a = dns_get_record($domain, DNS_AAAA);
}
if( !empty($record_a) )
$mx_ip = $record_a[0]['ip'];
else {
$result = "invalid";
$details .= "No suitable MX records found.";
return ( (true == $getdetails) ? array($result, $details) : $result );
}
}
$connect = @fsockopen($mx_ip, 25);
if($connect){
if(preg_match("/^220/i", $out = fgets($connect, 1024))){
fputs ($connect , "HELO $mx_ip\r\n");
$out = fgets ($connect, 1024);
$details .= $out."\n";
fputs ($connect , "MAIL FROM: <$fromemail>\r\n");
$from = fgets ($connect, 1024);
$details .= $from."\n";
fputs ($connect , "RCPT TO: <$toemail>\r\n");
$to = fgets ($connect, 1024);
$details .= $to."\n";
fputs ($connect , "QUIT");
fclose($connect);
if(!preg_match("/^250/i", $from) || !preg_match("/^250/i", $to)){
$result = "invalid";
}
else{
$result = "valid";
}
}
}
else{
$result = "invalid";
$details .= "Could not connect to server";
}
if($getdetails){
return array($result, $details);
}
else{
return $result;
}
}
?>
如果您有更好的想法,请帮助我。DNS查找不会导致黑名单。但是,它对DNS服务的质量非常敏感-我最近开始使用而不是getmxrr(),因为后者没有区分超时、NXDOMAIN和其他错误(不幸的是,这里的DNS服务器是由我们的“专家”配置的) (知道我使用curl_multi_*()函数来运行并发查找可能也会很有帮助——处理一个大列表可能需要很长时间——如上所述) 探测MX很可能会导致您被列入黑名单,而作为可交付性的衡量标准,这主要是浪费时间(而且您使用的脚本会显式解析每个MX的IP地址,在性能方面有些昂贵)。此外,如果主MX不可用(SMTP设计为异步),则会导致误报 另一种解决方案是,减少误报(与您描述的方法相比,减少误报)是使用a,尽管这会以确定过程中的一些延迟为代价
我还建议(取决于处理列表所需的时间长短)您使用正则表达式预先验证电子邮件地址-但是要小心,在互联网上有很多这样做的坏例子。DNS查找不会导致黑名单。但是,它对DNS服务的质量非常敏感-我最近开始使用而不是getmxrr(),因为后者没有区分超时、NXDOMAIN和其他错误(不幸的是,这里的DNS服务器是由我们的“专家”配置的) (知道我使用curl_multi_*()函数来运行并发查找可能也会很有帮助——处理一个大列表可能需要很长时间——如上所述) 探测MX很可能会导致您被列入黑名单,而作为可交付性的衡量标准,这主要是浪费时间(而且您使用的脚本会显式解析每个MX的IP地址,在性能方面有些昂贵)。此外,如果主MX不可用(SMTP设计为异步),则会导致误报 另一种解决方案是,减少误报(与您描述的方法相比,减少误报)是使用a,尽管这会以确定过程中的一些延迟为代价
我还建议(取决于处理列表所需的时间长度)您使用正则表达式预先验证电子邮件地址-但是要小心,在互联网上有很多关于如何执行此操作的坏例子。Ty,请回答。我会查一查的。泰,有什么反应。我会检查的。