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

Posted

技术标签:

【中文标题】我可以使用 .net 检查电子邮件地址是不是存在吗?【英文标题】:Can I check if an email address exists using .net?我可以使用 .net 检查电子邮件地址是否存在吗? 【发布时间】:2011-04-22 11:05:50 【问题描述】:

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

【问题讨论】:

不仅在 .NET 中不可能,而且在远程根本不可能。 How to check if an email address exists without sending an email? 的可能重复项 @Daniel,我认为这就是 phil “我看过一些 php 示例”的意思,这个问题是关于 .NET 的。当然,无论语言如何,“没有可靠的方法”是正确的答案。 一些与本主题相关的内容 - codinghorror.com/blog/2010/04/… 【参考方案1】:

如果你写“检查电子邮件”是什么意思?如果不为电子邮件所有者发送一些唯一链接,您将无法检查这一点,您只能检查电子邮件的语法以及与 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);

【讨论】:

检查我的答案以获得更准确的语法检查。 NulltoString 是从哪里来的? 它只检查主机是否存在而不是电子邮件收件箱存在。【参考方案2】:

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

电子邮件语法正则表达式: (?<username>#?[_a-zA-Z0-9-+]+(\.[_a-zA-Z0-9-+]+)*)@(?<domain>[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)))

【讨论】:

好吧,我没有记错,但这可能是因为该问题专门要求解决 ping 服务器,而不是检查语法。也许在你回答之后问题就变了。【参考方案3】:

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

有一些部分解决方案,但没有一个是可靠的。

详情请见How to check if an email address exists without sending an email?。

【讨论】:

【参考方案4】:

SMTP defines the VRFY command for this,但由于垃圾邮件发送者的滥用完全超过了合法使用的数量,因此世界上几乎每个电子邮件服务器都是configured to lie。

【讨论】:

+1 用于解释为什么没有可靠的方法来做 OP 想要的事情。就个人而言,任何使批量电子邮件变得更加困难的事情无疑都是一件好事。 @Joel:嗯,有 合法的群发邮件(邮件列表等)。但确实大多数大宗邮件都是非法的,尽管这很可悲。【参考方案5】:
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;

【讨论】:

这已经过测试并且正在工作。我基本上转换了php示例。【参考方案6】:

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

【讨论】:

【参考方案7】:

​ 1. 使用以下命令获取电子邮件提供商的 MX 记录:

nslookup -type=mx gmail.com

    调用tcp客户端检查email是否有效:

    private static void Main(string[] args)
                
      var gMail = IsEmailAccountValid("gmail-smtp-in.l.google.com", "aa.aa@gmail.com");
      Console.WriteLine($"Gmail account is valid - gMail.ToString()");
    
      var live = IsEmailAccountValid("live-com.olc.protection.outlook.com", "aa.aa@live.com");
      Console.WriteLine($"Live account is valid - live.ToString()");
    
    
    private static byte[] BytesFromString(string str)
    
      return Encoding.ASCII.GetBytes(str);
    
    
    private static int GetResponseCode(string ResponseString)
    
      return int.Parse(ResponseString.Substring(0, 3));
    
    
    private static bool IsEmailAccountValid(string tcpClient, string emailAddress)
    
      TcpClient tClient = new TcpClient(tcpClient, 25);
      string CRLF = "\r\n";
      byte[] dataBuffer;
      string ResponseString;
      NetworkStream netStream = tClient.GetStream();
      StreamReader reader = new StreamReader(netStream);
      ResponseString = reader.ReadLine();
    
      /* Perform HELO to SMTP Server and get Response */
      dataBuffer = BytesFromString("HELO Hi" + CRLF);
      netStream.Write(dataBuffer, 0, dataBuffer.Length);
      ResponseString = reader.ReadLine();
      dataBuffer = BytesFromString("MAIL FROM:<YourGmailIDHere@gmail.com>" + CRLF);
      netStream.Write(dataBuffer, 0, dataBuffer.Length);
      ResponseString = reader.ReadLine();
    
      /* Read Response of the RCPT TO Message to know from google if it exist or not */
      dataBuffer = BytesFromString($"RCPT TO:<emailAddress>" + CRLF);
      netStream.Write(dataBuffer, 0, dataBuffer.Length);
      ResponseString = reader.ReadLine();
      var responseCode = GetResponseCode(ResponseString);
    
      if (responseCode == 550)
      
        return false;
      
    
      /* QUITE CONNECTION */
      dataBuffer = BytesFromString("QUITE" + CRLF);
      netStream.Write(dataBuffer, 0, dataBuffer.Length);
      tClient.Close();
      return true;
    
    

可以使用代码获取MX记录:

var lookup = new LookupClient();
var result = lookup.QueryAsync("gmail.com", QueryType.ANY).Result;
var domainName = result.Additionals[result.Additionals.Count - 1].DomainName.Value;

使用上面的代码查找 MX 查找并使用该 MX 查找来检查电子邮件是否有效。

【讨论】:

什么是 LookupClient ? 这是一个 DnsClient Nugut 包类帮助获取 DNS 记录

以上是关于我可以使用 .net 检查电子邮件地址是不是存在吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查电子邮件是不是确实存在

如何检查邮件地址是不是存在?

使用电子邮件地址检查 PayPal 帐户是不是存在?

检查数据库中是不是已存在电子邮件地址

检查电子邮件地址是不是存在

如何在不使用java发送任何邮件的情况下检查域中是不是存在电子邮件ID