在 C# 中验证电子邮件地址格式的最佳方法

Best way to validate email address format in C#

您好,我正在研究批量发送电子邮件的功能。下面是我验证电子邮件并将其发送给每个收件人的循环:

foreach (var userID in recipientUserIds)
{
    var userInfo = //getting from database using userID.

    try
    {
        to = new MailAddress(userInfo.Email1, userInfo.FirstName + " " + userInfo.LastName);
    }
    catch (System.FormatException fe)
    {
        continue;
    }

    using (MailMessage message = new MailMessage(from, to))
    {
        //populate message and send email.
    }
}

由于 recipientUserIds 总是超过 2000,在这种情况下,使用 try-catch 似乎对每个用户来说都非常昂贵,只是为了验证电子邮件地址格式。我想知道使用正则表达式,但不确定这是否有助于提高性能。

所以我的问题是是否有更好的或性能优化的方法来进行相同的验证。

验证电子邮件地址是一项复杂的任务,编写代码来预先完成所有验证将非常棘手。如果你检查 MailAddress class documentationRemarks 部分,你会发现有很多字符串是被视为有效的电子邮件地址(包括评论、括号中的域名和嵌入的引号)。

并且由于源代码可用,请查看 ParseAddress 方法 here,您将了解自己必须编写的代码来验证电子邮件地址.遗憾的是没有 public TryParse 方法可以用来避免抛出异常。

因此,最好先进行一些简单的验证 - 确保它包含电子邮件地址的最低要求(字面上看起来是 user@domain,其中 domain 不必包含一个 '.' 字符),然后让异常处理处理其余部分:

foreach (var userID in recipientUserIds)
{
    var userInfo = GetUserInfo(userID);

    // Basic validation on length
    var email = userInfo?.Email1?.Trim();
    if (string.IsNullOrEmpty(email) || email.Length < 3) continue;

    // Basic validation on '@' character position
    var atIndex = email.IndexOf('@');
    if (atIndex < 1 || atIndex == email.Length - 1) continue;

    // Let try/catch handle the rest, because email addresses are complicated
    MailAddress to;
    try
    {
        to = new MailAddress(email, $"{userInfo.FirstName} {userInfo.LastName}");
    }
    catch (FormatException)
    {
        continue;
    }

    using (MailMessage message = new MailMessage(from, to))
    {
        // populate message and send email here
    }
}