Есть ли смысл проверять SMTP-адреса с помощью регулярных выражений? - PullRequest
1 голос
/ 16 ноября 2009

У меня есть приложение, в котором пользователи могут отправлять электронные письма другим пользователям, выбирая имена из списка. Там также есть текстовое поле, где они могут свободно вводить список адресов электронной почты для Cc. В настоящее время каждый адрес Cc проверяется обширным регулярным выражением, которое проверяет соответствие RFC2822. Затем адрес добавляется в коллекцию System.Net.Mail.MailMessage.CC, что-то вроде этого ...

MailMessage message = new MailMessage(/*...*/);    

//foreach address ...
{
  try
  {
    MailAddress address = new MailAddress(strAddress);
    message.CC.Add(address);
  }
  catch (FormatException fe)
  {
    // display error to user, don't sent the message
    return false;  
  }
}
//send the message ...

У меня такой вопрос: есть ли смысл проверять каждый адрес с помощью регулярного выражения, или я должен просто положиться на System.Net.Mail.MailAddress, чтобы выполнить проверку для меня?

Ответы [ 3 ]

2 голосов
/ 16 ноября 2009

Если вы отправляете почту, используя System.Net.Mail, то для проверки будет хорошей идеей использовать класс MailAddress, так как вы знаете, что вы можете отправлять почту, используя эти классы (технически это не разрешает все действительные адреса электронной почты, но нет никакого смысла разрешать адреса, на которые вы не можете отправлять).

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

Я заранее добавил базовую проверку работоспособности, чтобы уменьшить количество исключений, создаваемых на явно недействительных адресах. Ничего особенного, просто проверка, что есть @ и . в разумных позициях. Я не могу вспомнить, что у меня в голове, но это было так просто, я думаю, я просто использовал String.IndexOf, а не регулярное выражение. Так что да, я считаю что-то вроде того, что стоит сделать, но не трать на это слишком много времени.

1 голос
/ 16 ноября 2009

ПОЦЕЛУЙ. Регулярное выражение для RFC2822 не имеет ничего общего с (для этого посмотрите печально известное регулярное выражение perl). Я бы вообще не использовал регулярное выражение - думая, что это единственный подход, который уже загнал вас в угол.

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

И, если вы уже используете код, который основан на соответствии с адресами электронной почты, принятыми MailAddress, то это можно ограничить, но не расширять, с помощью предварительного фильтра.

1 голос
/ 16 ноября 2009

MailAddress, кажется, имеет некоторые проблемы (см. Комментарии в конце этой страницы: http://msdn.microsoft.com/en-us/library/system.net.mail.mailaddress.aspx). Я бы предпочел использовать регулярное выражение (см., Например, http://www.regular -expressions.info / email) .html ), поскольку это позволит вам при необходимости вносить изменения (если вы используете MailAddress, вы зависите от Microsoft, исправляющей ошибки проверки адреса в будущих версиях платформы или пакетах обновления).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...