2011-08-11 20 views
25

Actualmente, para evitar errores de ser lanzado para arriba debido a las direcciones de correo electrónico válida, hago lo siguiente:compruebe que la dirección de correo electrónico es válida para System.Net.Mail.MailAddress

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

Sin embargo, en lugar de depender Try..Catch, ¿hay alguna manera de validar que la dirección de correo electrónico sea 100% válida para el tipo MailAddress?

Sé que hay un montón de funciones de expresiones regulares para validar correos electrónicos, pero estoy buscando la función que el tipo MailAddress utiliza para validar sus direcciones.

+0

¿Usted intentó utilizar un descompilador para ver qué 'utiliza MailAddress'? – Oded

+1

@Oded: Tengo. Utiliza una gran clase interna llamada 'MailBnfHelper', que ha cambiado sustancialmente en .Net 4.0. No recomiendo extraerlo. – SLaks

+0

Las diferentes versiones de .Net Framework usan reglas diferentes para lo que admite, así que me preocuparía que cualquier expresión regular que crees no sea a prueba de futuro. El 'Try Catch' sería una prueba futura, así que estoy de acuerdo con la respuesta de SLaks. De lo contrario, si realmente desea escribir una expresión regular, la documentación de [MailAddress] (http://msdn.microsoft.com/en-us/library/system.net.mail.mailaddress.aspx) describe las reglas que utiliza para que usted pueda podría ser capaz de usar eso como punto de partida. –

Respuesta

25

Desafortunadamente, no existe el método MailAddress.TryParse.

Su código es la forma ideal para validar las direcciones de correo electrónico en .Net.

+2

No estaría de acuerdo con esto, supongo que usaría una expresión regular sobre un bloque try/catch ya que generalmente son lentos. – Cromat

+8

@Cromat - porque RegEx es conocido por ser rápido, ¿verdad? – Oded

+0

@Cromat: Incorrecto. Los regex son también lentos, y cualquier regex lo suficientemente compleja como para acercarse a una dirección de correo electrónico será muy lenta. Además, los bloques 'catch' son lentos si se captura una excepción, por lo que esto no ralentizará nada en el caso común de una dirección válida. – SLaks

0

Algunos caracteres son válidos en algunos proveedores de servicios, pero lo mismo no sucede en otros. El SmtpClient no sabe nada sobre los proveedores de servicios. Por lo tanto, tiene que filtrar lo menos posible. El Wikipedia se menciona muy bien sobre los Standers.

La validación de MailAddress se menciona en el MSDN. Por lo tanto, creo que puede verificar esas validaciones antes de inicializar el MailAddress.

6

Si necesita asegurarse de que una dirección de correo electrónico es válida según los estándares de IETF, que la clase MailAddress parece seguir solo parcialmente, al momento de escribir estas líneas, le sugiero que consulte EmailVerify. NET, un componente .NET que puede integrar fácilmente en sus soluciones. No depende de las expresiones regulares para realizar su trabajo, sino que se basa en una máquina de estado finito interno, por lo que es muy, muy rápido.

responsabilidad: yo soy el desarrollador principal de este componente.

+0

¡Eso es hermoso! –

+2

Este componente no es un componente gratuito, se vende por $ 50.00. – bgmCoder

1

No es realmente una respuesta a esta pregunta per se, pero en caso de que alguien lo necesite, escribí una función C# para validar direcciones de correo electrónico utilizando este método.

FixEmailAddress("[email protected]")

vuelve "[email protected]"

FixEmailAddress("[email protected]@xyz.com,[email protected],asdfdsf,[email protected]")

vuelve "[email protected],[email protected]"

Cómo proceso listas de direcciones de correo electrónico de esta manera porque una coma lista de correos electrónicos separados es un parámetro válido para 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; 

}

Cuestiones relacionadas