验证电子邮件地址

ash*_*rya 28 .net c# email

我正在尝试使用以下代码使用c#发送电子邮件.

MailMessage mail = new MailMessage();
mail.From = new MailAddress(fromAddress, friendlyName);
mail.To.Add(toAddress);
mail.CC.Add(ccAddress);

//set the content
mail.Subject = emailSubject;
mail.Body = emailHeader + "\n" + emailBody;

//send the message
SmtpClient smtp = new SmtpClient(ServerAddress);
smtp.Credentials = CredentialCache.DefaultNetworkCredentials;
mail.IsBodyHtml = true;
smtp.Send(mail);
Run Code Online (Sandbox Code Playgroud)

现在我的函数收到的"toAddress"字符串可能包含一个地址,或者它可能包含许多逗号分隔的地址.

现在的问题是,在多个逗号分隔的地址的情况下,其中一个或两个可能是错误的电子邮件地址格式.

因此,当我尝试使用此代码发送电子邮件时,我得到例外:

"指定的字符串不是电子邮件地址所需的格式."

有没有办法验证逗号分隔的电子邮件地址?我曾在某处读到,验证电子邮件地址的唯一方法是向其发送电子邮件,因为验证电子邮件地址的正则表达式可能会非常庞大​​.

此外,我无法控制设计,或者地址字符串如何影响我的功能,我无法在UI中添加电子邮件验证,所以我很无奈......

我的问题是电子邮件不会被传递到逗号分隔字符串中的所有地址,即使只有一些地址的格式错误.

有没有办法在.NET中正确验证电子邮件地址?有没有办法清理坏的电子邮件地址并将邮件发送给好的邮件地址?

Kob*_*obi 31

这是我们生产的代码(甚至为您添加了逗号).通常你不应该使用try/catch进行验证,但它在这里运行良好.我相信它比尝试重新编码验证器更好.

string[] allToAddresses = to.Split(";,".ToCharArray(),
                                 StringSplitOptions.RemoveEmptyEntries)
foreach (string toAddress in allToAddresses)
    {
        try
        {
            message.To.Add(toAddress);
        }
        catch (FormatException)
        {
            //do nothing, illformed address. screw it.
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 你确定Add抛出的_every_异常意味着地址不正确吗?您应该只捕获实际上_do_表示错误地址的异常.你的代码会阻止你看到一个例外,说"某些事情是非常错误的;我希望有人看到这个并做些什么事情;我现在就要死了;再见". (3认同)
  • 我知道那不会受欢迎——但是是的。查看http://msdn.microsoft.com/en-us/library/ms144695.aspx - null 和empty 的两个异常,以及FormatException。我想你总是会遇到一个奇怪的异常(比如内存不足,或者类似的疯狂的事情),所以我会改变它。谢谢。 (2认同)
  • 此外,.NET不是Java,而且随着时间的推移,Microsoft可以添加异常.最好不要抓住一些实际上_does_暗示无效电子邮件地址的异常,而不是捕捉并忽略一些暗示发生可怕事情的异常. (2认同)

The*_*iot 24

目前我们正在使用以下功能,它对我们来说工作得很好:)

public static bool IsValidEmail(string email)
{
    // source: http://thedailywtf.com/Articles/Validating_Email_Addresses.aspx
    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(email);
}
Run Code Online (Sandbox Code Playgroud)

请使用这个:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
Run Code Online (Sandbox Code Playgroud)

  • 那个验证aman@village.i,但没有一个字母TLD. (4认同)

Fre*_*jon 22

您可以在逗号上拆分电子邮件字符串,并使用简单(或巨大)的电子邮件正则表达式验证每个电子邮件地址.或者,尝试创建一个MailAddress对象; 它也支持一些基本的地址验证.

  • +1.我认为MailAddress构造函数足以满足他当前的目的(在第一次发送之前进行快速检查). (2认同)
  • 仅供参考,使用 MailAddress 验证电子邮件地址并非万无一失。它似乎允许一些不应该通过的错误地址,例如“bob.@mysite.com”或“bob..smith@mysite.com”。 (2认同)

Dmi*_*try 17

拥有100%符合RFC的电子邮件验证很难,请参阅此答案以获取详细信息.在.NET中,两种相对简单的方法是使用MailAddress

try {
    new MailAddress("invalid_email");
} catch (FormatException) {
    // invalid
}
Run Code Online (Sandbox Code Playgroud)

或者来自MSDN的更严格的基于Regex的方法(处理.NET 4.5的IDN和Regex解析超时):

// NET 4.0
Boolean mappingInvalid = false;
emailString = Regex.Replace(emailString, @"(@)(.+)$", match => {
    String domainName = match.Groups[2].Value;
    try {
        domainName = new IdnMapping().GetAscii(domainName);
    } catch (ArgumentException) {
        mappingInvalid = true;
    }
    return match.Groups[1].Value + domainName;
});
if (mappingInvalid) {
    return false;
}
return Regex.IsMatch(emailString,
        @"^(?("")(""[^""]+?""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" +
        @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9]{2,17}))$",
        RegexOptions.IgnoreCase);
Run Code Online (Sandbox Code Playgroud)

  • 第一个解决方案很简单,依赖于(可能)所有 .NET 程序员都可以访问的经过良好测试的代码段。干得好! (2认同)

小智 7

using System.ComponentModel.DataAnnotations;

return new EmailAddressAttribute().IsValid(strIn);
Run Code Online (Sandbox Code Playgroud)


Chr*_*isF 5

以下将检查电子邮件地址是否正确(不是实际存在):

private bool isEmail(string inputEmail)
{
    Regex re = new Regex(@"^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$",
                  RegexOptions.IgnoreCase);
    return re.IsMatch(inputEmail);
}
Run Code Online (Sandbox Code Playgroud)

我用更简单的表达式(包括不区分大小写)更新了这个,以便有希望让它更清晰一点.

以下是验证域实际存在的代码的基础知识:

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 (<specific exceptions here>)
    {
    }

    return isReal;
}
Run Code Online (Sandbox Code Playgroud)

您可以执行更多操作,例如,尝试连接以验证域将接收邮件.此外,您需要确保捕获必要的异常并正确处理它们.