我可以使用.net检查是否存在电子邮件地址吗?

我见过一些php示例,说明如何ping收件箱(不向其发送任何邮件)以检查它是否存在。 我想知道是否有人知道这是否可能与.net? 如果我打算写一个应用程序来对我通过我的网站捕获的电子邮件列表进行批量检查。

SMTP为此定义了VRFY命令 ,但由于垃圾邮件发送者的滥用完全淹没了合法使用的数量,因此世界上几乎每个电子邮件服务器都配置为谎言 。

不,原则上不可能检查是否存在电子邮件 – 与语言无关。 没有协议可以做到这一点。

有一些部分解决方案,但它们都不可靠。

请参阅如何检查电子邮件地址是否存在而不发送电子邮件? 详情。

如果你写“查收邮件”,你的意思是什么? 如果没有为电子邮件所有者发送一些唯一链接,则无法检查此信息,您只能检查电子邮件的语法以及与smtp的连接。

 public static bool isEmail(string inputEmail) { inputEmail = NulltoString(inputEmail); string strRegex = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" + @"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" + @".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"; Regex re = new Regex(strRegex); if (re.IsMatch(inputEmail)) return (true); else return (false); } 

smtp检查

 string[] host = (address.Split('@')); string hostname = host[1]; IPHostEntry IPhst = Dns.Resolve(hostname); IPEndPoint endPt = new IPEndPoint(IPhst.AddressList[0], 25); Socket s= new Socket(endPt.AddressFamily, SocketType.Stream,ProtocolType.Tcp); s.Connect(endPt); 

http://www.codicode.com/art/free_asp_net_email_validator_verifier.aspx 。 使用代码的dll引用。 它对个人使用和再分配都是免费的。 它检查域名是否存在而不实际发送电子邮件。

这不是万无一失的。 您可以做的最好的事情是检查语法并查看域名是否解析。

电子邮件语法RegEx: (?#?[_a-zA-Z0-9-+]+(\.[_a-zA-Z0-9-+]+)*)@(?[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.(([0-9]{1,3})|([a-zA-Z]{2,3})|(aero|arpa|asia|coop|info|jobs|mobi|museum|name|travel)))

 protected bool checkDNS(string host, string recType = "MX") { bool result = false; try { using (Process proc = new Process()) { proc.StartInfo.FileName = "nslookup"; proc.StartInfo.Arguments = string.Format("-type={0} {1}", recType, host); proc.StartInfo.CreateNoWindow = true; proc.StartInfo.ErrorDialog = false; proc.StartInfo.RedirectStandardError = true; proc.StartInfo.RedirectStandardOutput = true; proc.StartInfo.UseShellExecute = false; proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; proc.OutputDataReceived += (object sender, DataReceivedEventArgs e) => { if ((e.Data != null) && (!result)) result = e.Data.StartsWith(host); }; proc.ErrorDataReceived += (object sender, DataReceivedEventArgs e) => { if (e.Data != null) { //read error output here, not sure what for? } }; proc.Start(); proc.BeginErrorReadLine(); proc.BeginOutputReadLine(); proc.WaitForExit(30000); //timeout after 30 seconds. } } catch { result = false; } return result; }