Лучший способ проверить формат адреса электронной почты в 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
}
}