【问题标题】:How to validate email address by domain using PHP?如何使用 PHP 按域验证电子邮件地址?
【发布时间】:2017-11-02 04:20:12
【问题描述】:

我想使用 php 验证电子邮件域,因为有些用户试图使用虚拟电子邮件 ID 提交联系表单,例如:aa@bb.com

【问题讨论】:

  • 酷。去试试看,然后回来找我们。
  • 如何验证?将其与黑名单匹配?检查地址是否存在?如果格式有效?
  • 检查域名(和/或电子邮件地址)是否有效或语法正确之间存在巨大差异。您可以使用正则表达式检查语法,但这会告诉您上述电子邮件地址实际上是正确的。检查它是否有效最好通过例如向该地址发送一封确认电子邮件,其中包含可单击的链接。所以最好在之前检查语法,然后在之后使用确认电子邮件进行验证。
  • 在 Google 或 Stackoverflow 中搜索 PHP validate email regex。这个问题已经回答了很多次了。
  • @SacrumDeus 根据上述正则表达式,电子邮件 ID 有效,但域名 'bb.com' 无效,所以我正在寻找域验证,有任何解决方案

标签: php regex email dns email-validation


【解决方案1】:

尝试使用checkdnsrr 从电子邮件地址中提取域名并传递给 checkdnsrr。

如果找到域名,则返回 TRUE;如果没有域名则返回 FALSE 被发现或发生错误。

$domainname = "domain.com";

checkdnsrr($domainname , "A");

【讨论】:

  • 查看MX记录不是更好吗?域存在的事实并不意味着它可以接收电子邮件。
  • @sanjay 很高兴为您提供帮助,如果答案对您有用或对您有帮助,您可以接受。
  • @Ivar 是的 MX 更好,也有很多可用的选项,如A, MX, NS, SOA, PTR, CNAME, AAAA, A6, SRV, NAPTR, TXT
【解决方案2】:

如果您只想验证域名部分的语法,您可以在@ 上拆分电子邮件并在第二部分运行此正则表达式(在通过idn_to_ascii() 函数运行国际域名之后):

/
    ^
    (?(DEFINE)(?<part>(?:xn--)?[a-z\d](?:[a-z\d-]*[a-z\d])?))
    (?(DEFINE)(?<subpart>(?:xn--)?[a-z\d_](?:[a-z\d_-]*[a-z\d])?))
    (?:(?&subpart)\.)*
    (?&part)
    (?:\.[a-z]+|\.xn--[a-z\d]+){1,2}
    $
/xigm

https://regex101.com/library/PAKVdK

【讨论】:

  • 这仍然与“虚拟电子邮件 ID 类似:aa@bb.com”。
  • 这就是为什么它说“验证语法”,作为我对 OP 的上述评论的扩展。
  • 是的,但答案是针对问题的答案。这不是回答问题。
【解决方案3】:

您需要检查该域是否有 MX 记录。

除了正则表达式验证之外,请考虑这个脚本

https://davidwalsh.name/php-email-validator

请注意,这不会“真正”完全验证电子邮件。用户可能无效。

【讨论】:

    【解决方案4】:

    如果您不想自己完成验证的所有麻烦,只需使用 MailboxValidator 中的free API plan

    他们有一些示例代码可以帮助您进行集成。

    http://www.mailboxvalidator.com/api-single-validation

    <?php
    $apiKey = 'Enter_License_Key';
    $params['format']           = 'json';
    $params['email']     = 'Enter_Email';
    
    $query = '';
    
    foreach($params as $key=>$value){
        $query .= '&' . $key . '=' . rawurlencode($value);
    }
    
    $try = 0;
    do {
        ////////////
        //For https request, please make sure you have enabled php_openssl.dll extension.
        //
        //How to enable https
        //- Uncomment ;extension=php_openssl.dll by removing the semicolon in your php.ini, and restart the apache.
        //
        //In case you have difficulty to modify the php.ini, you can always make the http request instead of https.
        ////////////
        $result = file_get_contents('https://api.mailboxvalidator.com/v1/validation/single?key=' . $apiKey . $query);
    } while(!$result && $rty++ < 3);
    
    $data = json_decode($result);
    
    print_r($data);
    ?>
    

    【讨论】:

      猜你喜欢
      • 2011-07-05
      • 2013-12-20
      • 2014-06-07
      • 2015-06-25
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多