2013-02-26 111 views
1

我想驗證電子郵件域名,但我不想擔心任何可能出現的子域名。驗證電子郵件域名

例如:

@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. 
+0

這裏只是一個問題。如果我在$ email上輸入「ABCxyz.com」,它會接受它。 – user1893187 2013-02-26 20:47:38

+0

好的,我可以解決這個問題。 – crush 2013-02-26 20:48:42

+0

@ user1893187我編輯它就可以隨心所欲。 – crush 2013-02-26 21:00:19

0

那麼你應該使用一些像這樣的代碼:

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

或本:

<?php 
$email = "[email protected] 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 modifythis page

希望它能幫助!

1

我後來寫了這個函數。它可能會滿足你要找的東西的要求。它做了兩件事,驗證電子郵件地址是一個有效的地址,然後驗證該域名是否是針對它在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); 
} 
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; 
} 
+0

你不能簡單地在'@'上爆炸。因爲本地部分允許使用轉義的「@」。參見[RFC 5322](http://tools.ietf.org/html/rfc5322)。 – PeeHaa 2013-04-24 18:19:17

1

我寫的正則表達式的一個簡單的例子與檢查域列表的能力。

<?php 

    $email = '[email protected]'; 

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

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

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

它接受帶有額外字符的電子郵件,如ABCxyz.com,因爲其中包含xyz.com。我需要它只接受名單上的電子郵件。 – user1893187 2013-02-26 20:48:33

+0

試試這個 $ pattern =「/^[a-z0-9 ._%+ - ] + @([a-z0-9 .-] +。)*(」。implode('|',$ domains) 。「)$/i」; – 2013-02-26 20:55:22