2012-05-03 33 views
0

我想檢查是否存在某個電子郵件域。如果Socket.Connect失敗,我可以說域不存在嗎?

Dns.GetHostEntry(domain)拋出一個異常我知道確定該域不存在。

  1. 我可以說,如果Dns.GetHostEntry(domain)成功,則域名不存在,或者即使Dns.GetHostEntry(domain)得手,這並不意味着(還)該域的存在呢?
  2. s.Connect無法連接時,我可以說相同嗎?我的意思是如果連接拋出異常,我可以說,這樣的域名不存在?

如果(1)爲真,那麼爲了檢查域是否存在(1)就足夠了吧?

public static bool Lookup(string domain) 
{ 
    if (domain == null) throw new ArgumentNullException("domain"); 

    try { 
     IPHostEntry ipHost = Dns.GetHostEntry(domain); 
     var endPoint = new IPEndPoint(ipHost.AddressList[0], _dnsPort); 

     return Transfer(endPoint); 
    } 
    catch (SocketException ex) 
    { 
      ++attempts; 
    } 
    return false; 
} 
public static bool Transfer(IPEndPoint endPoint) 
{ 
    int attempts = 0; 
    while(attempts <= _attempts) 
    {        
     try 
     { 
      var s = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 
      s.Connect(endPoint); 
     } 
     catch (SocketException ex) 
     { 
      ++attempts; 
     } 
     finally 
     { 
      s.Close(); 
     } 
    } 
} 

回答

2

當試圖與插座連接你說的幾件事情:

  • 沒有從我的機器到目標計算機的網絡路徑
  • 網絡路徑是明確的防火牆和其他限制
  • 目標機器在目標端口上託管服務
  • 目標機器正在接受目標服務上的連接

所有這些都發生在之後主機名已被解析爲IP。

所以你的問題的答案是沒有。如果Socket.Connect失敗,則可能是域不存在,或者上述任何原因(也許更多)。

+0

另外請記住,將域解析爲主機記錄是不夠的(甚至可能是錯誤的)。您需要查找MX記錄。 >設置類型= MX > gmail.com 服務器: 地址: 非權威的答案: gmail.com MX偏好= 5,郵件交換器= gmail-smtp-in.l.google.com 的Gmail .com MX首選項= 10,郵件交換器= alt1.gmail-smtp-in.l.google.com gmail.com MX首選項= 20,郵件交換器= alt2.gmail-smtp-in.l.google.com gmail .com MX首選項= 30,郵件交換器= alt3.gmail-smtp-in.l.google.com ... –

0

經過一番研究,我發現檢查mx記錄對dns會告訴我,如果域可以接收電子郵件或沒有。如果DNS服務器確實返回該域的mx記錄,則僅表示該域可以接收電子郵件。如果沒有返回mx記錄,那麼域不能接收電子郵件==這樣的域不存在

相關問題