我想檢查是否存在某個電子郵件域。如果Socket.Connect失敗,我可以說域不存在嗎?
當Dns.GetHostEntry(domain)
拋出一個異常我知道確定該域不存在。
- 我可以說,如果
Dns.GetHostEntry(domain)
成功,則域名不存在,或者即使Dns.GetHostEntry(domain)
得手,這並不意味着(還)該域的存在呢? - 當
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();
}
}
}
另外請記住,將域解析爲主機記錄是不夠的(甚至可能是錯誤的)。您需要查找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 ... –