验证电子邮件域 [重复]

Posted

技术标签:

【中文标题】验证电子邮件域 [重复]【英文标题】:Validate E-mail Domains [duplicate] 【发布时间】:2013-02-12 10:53:00 【问题描述】:

我想验证电子邮件域,但我不想担心可能出现的任何子域。

例如:

@abc.com
@a.abc.com
@b.abc.com
...

这些都应该是有效的。

另外,我有一个要验证的域列表,例如 abc.com、xyz.com...从列表中验证电子邮件域(包括子域)的最佳方法是什么?

谢谢。

【问题讨论】:

【参考方案1】:

我决定将其重写为更友好,这样您就不会受限于您列入白名单的域方案类型。

$whitelist = array("abc.com", "xyz.com", "specific.subdomain.com", "really.specific.subdomain.com"); //You can add basically whatever you want here because it checks for one of these strings to be at the end of the $email string.
$email = "@d.xyz.com";

function validateEmailDomain($email, $domains) 
    foreach ($domains as $domain) 
        $pos = strpos($email, $domain, strlen($email) - strlen($domain));

        if ($pos === false)
            continue;

        if ($pos == 0 || $email[(int) $pos - 1] == "@" || $email[(int) $pos - 1] == ".")
            return true;
    

    return false;

所以,你可以这样使用:

if (validateEmailDomain($email, $whitelist))
    //Do something.

【讨论】:

这里只是有问题。如果我在 $email 上输入“ABCxyz.com”,它将接受它。 好的,我可以解决这个问题。 @user1893187 我按照你的意愿编辑了它。 @crush 我尝试了这个解决方案,但是当域不在白名单中时,我收到了Offset not contained in string 警告。任何想法如何解决这个问题?【参考方案2】:

您还可以使用 dns 验证域:

function validEmail($email)

    $allowedDomains = array('abc.com');
    list($user, $domain) = explode('@', $email);
    if (checkdnsrr($domain, 'MX') && in_array($domain, $allowedDomains))
    
        return true;
    
    return false;

【讨论】:

你不能简单地在@上爆炸。因为本地部分允许使用转义的@。见RFC 5322。【参考方案3】:

我不久前写了这个函数。它可能满足您正在寻找的要求。它做了两件事,验证电子邮件地址是有效地址,然后根据 DNS 中的 MX 记录验证域名是否是有效名称。

function validate_email($email) 
    // Check email syntax
    if(preg_match('/^([a-zA-Z0-9\._\+-]+)\@((\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]2,7|[0-9]1,3)(\]?))$/', $email, $matches)) 
        $user = $matches[1];
        $domain = $matches[2];

        // Check availability of DNS MX records
        if(getmxrr($domain, $mxhosts, $mxweight)) 
            for($i=0;$i<count($mxhosts);$i++)
                $mxs[$mxhosts[$i]] = $mxweight[$i];
            

            // Sort the records
            asort($mxs);
            $mailers = array_keys($mxs);
         elseif(checkdnsrr($domain, 'A')) 
            $mailers[0] = gethostbyname($domain);
         else 
            $mailers = array();
        
        $total = count($mailers);

        // Added to still catch domains with no MX records
        if($total == 0 || !$total) 
            $error = "No MX record found for the domain.";
        
     else 
        $error = "Address syntax not correct.";
    

    return ($error ? $error : TRUE);

【讨论】:

【参考方案4】:

我写了一个简单的正则表达式示例,能够检查域列表。

    <?php

    $email = 'shagtv@a.xyz.com';

    $domains = array('abc.com', 'xyz.com');

    $pattern = "/^[a-z0-9._%+-]+@[a-z0-9.-]*(" . implode('|', $domains) . ")$/i";

    if (preg_match($pattern, $email)) 
        echo 'valid';
     else 
        echo 'not valid';
    
    ?>

【讨论】:

它接受带有额外字符的电子邮件,例如 ABCxyz.com,因为其中包含 xyz.com。我需要它只接受列表中的电子邮件。 试试这个 $pattern = "/^[a-z0-9._%+-]+@([a-z0-9.-]+.)*(" . implode(' |', $domains) . ")$/i";【参考方案5】:

你应该使用这样的代码:

<?php
$subject = "abcdef";
$pattern = '/^def/';
preg_match($pattern, substr($subject,3), $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
?>

或者这个:

<?php
$email = "someone@exa mple.com";

if(!filter_var($email, FILTER_VALIDATE_EMAIL))
  
  echo "E-mail is not valid";
  
else
  
      echo "E-mail is valid";
  
?>

或this that you have to do a little modify 和this page。

希望对你有帮助!

【讨论】:

【参考方案6】:

和这个帖子很像:PHP Check domain of email being registered is a 'school.edu' address

但是,您需要更进一步。一旦你有了那个拆分,看看 parse_url http://php.net/manual/en/function.parse-url.php 并获取 HOST 部分。

【讨论】:

以上是关于验证电子邮件域 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

电子邮件验证是不是需要域部分包含一个点?

基于域的电子邮件地址验证

用户验证下降百分比

如何将 AWS SES 电子邮件发送到已验证的同一域

在 iOS 的电子邮件中验证域中的字符数?

发送电子邮件时,Amazon SES(沙盒外和域验证)失败