c# - validate - Validar una dirección de correo electrónico
validar textbox c# (10)
Actualmente estamos usando la siguiente función y nos está funcionando bastante bien :)
public static bool IsValidEmail(string email)
{
// source: http://thedailywtf.com/Articles/Validating_Email_Addresses.aspx
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(email);
}
Por favor usa esto:
(?:[a-z0-9!#$%&''*+/=?^_`{|}~-]+(?:/.[a-z0-9!#$%&''*+/=?^_`{|}~-]+)*|"(?:[/x01-/x08/x0b/x0c/x0e-/x1f/x21/x23-/x5b/x5d-/x7f]|//[/x01-/x09/x0b/x0c/x0e-/x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|/[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[/x01-/x08/x0b/x0c/x0e-/x1f/x21-/x5a/x53-/x7f]|//[/x01-/x09/x0b/x0c/x0e-/x7f])+)/])
Estoy tratando de enviar un correo electrónico usando c # usando el siguiente código.
MailMessage mail = new MailMessage();
mail.From = new MailAddress(fromAddress, friendlyName);
mail.To.Add(toAddress);
mail.CC.Add(ccAddress);
//set the content
mail.Subject = emailSubject;
mail.Body = emailHeader + "/n" + emailBody;
//send the message
SmtpClient smtp = new SmtpClient(ServerAddress);
smtp.Credentials = CredentialCache.DefaultNetworkCredentials;
mail.IsBodyHtml = true;
smtp.Send(mail);
Ahora la cadena "toAddress" que recibe mi función podría contener una sola dirección, o podría tener muchas direcciones delimitadas por comas.
Ahora el problema es que, en el caso de múltiples direcciones delimitadas por comas, una o dos de ellas podrían tener un formato de dirección de correo electrónico incorrecto.
Entonces, cuando trato de enviar un correo electrónico usando este código, obtengo la excepción:
"La cadena especificada no está en la forma requerida para una dirección de correo electrónico".
¿Hay alguna manera de validar las direcciones de correo electrónico delimitadas por comas? Leí en alguna parte que la única forma de validar una dirección de correo electrónico es enviarle un correo electrónico, porque las expresiones regulares para validar una dirección de correo electrónico pueden ser sorprendentemente grandes.
Además, no tengo control sobre el diseño, o sobre cómo esa cadena de dirección llega a mi función, no puedo agregar la validación del correo electrónico en la interfaz de usuario, así que estoy indefenso allí ...
Mi problema es que el correo electrónico no se entregará a TODAS las direcciones en la cadena delimitada por comas, aunque solo ALGUNAS de las direcciones tengan el formato incorrecto.
¿Hay alguna manera de validar correctamente las direcciones de correo electrónico en .NET? ¿Hay alguna manera de eliminar las malas direcciones de correo electrónico y enviar el correo solo a las buenas?
Como ninguna de las otras respuestas parece mostrar una expresión regular al 100%, voy a intentarlo. Esto se toma del código de producción y no sufre del problema de TLD de una sola letra ([email protected]).
private bool IsEmailSyntaxValid(string emailToValidate)
{
return System.Text.RegularExpressions.Regex.IsMatch(emailToValidate,
@"^([a-zA-Z0-9_/-/.]+)@((/[[0-9]{1,3}/.[0-9]{1,3}/.[0-9]{1,3}/.)|(([a-zA-Z0-9/-]+/.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(/]?)$");
}
No recuerdo de dónde saqué esto, pero como digo, me funciona en producción.
Este es el código que tenemos en producción (incluso agregó una coma para usted). Normalmente no deberías usar try / catch para la validación, pero funciona bien aquí. Creo que es mejor que intentar recodificar el validador.
string[] allToAddresses = to.Split(";,".ToCharArray(),
StringSplitOptions.RemoveEmptyEntries)
foreach (string toAddress in allToAddresses)
{
try
{
message.To.Add(toAddress);
}
catch (FormatException)
{
//do nothing, illformed address. screw it.
}
}
Lo siguiente verificará que la dirección de correo electrónico sea correcta (no es la que realmente existe):
private bool isEmail(string inputEmail)
{
Regex re = new Regex(@"^[A-Z0-9._%+-]+@[A-Z0-9.-]+/.[A-Z]{2,4}$",
RegexOptions.IgnoreCase);
return re.IsMatch(inputEmail);
}
He actualizado esto con una expresión más simple (incluida la insensibilidad de mayúsculas y minúsculas) para poder aclararlo un poco.
Los siguientes son los conceptos básicos del código que verificará que el dominio realmente exista:
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 (<specific exceptions here>)
{
}
return isReal;
}
Hay mucho más que puede hacer, en realidad tratar de conectarse, por ejemplo, para verificar que el dominio recibirá el correo. Además, deberá asegurarse de detectar las excepciones necesarias y manejarlas correctamente.
No parece haber una buena forma de validar las direcciones de correo electrónico.
No he encontrado una expresión regular hasta la fecha que valide correctamente. He tenido casos de direcciones de correo electrónico bloqueadas por expresiones regulares. Así que nuestro objetivo es asegurarnos de que MailMessage no arroje una excepción durante un envío. Si lo hace, podemos notificar a los usuarios. Pero aparte de eso, si das una dirección de correo electrónico incorrecta, no obtienes un correo electrónico.
Podrías dividir la cadena de correo electrónico en la coma y validar cada dirección de correo electrónico usando una expresión regular de correo electrónico simple (o enorme). O intente crear un objeto MailAddress
; también admite una validación básica de la dirección.
Sí, divide la cadena de correos electrónicos en el delimitador y luego valida cada dirección de correo electrónico. he aquí un ejemplo, fallará en la segunda dirección de correo electrónico (foo # bar.com). He usado la expresión regular del control de expresión regular asp.net para validar las direcciones.
String email = "[email protected];foo#bar.com";
String expression = @"/w+([-+.'']/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*";
Regex regex = new Regex(expression);
String[] emails = email.Split(new Char[] { '';'' });
foreach (String s in emails)
{
Match m = regex.Match(s);
if (!m.Success)
{
// Validation fails.
}
}
Siempre puede usar la expresión regular en este sitio, es enorme y totalmente ilegible, pero obtiene la mayoría de los casos extremos.
(?:(?:/r/n)?[ /t])*(?:(?:(?:[^()<>@,;://"./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t]
)+|/Z|(?=[/["()<>@,;://"./[/]]))|"(?:[^/"/r//]|//.|(?:(?:/r/n)?[ /t]))*"(?:(?:
/r/n)?[ /t])*)(?:/.(?:(?:/r/n)?[ /t])*(?:[^()<>@,;://"./[/] /000-/031]+(?:(?:(
?:/r/n)?[ /t])+|/Z|(?=[/["()<>@,;://"./[/]]))|"(?:[^/"/r//]|//.|(?:(?:/r/n)?[
/t]))*"(?:(?:/r/n)?[ /t])*))*@(?:(?:/r/n)?[ /t])*(?:[^()<>@,;://"./[/] /000-/0
31]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/["()<>@,;://"./[/]]))|/[([^/[/]/r//]|//.)*/
](?:(?:/r/n)?[ /t])*)(?:/.(?:(?:/r/n)?[ /t])*(?:[^()<>@,;://"./[/] /000-/031]+
(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/["()<>@,;://"./[/]]))|/[([^/[/]/r//]|//.)*/](?:
(?:/r/n)?[ /t])*))*|(?:[^()<>@,;://"./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z
|(?=[/["()<>@,;://"./[/]]))|"(?:[^/"/r//]|//.|(?:(?:/r/n)?[ /t]))*"(?:(?:/r/n)
?[ /t])*)*/<(?:(?:/r/n)?[ /t])*(?:@(?:[^()<>@,;://"./[/] /000-/031]+(?:(?:(?:/
r/n)?[ /t])+|/Z|(?=[/["()<>@,;://"./[/]]))|/[([^/[/]/r//]|//.)*/](?:(?:/r/n)?[
/t])*)(?:/.(?:(?:/r/n)?[ /t])*(?:[^()<>@,;://"./[/] /000-/031]+(?:(?:(?:/r/n)
?[ /t])+|/Z|(?=[/["()<>@,;://"./[/]]))|/[([^/[/]/r//]|//.)*/](?:(?:/r/n)?[ /t]
)*))*(?:,@(?:(?:/r/n)?[ /t])*(?:[^()<>@,;://"./[/] /000-/031]+(?:(?:(?:/r/n)?[
/t])+|/Z|(?=[/["()<>@,;://"./[/]]))|/[([^/[/]/r//]|//.)*/](?:(?:/r/n)?[ /t])*
)(?:/.(?:(?:/r/n)?[ /t])*(?:[^()<>@,;://"./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t]
)+|/Z|(?=[/["()<>@,;://"./[/]]))|/[([^/[/]/r//]|//.)*/](?:(?:/r/n)?[ /t])*))*)
*:(?:(?:/r/n)?[ /t])*)?(?:[^()<>@,;://"./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+
|/Z|(?=[/["()<>@,;://"./[/]]))|"(?:[^/"/r//]|//.|(?:(?:/r/n)?[ /t]))*"(?:(?:/r
/n)?[ /t])*)(?:/.(?:(?:/r/n)?[ /t])*(?:[^()<>@,;://"./[/] /000-/031]+(?:(?:(?:
/r/n)?[ /t])+|/Z|(?=[/["()<>@,;://"./[/]]))|"(?:[^/"/r//]|//.|(?:(?:/r/n)?[ /t
]))*"(?:(?:/r/n)?[ /t])*))*@(?:(?:/r/n)?[ /t])*(?:[^()<>@,;://"./[/] /000-/031
]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/["()<>@,;://"./[/]]))|/[([^/[/]/r//]|//.)*/](
?:(?:/r/n)?[ /t])*)(?:/.(?:(?:/r/n)?[ /t])*(?:[^()<>@,;://"./[/] /000-/031]+(?
:(?:(?:/r/n)?[ /t])+|/Z|(?=[/["()<>@,;://"./[/]]))|/[([^/[/]/r//]|//.)*/](?:(?
:/r/n)?[ /t])*))*/>(?:(?:/r/n)?[ /t])*)|(?:[^()<>@,;://"./[/] /000-/031]+(?:(?
:(?:/r/n)?[ /t])+|/Z|(?=[/["()<>@,;://"./[/]]))|"(?:[^/"/r//]|//.|(?:(?:/r/n)?
[ /t]))*"(?:(?:/r/n)?[ /t])*)*:(?:(?:/r/n)?[ /t])*(?:(?:(?:[^()<>@,;://"./[/]
/000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/["()<>@,;://"./[/]]))|"(?:[^/"/r//]|
//.|(?:(?:/r/n)?[ /t]))*"(?:(?:/r/n)?[ /t])*)(?:/.(?:(?:/r/n)?[ /t])*(?:[^()<>
@,;://"./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/["()<>@,;://"./[/]]))|"
(?:[^/"/r//]|//.|(?:(?:/r/n)?[ /t]))*"(?:(?:/r/n)?[ /t])*))*@(?:(?:/r/n)?[ /t]
)*(?:[^()<>@,;://"./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/["()<>@,;://
"./[/]]))|/[([^/[/]/r//]|//.)*/](?:(?:/r/n)?[ /t])*)(?:/.(?:(?:/r/n)?[ /t])*(?
:[^()<>@,;://"./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/["()<>@,;://"./[
/]]))|/[([^/[/]/r//]|//.)*/](?:(?:/r/n)?[ /t])*))*|(?:[^()<>@,;://"./[/] /000-
/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/["()<>@,;://"./[/]]))|"(?:[^/"/r//]|//.|(
?:(?:/r/n)?[ /t]))*"(?:(?:/r/n)?[ /t])*)*/<(?:(?:/r/n)?[ /t])*(?:@(?:[^()<>@,;
://"./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/["()<>@,;://"./[/]]))|/[([
^/[/]/r//]|//.)*/](?:(?:/r/n)?[ /t])*)(?:/.(?:(?:/r/n)?[ /t])*(?:[^()<>@,;://"
./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/["()<>@,;://"./[/]]))|/[([^/[/
]/r//]|//.)*/](?:(?:/r/n)?[ /t])*))*(?:,@(?:(?:/r/n)?[ /t])*(?:[^()<>@,;://"./
[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/["()<>@,;://"./[/]]))|/[([^/[/]/
r//]|//.)*/](?:(?:/r/n)?[ /t])*)(?:/.(?:(?:/r/n)?[ /t])*(?:[^()<>@,;://"./[/]
/000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/["()<>@,;://"./[/]]))|/[([^/[/]/r//]
|//.)*/](?:(?:/r/n)?[ /t])*))*)*:(?:(?:/r/n)?[ /t])*)?(?:[^()<>@,;://"./[/] /0
00-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/["()<>@,;://"./[/]]))|"(?:[^/"/r//]|//
.|(?:(?:/r/n)?[ /t]))*"(?:(?:/r/n)?[ /t])*)(?:/.(?:(?:/r/n)?[ /t])*(?:[^()<>@,
;://"./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/["()<>@,;://"./[/]]))|"(?
:[^/"/r//]|//.|(?:(?:/r/n)?[ /t]))*"(?:(?:/r/n)?[ /t])*))*@(?:(?:/r/n)?[ /t])*
(?:[^()<>@,;://"./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/["()<>@,;://".
/[/]]))|/[([^/[/]/r//]|//.)*/](?:(?:/r/n)?[ /t])*)(?:/.(?:(?:/r/n)?[ /t])*(?:[
^()<>@,;://"./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/["()<>@,;://"./[/]
]))|/[([^/[/]/r//]|//.)*/](?:(?:/r/n)?[ /t])*))*/>(?:(?:/r/n)?[ /t])*)(?:,/s*(
?:(?:[^()<>@,;://"./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/["()<>@,;://
"./[/]]))|"(?:[^/"/r//]|//.|(?:(?:/r/n)?[ /t]))*"(?:(?:/r/n)?[ /t])*)(?:/.(?:(
?:/r/n)?[ /t])*(?:[^()<>@,;://"./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[
/["()<>@,;://"./[/]]))|"(?:[^/"/r//]|//.|(?:(?:/r/n)?[ /t]))*"(?:(?:/r/n)?[ /t
])*))*@(?:(?:/r/n)?[ /t])*(?:[^()<>@,;://"./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t
])+|/Z|(?=[/["()<>@,;://"./[/]]))|/[([^/[/]/r//]|//.)*/](?:(?:/r/n)?[ /t])*)(?
:/.(?:(?:/r/n)?[ /t])*(?:[^()<>@,;://"./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|
/Z|(?=[/["()<>@,;://"./[/]]))|/[([^/[/]/r//]|//.)*/](?:(?:/r/n)?[ /t])*))*|(?:
[^()<>@,;://"./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/["()<>@,;://"./[/
]]))|"(?:[^/"/r//]|//.|(?:(?:/r/n)?[ /t]))*"(?:(?:/r/n)?[ /t])*)*/<(?:(?:/r/n)
?[ /t])*(?:@(?:[^()<>@,;://"./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/["
()<>@,;://"./[/]]))|/[([^/[/]/r//]|//.)*/](?:(?:/r/n)?[ /t])*)(?:/.(?:(?:/r/n)
?[ /t])*(?:[^()<>@,;://"./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/["()<>
@,;://"./[/]]))|/[([^/[/]/r//]|//.)*/](?:(?:/r/n)?[ /t])*))*(?:,@(?:(?:/r/n)?[
/t])*(?:[^()<>@,;://"./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/["()<>@,
;://"./[/]]))|/[([^/[/]/r//]|//.)*/](?:(?:/r/n)?[ /t])*)(?:/.(?:(?:/r/n)?[ /t]
)*(?:[^()<>@,;://"./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/["()<>@,;://
"./[/]]))|/[([^/[/]/r//]|//.)*/](?:(?:/r/n)?[ /t])*))*)*:(?:(?:/r/n)?[ /t])*)?
(?:[^()<>@,;://"./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/["()<>@,;://".
/[/]]))|"(?:[^/"/r//]|//.|(?:(?:/r/n)?[ /t]))*"(?:(?:/r/n)?[ /t])*)(?:/.(?:(?:
/r/n)?[ /t])*(?:[^()<>@,;://"./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z|(?=[/[
"()<>@,;://"./[/]]))|"(?:[^/"/r//]|//.|(?:(?:/r/n)?[ /t]))*"(?:(?:/r/n)?[ /t])
*))*@(?:(?:/r/n)?[ /t])*(?:[^()<>@,;://"./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])
+|/Z|(?=[/["()<>@,;://"./[/]]))|/[([^/[/]/r//]|//.)*/](?:(?:/r/n)?[ /t])*)(?:/
.(?:(?:/r/n)?[ /t])*(?:[^()<>@,;://"./[/] /000-/031]+(?:(?:(?:/r/n)?[ /t])+|/Z
|(?=[/["()<>@,;://"./[/]]))|/[([^/[/]/r//]|//.)*/](?:(?:/r/n)?[ /t])*))*/>(?:(
?:/r/n)?[ /t])*))*)?;/s*)
Tener una validación de correo electrónico 100% compatible con RFC es difícil , consulte esta respuesta para más detalles. En .NET dos formas relativamente sencillas es utilizar MailAddress
try {
new MailAddress("invalid_email");
} catch (FormatException) {
// invalid
}
O un enfoque más estricto basado en Regex de MSDN (maneja el tiempo de espera de análisis de IDN y Regex para .NET 4.5):
// NET 4.0
Boolean mappingInvalid = false;
emailString = Regex.Replace(emailString, @"(@)(.+)$", match => {
String domainName = match.Groups[2].Value;
try {
domainName = new IdnMapping().GetAscii(domainName);
} catch (ArgumentException) {
mappingInvalid = true;
}
return match.Groups[1].Value + domainName;
});
if (mappingInvalid) {
return false;
}
return Regex.IsMatch(emailString,
@"^(?("")(""[^""]+?""@)|(([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);
string uname = Convert.ToString(string);
string expression = @"/w+([-+.'']/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*";
Regex regex = new Regex(expression);
Match m = regex.Match(uname);
if (m.Success)
{
emailId = uname;
}