在C#中检查有效的电子邮件地址

3

我正在使用c#窗口应用程序发送电子邮件,需要使用smtp服务。 我需要以最佳方式执行以减少电子邮件退信率。 我必须检查提供的电子邮件地址是否有效。 我正在使用以下代码。

    private void btnCheckValid_Click(object sender, EventArgs e)
        {
            if (isRealDomain(textBox1.Text.Trim()) == true)
                MessageBox.Show("Valid Email Address!");
        }
        private bool isRealDomain(string inputEmail)
        {
            bool isReal = false;
            try
            {
                string[] host = (inputEmail.Split('@'));
                string hostname = host[1];

                IPHostEntry IPhst = Dns.GetHostEntry(hostname);
                IPEndPoint endPt = new IPEndPoint(IPhst.AddressList[0], 25);
                Socket s = new Socket(endPt.AddressFamily,
                        SocketType.Stream, ProtocolType.Tcp);
                s.Connect(endPt);
                s.Close();
                isReal = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                isReal = false;
            }

            return isReal;
        }

通过检查真实的域名,我可以确定托管的IP地址,但是电子邮件地址是在主机上创建还是不在主机上创建。
使用正则表达式,我只能验证格式。
那么我的问题是如何在C#中找到任何域的有效地址。

2
验证地址已经被问了很多次,只需要谷歌一下,例如:https://dev59.com/q2Qo5IYBdhLWcg3wSNxw - MakePeaceGreatAgain
6个回答

9
您可以导入 System.ComponentModel.DataAnnotations 并按照以下方式使用:
private bool validMail(string address)
{
    EmailAddressAttribute e = new EmailAddressAttribute();
    if (e.IsValid(address))
        return true;
    else
        return false;
}

5

您可以使用正则表达式,例如:

    public static bool IsValidEmailAddress(string emailaddress)
    {
        try
        {
            Regex rx = new Regex(
        @"^[-!#$%&'*+/0-9=?A-Z^_a-z{|}~](\.?[-!#$%&'*+/0-9=?A-Z^_a-z{|}~])*@[a-zA-Z](-?[a-zA-Z0-9])*(\.[a-zA-Z](-?[a-zA-Z0-9])*)+$");
            return rx.IsMatch(emailaddress);
        }
        catch (FormatException)
        {
            return false;
      }
}

更新:

如果您想验证特定域名,如您在评论中所述,这甚至更简单:

Regex rx = new Regex(
@"^[-!#$%&'*+/0-9=?A-Z^_a-z{|}~](\.?[-!#$%&'*+/0-9=?A-Z^_a-z{|}~])*@yourdomain.com$");

用你的域名替换yourdomain.com。


1
使用 .Net mail 命名空间,您可以像这样验证电子邮件地址: using System.Net.Mail;
private bool EmailVerify(string email)

    {
        try
        {
            var mail = new MailAddress(email);

            return mail.Host.Contains(".");
        }
        catch
        {
            return false;
        }
    }

1
这听起来很不错,但不幸的是它允许 example@example 这种根本不包含顶级域名的情况。这对于内部网络可能没问题,但对于大多数人来说,我建议您也添加我在您答案中所做的更改。 - Simon_Weaver
你也可以添加常见的拼写错误,比如 mail.Host.EndsWith(".cmo") 并返回 false。 - Simon_Weaver

1
 public static bool IsValidEmail(string emailaddress)
    {
           return new EmailAddressAttribute().IsValid(emailaddress);
    }
// using System.ComponentModel.DataAnnotations;

我的意图不是检查电子邮件格式,而是实时验证电子邮件地址... - Sunil Acharya

0

如果你正在使用

System.Net.Mail.SmtpClient

我发现最准确的方法是尝试创建一个。
System.Net.Mail.MailAddress

对象。如果您无法使用字符串中的地址创建对象,则会抛出以下异常之一:

ArgumentNullException // The address is null
ArgumentException // The address is string.Empty
FormatException // The address is not in a recognized format

https://msdn.microsoft.com/en-us/library/591bk9e8(v=vs.110).aspx

我发现

Dns.GetHostEntry

这种方法最好是不确定的。它似乎不能识别多层域名作为有效的(domain.subdomain1.subdomain2.com),因此使用该方法检查域名并不是绝对可靠的。

使用正则表达式是可以的,但它们经常无法识别引用地址和其他有效模式(根据RFC规范是可以接受的)作为有效的。

既然要使用SmtpClient类,您必须拥有一个有效的MailAddress对象,这是有道理的。


如果您能看到我的代码中正在获取IPHostEntry,但是该主机没有识别出真正的电子邮件地址。 - Sunil Acharya
正确的,实际上在发送电子邮件之前,您基本上无法做任何事情来保证电子邮件地址存在。您所能希望做的就是通过确保只向格式正确的地址发送邮件来减少退信。例如,testaddress@mydomain.com被正确地格式化为电子邮件地址,但即使您可以确定mydomain.com是一个有效的活动域,您也无法确定testaddress是否存在于该域中作为有效的邮件帐户。 - Kevin
此外,我在我的答案中指出,Dns.GetHostEntry有时会无法找到完全有效的活动域,特别是多级域名,因此在这些情况下,即使该域存在,您也将无法获得IPHostEntry。您用于确定有效域的技术将捕获大多数域,但不是全部。 - Kevin
@Kevin 我在使用dig命令时也遇到了类似的问题,发现必须逐步找到正确的域名服务器并直接向它们请求才能获取最详细的信息。我想知道是否是同样的问题。 - Dan Chase

0

这里是另一种检查有效电子邮件地址的方法

 public bool IsValidEmail(string email)
    {
        try
        {
            var addr = new System.Net.Mail.MailAddress(email);
            return addr.Address == email;
        }
        catch
        {
            return false;
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接