tag propiedad c# parsing mailaddress

c# - propiedad - ¿Cómo se analiza el formato de la dirección de correo electrónico en el nombre para mostrar y la dirección de correo electrónico?



propiedad tag c# (13)

Acabo de escribir esto, toma la primera dirección de correo electrónico bien formada de una cadena. De esta forma, no tiene que suponer dónde está la dirección de correo electrónico en la cadena

Hay mucho margen de mejora, pero debo irme para trabajar :)

class Program { static void Main(string[] args) { string email = "/"Jimbo/" <[email protected]>"; Console.WriteLine(parseEmail(email)); } private static string parseEmail(string inputString) { Regex r = new Regex(@"^((?:(?:(?:[a-zA-Z0-9][/./-/+_]?)*)[a-zA-Z0-9])+)/@((?:(?:(?:[a-zA-Z0-9][/./-_]?){0,62})[a-zA-Z0-9])+)/.([a-zA-Z0-9]{2,6})$"); string[] tokens = inputString.Split('' ''); foreach (string s in tokens) { string temp = s; temp = temp.TrimStart(''<''); temp = temp.TrimEnd(''>''); if (r.Match(temp).Success) return temp; } throw new ArgumentException("Not an e-mail address"); } }

Dada la dirección de correo electrónico: "Jim" <[email protected]>

Si trato de pasar esto a MailAddress obtengo la excepción:

La cadena especificada no tiene el formato requerido para una dirección de correo electrónico.

¿Cómo puedo analizar esta dirección en un nombre para mostrar (Jim) y la dirección de correo electrónico ([email protected]) en C #?

EDITAR: Estoy buscando el código C # para analizarlo.

EDIT2: descubrí que la excepción estaba siendo lanzada por MailAddress porque tenía un espacio al comienzo de la cadena de dirección de correo electrónico.


Entonces, esto es lo que hice. Es un poco rápido y sucio, pero parece funcionar.

string emailTo = "/"Jim/" <[email protected]>"; string emailRegex = @"(?:[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])+)/])"; string emailAddress = Regex.Match(emailTo.ToLower(), emailRegex).Value; string displayName = null; try { displayName = emailTo.Substring(0, emailTo.ToLower().IndexOf(emailAddress) - 1); } catch { // No display name } MailAddress addr = new MailAddress(emailAddress, displayName);

¿Comentarios?


Es un poco "rudo y listo", pero funcionará para el ejemplo que has dado:

string emailAddress, displayname; string unparsedText = "/"Jimbo/" <[email protected]>"; string[] emailParts = unparsedText.Split(new char[] { ''<'' }); if (emailParts.Length == 2) { displayname = emailParts[0].Trim(new char[] { '' '', ''/"'' }); emailAddress = emailParts[1].TrimEnd(''>''); }


Funciona para mi:

string s = "/"Jim/" <[email protected]>"; System.Net.Mail.MailAddress a = new System.Net.Mail.MailAddress(s); Debug.WriteLine("DisplayName: " + a.DisplayName); Debug.WriteLine("Address: " + a.Address);

La clase MailAddress tiene un método privado que analiza una dirección de correo electrónico. No sé qué tan bueno es, pero tendería a usarlo en lugar de escribir el mío.


No codigo en este idioma, pero veo dos problemas que tal vez quiera verificar:

1- No sabes exactamente por qué fue rechazado. En la posibilidad inmediata era que tiene una lista negra para example.com.

2- La solución real que desea es probablemente implementar un validador estricto. es probablemente un buen lugar para desarrollar esto, porque hay muchas personas con experiencia práctica.

Aquí hay un par de cosas que necesita:

  1. recortar el espacio en blanco y obviamente cruft.
  2. analizar en partes individuales (nombre para mostrar, lado izquierdo de la dirección, lado derecho de la dirección).
  3. valide cada uno de estos con un validador específico de la estructura de datos. Por ejemplo, el lado derecho debe ser un FQDN válido (o un nombre de host no calificado si se encuentra en un sistema de correo liberal).

Ese es el mejor enfoque a largo plazo para resolver este problema.


Para manejar espacios incrustados, divida los paréntesis, de la siguiente manera:

string addrin = "/"Jim Smith/" <[email protected]>"; char[] bracks = {''<'',''>''}; string[] pieces = addrin.Split(bracks); pieces[0] = pieces[0] .Substring(0, pieces[0].Length - 1) .Replace("/"", string.Empty); MailAddress ma = new MailAddress(pieces[1], pieces[0]);



si asume que siempre hay un espacio entre los 2, podría usar String.Split ('''') para dividirlo en los espacios. Eso te daría una matriz con las partes divididas.

así que tal vez así:

string str = "/"Jimbo/" [email protected]" string[] parts = str.Trim().Replace("/"","").Split('' '')

Un problema con esto para comprobar es que si el nombre para mostrar tiene un espacio, se dividirá en 2 o más elementos en su matriz, pero el correo electrónico siempre será el último.

Editar: es posible que también necesite editar los corchetes, solo agregue reemplazos con esos.


try: "Jim" <[email protected]> no estoy seguro si funcionará, pero así es como generalmente lo veo en los clientes de correo electrónico.


new MailAddress("[email protected]", "Jimbo");

para analizar la cadena que diste:

string input = "/"Jimbo/" [email protected]"; string[] pieces = input.Split('' ''); MailAddress ma = new MailAddress(pieces[1].Replace("<", string.Empty).Replace(">",string.Empty), pieces[0].Replace("/"", string.Empty));


string inputEmailString = "/"Jimbo/" <[email protected]>"; string[] strSet = inputEmailString.Split(''/"'',''<'',''>''); MailAddress mAddress = new MailAddress(strSet[0], strSet[2]);



Si está buscando analizar manualmente la dirección de correo electrónico, quiere leer RFC2822 ( https://tools.ietf.org/html/rfc822.html#section-3.4 ). La Sección 3.4 habla sobre el formato de dirección.

Pero analizar las direcciones de correo electrónico correctamente no es fácil y MailAddress debería ser capaz de manejar la mayoría de los escenarios.

De acuerdo con la documentación de MSDN para MailAddress :

http://msdn.microsoft.com/en-us/library/591bk9e8.aspx

Debería poder analizar una dirección con un nombre para mostrar. Dan como ejemplo "Tom Smith <[email protected]>" . Tal vez las citas son el problema? Si es así, simplemente quite las comillas y use MailAddress para analizar el resto.

string emailAddress = "/"Jim/" <[email protected]>"; MailAddress address = new MailAddress(emailAddress.Replace("/"", ""));

Analizar manualmente RFC2822 no vale la pena si puedes evitarlo.