Лучший способ проверить формат адреса электронной почты в C # - PullRequest
0 голосов
/ 18 октября 2019

Привет, я работаю над функцией массовой рассылки. Ниже приведен мой цикл, который проверяет электронную почту и отправляет ее каждому получателю:

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.
    }
}

Так как receientUserIds всегда больше 2000, использование try-catch кажется очень дорогим для каждого пользователя в этом случае только для проверкиформат адреса электронной почты. Мне было интересно использовать регулярные выражения, но не уверен, поможет ли это с производительностью.

Таким образом, мой вопрос заключается в том, существует ли какой-либо более эффективный или оптимизированный способ выполнения такой же проверки.

1 Ответ

0 голосов
/ 18 октября 2019

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

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