【问题标题】:Email domain validation using DNS check in PHP在 PHP 中使用 DNS 检查的电子邮件域验证
【发布时间】:2016-10-05 16:45:46
【问题描述】:

我现在更喜欢使用 SMTP 发送批量电子邮件。在发送邮件之前,我需要检查这些邮件 ID 是否有效。我有一个代码来检查它,我在下面添加了它。它来自 Github。我只需要与您确认,通过使用此 DNS 端口检查,当检查大量无效邮件时,它是否会使我们的服务器陷入黑名单等问题?

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

如果你有更好的想法,请帮助我。

【问题讨论】:

    标签: php email github dns filter-validate-email


    【解决方案1】:

    DNS 查找不会导致列入黑名单。但是它对您的 DNS 服务的质量非常敏感 - 我最近开始使用 net_dns2 而不是 getmxrr() 因为后者不区分超时、NXDOMAIN 和其他错误(不幸的是,这里的 DNS 服务器由我们的“专家”)。

    (知道我使用 curl_multi_*() 函数来运行并发查找也可能会有所帮助 - 处理大型列表可能需要 很长时间 时间 - 描述为 here)。

    探测 MX 很可能会导致您被列入黑名单 - 作为衡量可交付性的标准,这主要是浪费时间(而且您使用的脚本显式解析每个 MX 的 IP 地址,这在性能方面有些昂贵) .此外,如果主 MX 不可用(SMTP 设计为异步),则会导致误报。

    另一种解决方案是使用bounce handler,以减少误报(以及与您描述的方法相比的误报),尽管这样做的代价是在确定时会产生一些延迟。

    我还建议(取决于处理列表所需的时间长度)您使用正则表达式预先验证电子邮件地址 - 但注意有很多 关于如何在互联网上执行此操作的不良示例

    【讨论】:

    • Ty,用于响应。我会检查的。
    猜你喜欢
    • 2019-03-12
    • 1970-01-01
    • 2016-06-01
    • 2018-02-20
    • 2018-04-15
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    相关资源
    最近更新 更多