2014-06-25 111 views
1

我的一位客戶抱怨說,與filter_var()和期權FILTER_VALIDATE_EMAIL的電子郵件地址,如:多久有TLD必須至少

[email protected] 

被接受。所以我現在的問題是:頂級域名至少有多久?我的意思是我們知道.com.org.us。但據我所知,TLD如.g.a並不存在。

進一步的問題是:

  • 難道他們甚至還存在?
  • 它們是否已存在於現實世界(WWW)中?
  • 有一天,某個「一個字符」頂級域名有可能存在於WWW中?
+0

'foo @ bar'也是一個有效的地址!如果我從我的位置發送給它,它可能無法解決,但它可能會在某些Intranet內部解決。 – deceze

回答

2

我會做別的事情:檢查域是否可以解析,是否有MX記錄。如果沒有域名不能收到電子郵件,您可以拒絕該電子郵件地址。

還請檢查getmxrr()函數,並且不要忘記也稱爲idn或punycode域的umlautdomains用於那個idn_to_ascii()。下面是一個簡單的示例腳本:

$parts = explode('@', $email); 
if(!getmxrr(idn_to_ascii($parts[1]))) { 
    echo 'Reject email address'; 
} 
+0

這是對這一切最具體和最乾淨的解決方案。 Thx爲您的答案。 – TiMESPLiNTER

4

爲避免實現可能無法反映所有有效域名的算法,您可以在域名上使用checkdnsrr函數。

喜歡的東西:

$parts = explode('@', $email); 
$domain = $parts[1]; 
if (!checkdnsrr($domain)) { 
    echo 'Invalid domain'; 
} 
+0

Thx爲您的答案。我將建立一個方法'validateEmail($ email,$ checkDns = true){}',這樣我就可以開始DNS檢查,如果我永遠不需要的話。 – TiMESPLiNTER

+2

請注意,這取決於您的DNS解析器的可用性,例如,如果DNS服務器或者intarwebs出現問題,可能會突然暫時拒絕電子郵件。儘管如此,仍是最佳解決方 – deceze

相關問題