重複真的是這樣,其可以依賴的不防彈的方式,儘管它已經存在了內歲月FINGER
協議;爲了隱私/安全/垃圾信息,在大多數系統上禁用。
因此,我們有幾種標準的方法來驗證,但沒有一個是完美的。我在.NET中看到的最常見的有以下幾種:
正則表達式:有多種模式可用於查看模式是否與RFC所說的合法地址匹配。
System.Net.Mail使用MailAddress
類來查看指定的輸入是否可以是有效的地址。這實際上做得非常好,但是,它將允許通過我們不會考慮有效地址的項目,例如沒有頂級域名。
private bool isValidEmail (string emailAddress) {
bool ReturnValue;
try {
MailAddress ma = new MailAddress(emailAddress);
ReturnValue = true;
}
catch (Exception) {
ReturnValue = false;
}
return ReturnValue;
}
但是你要找的東西需要多一點看起來。我正在閱讀的是您要驗證主機是否存在,並檢查它是否可以接受郵件。我知道有很好的辦法可以做到這一點,但是您可以使用命令行程序運行nslookup
,其類型爲MX以查看您是否獲得了可接受的回報。下面的代碼示例在這方面是不完整的,你將不得不創建一個解析函數並發展到你自己的標準。
protected static bool DnsLookup(string HostName) {
ProcessStartInfo ProcInfo = new ProcessStartInfo("cmd");
ProcInfo.UseShellExecute = false;
ProcInfo.RedirectStandardInput = true;
ProcInfo.RedirectStandardOutput = true;
ProcInfo.CreateNoWindow = true;
bool ReturnValue;
using (Process process__1 = Process.Start(ProcInfo)) {
StreamWriter sw = process__1.StandardInput;
StreamReader sr = process__1.StandardOutput;
sw.WriteLine("nslookup -type=mx " + HostName);
sw.Close();
string Result = sr.ReadToEnd();
// Parse the Result string to determine validity
// and set ReturnValue
}
return ReturnValue;
}
我會做的可能是使用上述的組合。使用MailAddress
類來查看格式是否有效,然後嘗試執行nslookup
以查看該域是否存在並且具有郵件服務器。
MailAddress
類的一個警告是,它將地址解析爲本地和域部分,並且在本地部分看起來具有內部修剪;它將在符號前立即留出一個空格;在實施之前,我通常會進行空間檢查。
可能的重複[如何檢查電子郵件地址是否存在,但不發送電子郵件?](http://stackoverflow.com/questions/565504/how-to-check-if-an-email-address-exists-不發送電子郵件) – Fruchtzwerg
@Fruchtzwerg我已經看到了這個問題,這不是它的重複;我已經問過一個具體的實現,而問題只是問如何。 – hecate
您可能會尋找類似[Dns.GetHostEntry](https://msdn.microsoft.com/en-us/library/ms143998(v = vs.110).aspx)的內容。確保你完全閱讀它的文檔,看看它是否真的符合你的需求(注意GetHostEntry只會返回A記錄......) – elgonzo