2015-05-26 1 views
0

адрес электронной почты ниже, не допустимый форматКак проверить, если электронная почта недопустимый формат или не

[email protected]ö 

Но вся валидация я нашел и пыталась до сих пор с C# сказал, что это правильный адрес электронной почты, который не является

Как я могу проверить достоверность электронной почты или нет с помощью C# 4.5.2? спасибо

Ok обновленного вопрос

Причина я спрашиваю один из крупнейших службы электронной почты Mandrill апи бросает внутреннюю ошибку сервера при попытке отправить этот адрес

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

+5

_The электронной почты ниже Недействительный формат_ Что заставляет вас говорить это? Кажется правильным адресом для меня. 'coö' в настоящее время не используется, но не будет гарантировано, что он не будет использоваться и в будущем. –

+3

Не действительный адрес электронной почты? В доменной части допускаются символы, отличные от ASCII, для обслуживания интернационализированных доменных имен. Насколько мне известно, 'coö' - это не используемый в настоящее время TLD, но C# не может знать, что он никогда не будет использоваться как один. – Mourndark

+2

Если вы хотите проверить список TLD, ICANN предоставит: https://data.iana.org/TLD/tlds-alpha-by-domain.txt – Mourndark

ответ

0

С помощью Regex

string emailID = "[email protected]ö"; 

     bool isEmail = Regex.IsMatch(emailID, @"\A(?:[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\.)+[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?)\Z"); 

     if (isEmail) 
     { 
      Response.Write("Valid"); 
     } 
+0

Вы не должны использовать регулярное выражение для проверки адреса электронной почты, оно встроено в фреймворк! – BrainSlugs83

0

Проверьте ниже класс от https://msdn.microsoft.com/en-us/library/01escwtf(v=vs.110).aspx

using System; 
using System.Globalization; 
using System.Text.RegularExpressions; 

public class RegexUtilities 
{ 
    bool invalid = false; 

    public bool IsValidEmail(string strIn) 
    { 
     invalid = false; 
     if (String.IsNullOrEmpty(strIn)) 
      return false; 

     // Use IdnMapping class to convert Unicode domain names. 
     try { 
      strIn = Regex.Replace(strIn, @"(@)(.+)$", this.DomainMapper, 
           RegexOptions.None, TimeSpan.FromMilliseconds(200)); 
     } 
     catch (RegexMatchTimeoutException) { 
     return false; 
     } 

     if (invalid) 
      return false; 

     // Return true if strIn is in valid e-mail format. 
     try { 
      return Regex.IsMatch(strIn, 
       @"^(?("")("".+?(?<!\\)""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" + 
       @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))$", 
       RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250)); 
     } 
     catch (RegexMatchTimeoutException) { 
      return false; 
     } 
    } 

    private string DomainMapper(Match match) 
    { 
     // IdnMapping class with default property values. 
     IdnMapping idn = new IdnMapping(); 

     string domainName = match.Groups[2].Value; 
     try { 
     domainName = idn.GetAscii(domainName); 
     } 
     catch (ArgumentException) { 
     invalid = true; 
     } 
     return match.Groups[1].Value + domainName; 
    } 
} 

Или посмотрите на @Cogwheel ответьте здесь C# code to validate email address

+0

Вы не должны использовать регулярное выражение для проверки адреса электронной почты, оно встроено в структуру! – BrainSlugs83

+0

@ BrainSlugs83 расскажите нам, где он встроен, пожалуйста. новый MailAddress() в попытке catch не удается, потому что он принимает отображаемые имена, а другой класс, который я нашел, - EmailAddressAttribute.IsValid с использованием System.ComponentModel.DataAnnotations. – Jan

0

Регулярное выражение для адреса электронной почты можно сопоставить, используя нижеследующее:

return Regex.IsMatch(strIn, 
       @"^(?("")(""[^""]+?""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" + 
       @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9]{2,17}))$", 
       RegexOptions.IgnoreCase); 

Ссылка MSDN

Но в вашем случае:

[email protected]ö 

Если вы проверяете правильность адреса электронной почты от «.coo», которое не является действительным в соответствии с вашим наблюдением, он не будет показать какую-либо ошибку, поскольку регулярное выражение не проверяет это, поэтому вам нужно вручную добавить некоторые домены, которые вы принимаете, например: gmail.com, yahoo.com и т. д.

правильно сказано в comme NTS на вопрос по SonerGonul

Благодаря

+0

это действительный адрес электронной почты или нет: [email protected] – MonsterMMORPG

+0

Я боюсь с этим вопросом! – tharif

+0

Вы не должны использовать регулярное выражение для проверки адреса электронной почты, оно встроено в структуру! – BrainSlugs83

0

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

Во-вторых, вы должны действительно не использовать Regex для проверки адреса электронной почты; проверка правильности адреса электронной почты встроена в платформу .NET, и вы не должны воссоздавать колесо для чего-то вроде этого.

Простая функция проверки, которая выполняет обе проверки, выглядит следующим образом:

public static bool IsValidEmailAddress(string emailAddress, bool verifyDomain = true) 
{ 
    var result = false; 
    if (!string.IsNullOrWhiteSpace(emailAddress)) 
    { 
     try 
     { 
      // Check Format (Offline). 
      var addy = new MailAddress(emailAddress); 

      if (verifyDomain) 
      { 
       // Check that a valid MX record exists (Online). 
       result = new DnsStubResolver().Resolve<MxRecord>(addy.Host, RecordType.Mx).Any(); 
      } 
      else 
      { 
       result = true; 
      } 
     } 
     catch (SocketException) 
     { 
      result = false; 
     } 
     catch (FormatException) 
     { 
      result = false; 
     } 
    } 

    return result; 
} 

Чтобы запустить код, вам нужно будет установить пакет NuGet ARSoft.Tools.Net, который необходим для записи MX поиска *, и вы необходимо будет добавить соответствующие объявления с использованием различных используемых классов (в наши дни должно быть довольно автоматическим в VisualStudio).

(*: Просто проверка действительного имени хоста через System.Net.Dns.GetHost* не достаточно, так как это может дать вам некоторые ложные негативы для некоторых областей, которые имеют только записи MX, такие как [email protected] и т.д.)

+0

Я не знаю о проверке записи MX, но новый MailAddress («FooBar [email protected]») не удастся, так как он будет результат в .DisplayName = FooBar и .Address = [email protected] Я видел возвращение obj.Address = inputEmailAddress как работа. Я ищу другой .Net путь, так как я думаю, что самодельное регулярное выражение не является хорошим aproach. Может быть, System.ComponentModel.DataAnnotations и его метод EmailAddressAttribute.IsValid()? – Jan