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

时间:2016-03-16 12:39:08

标签: c# validation email

我在c#windows应用程序中使用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#中任何域的有效地址。

6 个答案:

答案 0 :(得分:3)

您可以使用以下正则表达式:

    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 :(得分:3)

您可以导入System.ComponentModel.DataAnnotations并以这种方式使用它:

private bool validMail(string address)
{
    EmailAddressAttribute e = new EmailAddressAttribute();
    if (e.IsValid(address))
        return true;
    else
        return false;
}

答案 2 :(得分:1)

使用.Net邮件名称空间,您可以像这样验证电子邮件地址:

using System.Net.Mail;

private bool EmailVerify(string email)

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

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

答案 3 :(得分: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),因此使用该方法检查域不是确定的。

使用RegEx是可以的,但是他们经常无法识别引用的地址和其他有效模式(根据RFC,这是合理的)是有效的。

因为要使用SmtpClient类,你必须拥有一个有效的MailAddress对象,它才有意义。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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