Убедитесь, что адрес электронной почты действителен для System.Net.Mail.MailAddress

В настоящее время, чтобы избежать появления ошибок из-за неверных адресов электронной почты, я делаю следующее:

Dim mailAddress As MailAddress
Try
   mailAddress = New MailAddress("testing@[email protected]")
Catch ex As Exception
   'Invalid email
End Try

Однако, вместо того, чтобы зависеть от Try..Catch, есть ли способ проверить, что адрес электронной почты будет на 100% действительным для типа MailAddress?

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


person Curt    schedule 11.08.2011    source источник
comment
Вы пробовали использовать декомпилятор, чтобы узнать, что MailAddress использует?   -  person Oded    schedule 11.08.2011
comment
@Oded: У меня есть. Он использует большой внутренний класс MailBnfHelper, который существенно изменился в .Net 4.0. Не рекомендую распаковывать.   -  person SLaks    schedule 11.08.2011
comment
В разных версиях инфраструктуры .Net используются разные правила для того, что она поддерживает, поэтому я бы забеспокоился, что любое созданное вами регулярное выражение может не быть надежным в будущем. Try Catch будет доказательством будущего, поэтому я согласен с ответом SLaks. В противном случае, если вы действительно хотите написать регулярное выражение, документация для MailAddress описывает правила, которые он использует, так что вы можете использовать это в качестве отправной точки.   -  person Hans Olsson    schedule 11.08.2011
comment
@ho: вы не можете использовать регулярное выражение. Адреса электронной почты не являются обычным языком.   -  person SLaks    schedule 11.08.2011
comment
Спасибо за ответы. Итак, мой код будет рекомендуемым решением? Я не думал, что использование Try Catch таким образом было хорошей практикой?   -  person Curt    schedule 11.08.2011
comment
@Curt: Обычно это плохая практика, но здесь это лучший вариант.   -  person SLaks    schedule 11.08.2011
comment
Я открыл отчет об ошибке. Проголосуйте вверх: github.com/dotnet/corefx/issues/25295   -  person Jonathan Allen    schedule 16.11.2017


Ответы (6)


К сожалению, MailAddress.TryParse метода нет.

Ваш код - идеальный способ проверки адресов электронной почты в .Net.

person SLaks    schedule 11.08.2011
comment
Я бы не согласился с этим, я бы предположил, что используйте регулярное выражение для блока try / catch, поскольку они обычно медленные. - person Cromat; 11.08.2011
comment
@Cromat: Неправильно. Регулярные выражения также работают медленно, и любое регулярное выражение, достаточно сложное для приблизительного адреса электронной почты, будет очень медленным. Кроме того, блоки catch медленны только в том случае, если действительно обнаружено исключение, поэтому в общем случае действительного адреса это ничего не замедлит. - person SLaks; 11.08.2011
comment
@Oded Нет, они не самые быстрые, однако использование исключений для управления потоком приложений никогда не является хорошей практикой. - person Cromat; 11.08.2011
comment
@Cromat: Это правда, но это правильно (кроме того, чтобы просить Microsoft добавить метод TryParse). Он должен быть заключен в метод, который возвращает логическое значение или значение NULL MailAddress. - person SLaks; 11.08.2011
comment
@Cromat - Правильно, не следует использовать исключения для управления потоком. Но нужно также знать, когда делать исключение из этого правила (без каламбура). - person Oded; 11.08.2011
comment
stackoverflow.com/questions/1903356/ - person SLaks; 11.08.2011
comment
@Cromat Просто к сведению: Microsoft предоставляет рекомендуемое регулярное выражение для этой задачи по адресу Как сделать : Убедитесь, что строки находятся в допустимом формате электронной почты. Но сразу после того, как они объяснят, как работает RegEx, они добавляют. Вместо использования регулярного выражения для проверки адреса электронной почты вы можете использовать класс System.Net.Mail.MailAddress. :) Так что, похоже, даже MS предпочитает «попробовать / поймать» MailAddress, а не использовать даже свой собственный RegEx. - person Solomon Rutzky; 18.02.2015
comment
Jagadedhcutebou. [email protected] Проходит попытку. - person Offir; 08.11.2016
comment
@Oded Конечно, должно быть, особенно с возможностью .Net предварительно компилировать регулярное выражение. Что-то не так с регулярным выражением .Net, что делает его медленным? - person Max Barraclough; 22.06.2018

Если вам нужно убедиться, что данный адрес электронной почты действителен в соответствии со стандартами IETF - которым класс MailAddress, похоже, соблюдает лишь частично, на момент написания этой статьи - я предлагаю вам взглянуть на EmailVerify.NET < / strong>, компонент .NET, который вы можете легко интегрировать в свои решения. Он не зависит от регулярных выражений для выполнения своей работы, но полагается на внутренний конечный автомат, поэтому он очень-очень быстрый.

Отказ от ответственности: я являюсь ведущим разработчиком этого компонента.

person Community    schedule 17.08.2011
comment
Этот компонент не является бесплатным - он продается по цене 50 долларов США. - person bgmCoder; 10.04.2013

Недавно .NET API был расширен методом MailAddress.TryCreate, который, вероятно, появится в будущих выпусках, что устранит необходимость в общем шаблоне try-catch: https://github.com/dotnet/runtime/commit/aea45f4e75d1cdbbfc60daae782d1cfeb700be02

person seekingtheoptimal    schedule 12.03.2020

Не совсем ответ на этот вопрос сам по себе, но на случай, если он кому-то понадобится, я написал функцию C # для проверки адресов электронной почты с помощью этого метода.

FixEmailAddress("[email protected]")

возвращает "[email protected]"

FixEmailAddress("wa@[email protected],[email protected],asdfdsf,[email protected]")

возвращает "[email protected],[email protected]"

Я обрабатываю списки адресов электронной почты таким образом, потому что список адресов электронной почты, разделенных запятыми, является допустимым параметром для MailAddressCollection.Add ()

/// <summary>
/// Given a single email address, return the email address if it is valid, or empty string if invalid.
/// or given a comma delimited list of email addresses, return the a comma list of valid email addresses from the original list.
/// </summary>
/// <param name="emailAddess"></param>
/// <returns>Validated email address(es)</returns>  
public static string FixEmailAddress(string emailAddress)
{

   string result = "";

    emailAddress = emailAddress.Replace(";",",");
   if (emailAddress.Contains(","))
   {
       List<string> results = new List<string>();
       string[] emailAddresses = emailAddress.Split(new char[] { ',' });
       foreach (string e in emailAddresses)
       {
           string temp = FixEmailAddress(e);
           if (temp != "")
           {
               results.Add(temp);
           }
       }
       result = string.Join(",", results);
   }
   else
   {

       try
       {
           System.Net.Mail.MailAddress email = new System.Net.Mail.MailAddress(emailAddress);
           result = email.Address;
       }
       catch (Exception)
       {
           result = "";
       }

   }

   return result;

}

person Walter Stabosz    schedule 11.06.2013

MS также предоставляет код для валидатора электронной почты на основе регулярных выражений: https://msdn.microsoft.com/en-us/library/01escwtf%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

person Patrick    schedule 08.09.2015

Некоторые символы действительны у одних поставщиков услуг, но не у других! SmtpClient ничего не знают о поставщиках услуг. Поэтому он должен как можно меньше фильтровать. Википедия хорошо упоминается о стандартах.

Проверка MailAddress упоминается в MSDN. Следовательно, я думаю, вы можете проверить эти проверки перед инициализацией MailAddress.

person NaveenBhat    schedule 11.08.2011