¿Cuál es el código más elegante para validar que una cadena es una dirección de correo electrónico válida?
c#
email
email-validation
leora
fuente
fuente
Respuestas:
¿Qué hay de esto?
Para aclarar, la pregunta es si una cadena en particular 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 primero. Estas son todas formas perfectamente válidas:
Para la mayoría de los casos de uso, un falso "inválido" es mucho peor para sus usuarios y pruebas futuras que un falso "válido". Aquí hay un artículo que solía ser la respuesta aceptada a esta pregunta (esa respuesta se ha eliminado desde entonces). Tiene muchos más detalles y algunas otras ideas sobre 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 es 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 presentar una advertencia al usuario una oportunidad para decir "sí, mi servidor de correo realmente permite 🌮🍳🎁 como dirección de correo electrónico".
En cuanto al uso de 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 ser mayores que el dogma.
Además, si hace algo más con la dirección de correo electrónico, probablemente implicará convertirlo en una dirección de correo electrónico. Incluso si no usa esta función exacta, probablemente quiera usar el mismo patrón. También puede verificar si hay tipos específicos de fallas al detectar diferentes excepciones : nulo, vacío o formato no válido.
Según el comentario de Stuart, esto compara la dirección final con la cadena original en lugar de devolver siempre verdadero. MailAddress intenta analizar una cadena con espacios en las partes "Nombre para mostrar" y "Dirección", por lo que la versión original estaba devolviendo falsos positivos.
--- Otras lecturas ---
Documentación para System.Net.Mail.MailAddress
Explicación de lo que constituye una dirección de correo electrónico válida.
fuente
System.Net.Mail
clases para enviar correo, que probablemente sea si está utilizando .NET. Tomamos la decisión de utilizar este tipo de validación simplemente porque no tiene sentido aceptar direcciones de correo electrónico, incluso válidas, a las que no podemos enviar correos.IsValidEmail("this is not valid@email$com");
Esta es una pregunta antigua, pero todas las respuestas que he encontrado 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 la anotación [EmailAddress] de System.ComponentModel.DataAnnotations, por lo que me preguntaba por qué no podía usar la funcionalidad incorporada. Neto en general.
Esto parece funcionar, y me parece bastante elegante:
fuente
EmailAddressAttribute
es menos permisivo queSystem.Net.Mail.MailAddress
, por ejemplo,MailAddress
acepta una dirección para un TLD. Es algo a tener en cuenta si necesita ser lo más permisivo posible.foo.IsValid(null);
vuelvetrue
.Utilizo este método de línea única que hace el trabajo por mí.
Según los comentarios, esto "fallará" si
source
(la dirección de correo electrónico) es nula.fuente
public static Boolean IsValidMailAddress(this String pThis) => pThis == null ? false : new EmailAddressAttribute().IsValid(pThis);
public static bool IsValidEmailAddress(this string address) => address != null && new EmailAddressAttribute().IsValid(address);
false
para cadenas nulas. Es por eso que proponen la (mejor aún mejor) ++ versión:public static bool IsValidEmailAddress(this string address) => new EmailAddressAttribute().IsValid(address ?? throw new ArgumentNullException());
. Ahora iré y encontraré la Iglesia reformada de los versionistas aún mejores..net 4.5 agregó System.ComponentModel.DataAnnotations.EmailAddressAttribute
Puede navegar por la fuente de EmailAddressAttribute , esta es la expresión regular que utiliza internamente:
fuente
RegexOptions.IgnoreCase
porque este patrón no permite letras mayúsculas explícitamente!Tomé la respuesta de Phil del # 1 y creé esta clase. Llámalo así:
bool isValid = Validator.EmailIsValid(emailString);
Aquí está la clase:
fuente
Personalmente, diría que debes asegurarte de que haya un símbolo @ allí, posiblemente con un. personaje. Hay muchas expresiones regulares que podría usar con una corrección variable, pero creo que la mayoría de ellas omiten las direcciones de correo electrónico válidas o dejan pasar las inválidas. Si las personas desean ingresar una dirección de correo electrónico falsa, ingresarán una dirección falsa. Si necesita verificar que la dirección de correo electrónico es legítima y que la persona tiene el control de esa dirección de correo electrónico, deberá enviarles un correo electrónico con un enlace codificado especial para que puedan verificar que realmente es una dirección real.
fuente
Creo que la mejor manera es la siguiente:
Puede tener esta función estática en una clase general.
fuente
Código corto y preciso
fuente
La forma más elegante es utilizar los métodos integrados de .Net.
Estos métodos:
Son probados y probados. Estos métodos se utilizan en mis propios proyectos profesionales.
Use expresiones regulares internamente, que son confiables y rápidas.
Hecho por Microsoft para C #. No hay necesidad de reinventar la rueda.
Devuelve un resultado bool. Verdadero significa que el correo electrónico es válido.
Para usuarios de .Net 4.5 y superior
Agregue esta referencia a su proyecto:
Ahora puede usar el siguiente código:
Ejemplo de uso
Aquí hay algunos métodos para declarar:
... y código que los demuestra en acción:
Además, este ejemplo:
;
.Alternativa, para usuarios de una versión de .Net inferior a 4.5
Para situaciones en las que .Net 4.5 no está disponible, utilizo la siguiente solución:
Específicamente, yo uso:
fuente
EmailAddressAttribute
por poco menos de cuatro meses, aunque este sí capta elnull
problema.Para ser honesto, en el código de producción, lo mejor que hago es buscar un
@
símbolo.Nunca estoy en un lugar para validar por completo los correos electrónicos. ¿Sabes cómo veo si fue realmente válido? Si fue enviado. Si no lo hizo, es malo, si lo hizo, la vida es buena. Éso es Todo lo que Necesito Saber.
fuente
Considero que esta expresión regular es una buena compensación entre verificar algo más que solo la marca @ y aceptar casos extraños:
Al menos te hará poner algo alrededor de la marca @, y colocar al menos un dominio de aspecto normal.
fuente
bob@companyinternal
?La validación de la dirección de correo electrónico no es tan fácil como parece. En realidad, es teóricamente imposible validar completamente una dirección de correo electrónico utilizando solo una expresión regular.
Consulte mi publicación de blog al respecto para una discusión sobre el tema y una implementación de F # usando FParsec. [/ shameless_plug]
fuente
Aquí está mi respuesta: la solución de Phil falla para dominios de una letra como "[email protected]". Lo creas o no, eso se usa =) (va a centurylink, por ejemplo).
La respuesta de Phil también funcionará solo con el estándar PCRE ... por lo que C # lo tomará, pero JavaScript va a bombardear. Es demasiado complejo para javascript. Por lo tanto, no puede usar la solución de Phil para los atributos de validación de mvc.
Aquí está mi expresión regular. Funcionará bien con los atributos de validación MVC.
- Todo antes de @ se simplifica, por lo que al menos JavaScript funcionará. Estoy bien relajando la validación aquí, siempre y cuando el servidor de intercambio no me dé un 5.1.3. - Todo después de @ es la solución de Phil modificada para dominios de una letra.
Para las personas que sugieren usar system.net.mail MailMessage (), eso es MANERA de ser flexible. Claro, C # aceptará el correo electrónico, pero luego el servidor de Exchange bombardeará con un error de tiempo de ejecución 5.1.3 tan pronto como intente enviar el correo electrónico.
fuente
basket@ball
como una dirección de correo electrónico válida haya obtenido la respuesta correcta, así como todos esos votos positivos. ¡Gracias de cualquier manera!Si realmente quiere decir si quiere saber si una dirección de correo electrónico es válida ... pídale al intercambiador de correo que lo pruebe, no se necesita regex. Puedo proporcionar el código si así lo solicita.
Los pasos generales son los siguientes: 1. ¿la dirección de correo electrónico tiene una parte de nombre de dominio? (índice de @> 0) 2. usando una consulta DNS pregunte si el dominio tiene un intercambiador de correo 3. abra la conexión tcp al intercambiador de correo 4. usando el protocolo smtp, abra un mensaje al servidor usando la dirección de correo electrónico como el receptor 5. analizar la respuesta del servidor. 6. Salga del mensaje si llegó hasta aquí, todo está bien.
Esto es, como puede imaginar, un tiempo muy costoso y depende de smtp, pero funciona.
fuente
En términos generales, una expresión regular para validar direcciones de correo electrónico no es algo fácil de inventar; En el momento de escribir este artículo, la sintaxis de una dirección de correo electrónico debe seguir un número relativamente alto de estándares y la implementación de todos ellos dentro de una expresión regular es prácticamente inviable.
Le recomiendo que pruebe nuestro EmailVerify.NET , una biblioteca .NET madura que puede validar las direcciones de correo electrónico siguiendo todos los estándares actuales de IETF (RFC 1123, RFC 2821, RFC 2822, RFC 3696, RFC 4291, RFC 5321 y RFC 5322) , prueba los registros DNS relacionados, comprueba si los buzones de correo de destino pueden aceptar mensajes e incluso puede decir si una dirección determinada es desechable o no.
Descargo de responsabilidad: soy el desarrollador principal de este componente.
fuente
fuente
En caso de que esté utilizando FluentValidation , podría escribir algo tan simple como esto:
fuente
una pequeña modificación a la respuesta de @Cogwheel
fuente
Console.WriteLine(MailAddress("asdf@asdf.").Address);
genera "asdf @ asdf", que no es válido.Hay muchas respuestas fuertes aquí. Sin embargo, recomiendo que demos un paso atrás. @Cogwheel responde la pregunta https://stackoverflow.com/a/1374644/388267 . Sin embargo, podría ser costoso en un escenario de validación masiva, si muchas de las direcciones de correo electrónico que se validan no son válidas. Sugiero que empleemos un poco de lógica antes de entrar en su bloque try-catch. Sé que el siguiente código podría escribirse usando RegEx, pero eso podría ser costoso para los nuevos desarrolladores. Este es mi valor de dos peniques:
fuente
La respuesta más votada de @Cogwheel es la mejor respuesta, sin embargo, he intentado implementar el
trim()
método de cadena para que recorte todo el espacio en blanco del usuario de principio a fin. Verifique el código a continuación para ver un ejemplo completo:fuente
SanitizeEmail(string email)
, utilizando el resultado de ese método para validar y enviar el correo electrónico.fuente
Compruebe que la cadena de correo electrónico tenga el formato correcto o incorrecto
System.Text.RegularExpressions
:fuente
/ Uso de la expresión regular interna utilizada para crear el "nuevo EmailAddressAttribute ();" componente en .Net4.5 >>> usando System.ComponentModel.DataAnnotations; // Para validar una dirección de correo electrónico ...... Probado y funcionando.
Además, puedes usar esto:
http://msdn.microsoft.com/en-us/library/01escwtf(v=vs.110).aspx
fuente
He resumido la respuesta de Poyson 1 así:
fuente
Una forma simple de identificar el correo electrónico es válida o no.
fuente
Hay un problema de cultura en regex en C # en lugar de js. Por lo tanto, necesitamos usar expresiones regulares en modo estadounidense para la verificación de correo electrónico. Si no usa el modo ECMAScript, los caracteres especiales de su idioma están implícitos en AZ con regex.
fuente
Terminé usando esta expresión regular, ya que valida con éxito comas, comentarios, caracteres Unicode y direcciones de dominio IP (v4).
Las direcciones válidas serán:
fuente
Una simple sin usar Regex (que no me gusta por su poca legibilidad):
Ejemplos:
IsValidEmail("@b.com") // false
IsValidEmail("[email protected]") // false
IsValidEmail("a@bcom") // false
IsValidEmail("a.b@com") // false
IsValidEmail("a@b.") // false
IsValidEmail("a [email protected]") // false
IsValidEmail("a@b c.com") // false
IsValidEmail("[email protected]") // true
IsValidEmail("[email protected]") // true
IsValidEmail("[email protected]") // true
IsValidEmail("[email protected]") // true
Se pretende que sea simple y, por lo tanto, no trata casos raros como correos electrónicos con dominios entre corchetes que contienen espacios (generalmente permitidos), correos electrónicos con direcciones IPv6, etc.
fuente
Aquí hay una respuesta a su pregunta para que la revise.
fuente
Según la respuesta de @Cogwheel, quiero compartir una solución modificada que funcione para SSIS y el "Componente de script":
Coloque este código en el método correcto:
Luego, puede usar una división condicional para filtrar todos los registros no válidos o lo que quiera hacer.
fuente