2016-03-16 4 views
0

Я отправляю электронное письмо с помощью smtp-сервисов в моем приложении windows C#. Я должен выполнить лучший способ уменьшить показатель отказов по электронной почте. Я должен проверить, что указанный адрес электронной почты действителен или нет. Я использую код.Проверка Действительный адрес электронной почты в C#

private void btnCheckValid_Click(object sender, EventArgs e) 
     { 
      if (isRealDomain(textBox1.Text.Trim()) == true) 
       MessageBox.Show("Valid Email Address!"); 
     } 
     private bool isRealDomain(string inputEmail) 
     { 
      bool isReal = false; 
      try 
      { 
       string[] host = (inputEmail.Split('@')); 
       string hostname = host[1]; 

       IPHostEntry IPhst = Dns.GetHostEntry(hostname); 
       IPEndPoint endPt = new IPEndPoint(IPhst.AddressList[0], 25); 
       Socket s = new Socket(endPt.AddressFamily, 
         SocketType.Stream, ProtocolType.Tcp); 
       s.Connect(endPt); 
       s.Close(); 
       isReal = true; 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
       isReal = false; 
      } 

      return isReal; 
     } 

Проверяя реальный домен, я могу определить Hosted IP, но адрес электронной почты создается на хосте или нет.

с регулярным выражением (регулярное выражение) Я могу использовать только формат.

Итак, мой вопрос заключается в том, как найти только действительный адрес любого домена в C#.

+2

Проверка адресов была задана так много раз, просто Google немного, например. http://stackoverflow.com/questions/16167983/best-regular-expression-for-email-validation-in-c-sharp – HimBromBeere

ответ

3

Вы можете использовать регулярные выражения, как:

public static bool IsValidEmailAddress(string emailaddress) 
    { 
     try 
     { 
      Regex rx = new Regex(
     @"^[-!#$%&'*+/0-9=?A-Z^_a-z{|}~](\.?[-!#$%&'*+/0-9=?A-Z^_a-z{|}~])*@[a-zA-Z](-?[a-zA-Z0-9])*(\.[a-zA-Z](-?[a-zA-Z0-9])*)+$"); 
      return rx.IsMatch(emailaddress); 
     } 
     catch (FormatException) 
     { 
      return false; 
     } 
} 

UPDATE:

Если вы хотите проверить для конкретного домена, как вы сказали в комментариях его еще проще:

Regex rx = new Regex(
@"^[-!#$%&'*+/0-9=?A-Z^_a-z{|}~](\.?[-!#$%&'*+/0-9=?A-Z^_a-z{|}~])*@yourdomain.com$"); 

Замените yourdomain.com своим доменным именем.

+0

с регулярным выражением (регулярное выражение) Я могу использовать только формат недопустимых доменов, размещенных на сервере –

+0

@SunilAcharya Я обновил свой ответ. пожалуйста, взгляните на это –

0

Если вы используете

System.Net.Mail.SmtpClient 

Наиболее точный способ я нашел, чтобы попытаться создать объект

System.Net.Mail.MailAddress 

. Если вы не можете создать объект с адресом в вашей строке он будет бросать одно из следующих действий:

ArgumentNullException // The address is null 
ArgumentException // The address is string.Empty 
FormatException // The address is not in a recognized format 

https://msdn.microsoft.com/en-us/library/591bk9e8(v=vs.110).aspx

Я обнаружил, что

Dns.GetHostEntry 

является ненадежным в лучшем случае. По-видимому, он не распознает многослойные домены как действительные (domain.subdomain1.subdomain2.com), поэтому проверка домена с использованием этого метода НЕ является окончательной.

Использование RegEx в порядке, но они часто не могут распознать цитируемые адреса и другие допустимые шаблоны (которые соответствуют RFC) как действительные.

Так как для использования класса SmtpClient у вас должен быть действительный объект MailAddress, это имеет смысл.

+0

Если вы видите, что я получаю IPHostEntry в своем коде, но. наличие хоста не идентифицирует настоящий адрес электронной почты. –

+0

Правильно, и по сути ничего не поделаешь, прежде чем отправлять письмо, которое гарантирует, что адрес электронной почты существует. Все, что вы можете надеяться сделать, - это сокращение отскоков, гарантируя, что вы отправляете почту только на правильно отформатированные адреса. Например, [email protected] правильно отформатирован как адрес электронной почты, но даже если вы можете определить, что mydomain.com является действительным активным доменом, вы не можете определить, существует ли тестовый адрес в качестве допустимой учетной записи электронной почты в этом домене. – Kevin

+0

Кроме того, я указываю в своем ответе, что Dns.GetHostEntry иногда не сможет найти абсолютно действующие активные домены, особенно многоуровневые, поэтому в таких случаях вы не получите IPHostEntry, даже если домен существует. Ваш метод определения допустимого домена будет захватывать большинство доменов, но не все. – Kevin

1

Использование.Чистая почта имен вы можете проверить адрес электронной почты, как это:

using System.Net.Mail;

private bool EmailVerify(string email) 

    { 
     try 
     { 
      var mail = new MailAddress(email); 

      return mail.Host.Contains("."); 
     } 
     catch 
     { 
      return false; 
     } 
    } 
+0

это звучит здорово, но, к сожалению, он позволяет «пример @ example», который, конечно, вообще не содержит TLD. Это может быть хорошо для интрасети, но для большинства людей я бы рекомендовал также добавить изменение, которое я сделал для вашего ответа –

+0

, вы также можете добавить общие опечатки, такие как 'mail.Host.EndsWith (". Cmo ")' и вернуть false –

0

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

public bool IsValidEmail(string email) 
    { 
     try 
     { 
      var addr = new System.Net.Mail.MailAddress(email); 
      return addr.Address == email; 
     } 
     catch 
     { 
      return false; 
     } 
    } 
1

Вы можете импортировать System.ComponentModel.DataAnnotations и использовать его таким образом, :

private bool validMail(string address) 
{ 
    EmailAddressAttribute e = new EmailAddressAttribute(); 
    if (e.IsValid(address)) 
     return true; 
    else 
     return false; 
} 
0
public static bool IsValidEmail(string emailaddress) 
    { 
      return new EmailAddressAttribute().IsValid(emailaddress); 
    } 
// using System.ComponentModel.DataAnnotations; 
Смежные вопросы