代码之家  ›  专栏  ›  技术社区  ›  Question Mark

使用MX记录验证电子邮件地址

  •  14
  • Question Mark  · 技术社区  · 14 年前


    我的web应用程序上有一个联系人表单,它收到很多垃圾邮件。
    ^.+@.+\..+$
    我正在使用垃圾邮件过滤服务(defensio),但返回的垃圾邮件分数与有效邮件重叠。当阈值为0.4时,一些垃圾邮件会通过,一些客户的问题会错误地抛出到日志中,并显示错误。

    提议: 使用php的 checkdnsrr(preg_replace(/^.+?@/, '', $_POST['email']), 'MX') 若要检查电子邮件域是否解析为有效地址,请登录到文件,然后针对未解析的邮件重定向并显示错误,对于根据解决方案解析的地址,请像以前一样转到垃圾邮件筛选器服务 checkdnsrr() .

    我已经读到(我自己对此表示怀疑)您不应该将这种类型的验证留给远程查找,但为什么?


    是否存在无法解析的地址类型?政府地址?ip电子邮件地址?

    解决方案: 三个答案的组合(希望我能接受不止一个作为复合答案)。

    $email_domain = preg_replace('/^.+?@/', '', $email).'.';
    if(!checkdnsrr($email_domain, 'MX') && !checkdnsrr($email_domain, 'A')){
       //validation error
    }
    

    所有垃圾邮件都将被记录和轮换。 以便以后升级到作业队列。

    有人评论说,要求邮件服务器让用户验证,我觉得这会造成太多流量,可能会导致我的服务器被禁止或在某种程度上陷入麻烦,这只是为了删掉大部分由于服务器地址无效而被退回的邮件。

    http://en.wikipedia.org/wiki/Fqdn

    RFC2821
    The lookup first attempts to locate an MX record associated with the name.
    If a CNAME record is found instead, the resulting name is processed as if 
    it were the initial name.
    If no MX records are found, but an A RR is found, the A RR is treated as
    if it was associated with an implicit MX RR, with a preference of 0,
    pointing to that host.  If one or more MX RRs are found for a given
    name, SMTP systems MUST NOT utilize any A RRs associated with that
    name unless they are located using the MX RRs; the "implicit MX" rule
    above applies only if there are no MX records present.  If MX records
    are present, but none of them are usable, this situation MUST be
    reported as an error.
    

    4 回复  |  直到 14 年前
        1
  •  5
  •   Alix Axel    14 年前

    我认为使用 checkdnsrr() 而且我也不知道假阳性是怎么出现的。您不需要转义主机名,事实上,您可以使用此技术,并通过与MTA交谈和测试用户是否存在于给定主机上来进一步了解此技术(但是,此技术可能会并且可能会在某些主机中导致误报)。

        2
  •  5
  •   bradym    14 年前

    如果我站在你的立场,我会测试一下,看看效果如何。在一周左右的时间里,将所有电子邮件记录到一个数据库或日志文件中,并包含一个字段,以指示它是否会被标记为垃圾邮件或合法电子邮件。一周结束后,看看结果,看看它是否如你预期的那样。

    采用这种日志记录/测试方法,您可以灵活地进行测试,而不用担心丢失客户电子邮件。

    我已经习惯于在我的表单中添加一个用CSS隐藏的额外字段,如果它被填充,我假设它是由垃圾邮件机器人提交的。我还确保使用像“url”或“website\u url”这样的名称,这些名称对于垃圾邮件机器人来说似乎是合法的域名。为字段添加一个标签,上面写着“不要填写此字段”,这样,如果有人的浏览器没有正确呈现,他们就会知道不要填写垃圾邮件字段。到目前为止,它对我很有效。

        3
  •  3
  •   Prabhu    10 年前
    function mxrecordValidate($email){
            list($user, $domain) = explode('@', $email);
            $arr= dns_get_record($domain,DNS_MX);
            if($arr[0]['host']==$domain&&!empty($arr[0]['target'])){
                    return $arr[0]['target'];
            }
    }
    $email= 'user@radiffmail.com';
    
    if(mxrecordValidate($email)) {
            echo('This MX records exists; I will accept this email as valid.');
    }
    else {
            echo('No MX record exists;  Invalid email.');
    }
    
        4
  •  0
  •   Walter White Walter White    14 年前

    MX查找只是图片的一部分,如果您想确保电子邮件地址本身有效,则需要尝试向该帐户发送电子邮件。

    另一种可能的情况是,不管怎样,有人可以简单地使用来自受损机器的被劫持电子邮件帐户。当然,这种情况发生的可能性可能会小一些,但它仍然会发生。

    有一些电子邮件地址验证库可以做到这一点,只需搜索电子邮件验证。

    所有这些都可以异步完成。我在我的网站上有这样的设置,在这种情况下,电子邮件保存在数据库中(用于审核),作业排队,然后当作业开始执行时,在该时间点执行任何附加验证。它将重物卸到另一个线程上。

    对于用户来说,似乎电子邮件已经发送了,它已经发送了(在数据库中),并且可以在内部查看,但是实际的电子邮件在作业执行之前不会被发送出去,这可以是立即发送,也可以是某个设定的时间量,具体取决于服务器负载。

    沃尔特

        5
  •  0
  •   Question Mark    5 年前
    //The Code *https://davidwalsh.name/php-email-validator*  
    function domain_exists($email, $record = 'MX'){
        list($user, $domain) = split('@', $email);
        return checkdnsrr($domain, $record);
    }
    
    if(domain_exists('user@davidwalsh.name')) {
        echo('This MX records exists; I will accept this email as valid.');
    } else {
        echo('No MX record exists;  Invalid email.');
    }