Este artículo ha sido analizado por nuestros expertos para garantizar la veracidad de este artículo.
Solución:
¿Qué pasa con esto?
bool IsValidEmail(string email)
try
var addr = new System.Net.Mail.MailAddress(email);
return addr.Address == email;
catch
return false;
Según el comentario de Stuart, esto compara la dirección final con la original. string en vez de volver siempre true. MailAddress intenta analizar un string con espacios en las partes “Nombre para mostrar” y “Dirección”, por lo que la versión original estaba regresando false positivos
Para aclarar, la pregunta es si un determinado string es una representación válida de una dirección de correo electrónico, no si una dirección de correo electrónico es un destino válido para enviar un mensaje. Para eso, la única forma real es enviar un mensaje para confirmar.
Tenga en cuenta que las direcciones de correo electrónico son más indulgentes de lo que podría suponer en un principio. Todas estas son formas perfectamente válidas:
- [email protected]
- “rueda dentada la naranja”@example.com
- [email protected]$.xyz
Para la mayoría de los casos de uso, un false “inválido” es mucho peor para sus usuarios y para el futuro que un false “válido”. Aquí hay un artículo que solía ser la respuesta aceptada a esta pregunta (esa respuesta se eliminó desde entonces). Tiene muchos más detalles y algunas otras ideas de cómo resolver el problema.
Proporcionar controles de cordura sigue siendo una buena idea para la experiencia del usuario. Suponiendo que la dirección de correo electrónico sea válida, puede buscar dominios de nivel superior conocidos, verificar el dominio en busca de un registro MX, verificar errores ortográficos de nombres de dominio comunes (gmail.cmo), etc. Luego, presente una advertencia que le brinde al usuario la oportunidad de decir “sí, mi servidor de correo realmente lo permite como dirección de correo electrónico”.
En cuanto al uso del manejo de excepciones para la lógica empresarial, estoy de acuerdo en que es algo que debe evitarse. Pero este es uno de esos casos donde la conveniencia y la claridad pueden pesar más que el dogma.
Además, si hace algo más con la dirección de correo electrónico, probablemente implicará convertirla en una dirección de correo. Incluso si no usa esta función exacta, probablemente querrá usar el mismo patrón. También puede verificar tipos específicos de fallas detectando diferentes excepciones: nullvacío o formato no válido.
— Otras lecturas —
Documentación para System.Net.Mail.MailAddress
Explicación de lo que constituye una dirección de correo electrónico válida
Esta es una pregunta antigua, pero todas las respuestas que encontré en SO, incluidas las más recientes, se responden de manera similar a esta. Sin embargo, en .Net 4.5 / MVC 4 puede agregar la validación de la dirección de correo electrónico a un formulario agregando el [EmailAddress] anotación de System.ComponentModel.DataAnnotations, así que me preguntaba por qué no podía simplemente usar la funcionalidad integrada de .Net en general.
Esto parece funcionar, y me parece bastante elegante:
using System.ComponentModel.DataAnnotations;
class ValidateSomeEmails
static void Main(string[] args)
var foo = new EmailAddressAttribute();
bool bar;
bar = foo.IsValid("[email protected]"); //true
bar = foo.IsValid("[email protected]"); //true
bar = foo.IsValid("[email protected]"); //true
bar = foo.IsValid("[email protected]"); //true
bar = foo.IsValid("fdsa"); //false
bar = foo.IsValid("[email protected]"); //false
bar = foo.IsValid("[email protected]"); //false
bar = foo.IsValid("[email protected]"); //false
//one-liner
if (new EmailAddressAttribute().IsValid("[email protected]"))
bar = true;
Utilizo este método de una sola línea que hace el trabajo por mí:
using System.ComponentModel.DataAnnotations;
public bool IsValidEmail(string source)
return new EmailAddressAttribute().IsValid(source);
Según los comentarios, esto “fallará” si el source
(la dirección de correo electrónico) es null.
public static bool IsValidEmailAddress(this string address) => address != null && new EmailAddressAttribute().IsValid(address);
Reseñas y puntuaciones del post
Si estás contento con lo expuesto, eres capaz de dejar una crónica acerca de qué te ha impresionado de este artículo.