Лучший способ проверить формат адреса электронной почты в 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 кажется очень дорогостоящим для каждого пользователя в этом случае только для проверки формата адреса электронной почты. Мне было интересно использовать регулярное выражение, но не уверен, поможет ли это с производительностью.

Итак, мой вопрос в том, есть ли лучший или оптимизированный для производительности способ сделать такую ​​же проверку.

1 ответ

Решение

Проверка адресов электронной почты - сложная задача, и написание кода для выполнения всей проверки заранее было бы довольно сложной задачей. Если вы проверитеRemarks раздел MailAddress документации класса, вы увидите, что существует множество строк, которые считаются допустимыми адресами электронной почты (включая комментарии, имена доменов в квадратных скобках и встроенные кавычки).

А поскольку исходный код доступен, ознакомьтесь с ParseAddressметод здесь, и вы получите представление о коде вы должны написать, чтобы подтвердить адрес электронной почты, пожалуйста. Жаль, что нет публики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
    }
}
Другие вопросы по тегам