Come analizzare l'indirizzo e-mail formattato in nome visualizzato e indirizzo e-mail?

StackOverflow https://stackoverflow.com/questions/162681

  •  03-07-2019
  •  | 
  •  

Domanda

Dato l'indirizzo e-mail: " Jim " lt &; jim@example.com gt &;

Se provo a passare questo a MailAddress ottengo l'eccezione:

  

La stringa specificata non è nella forma richiesta per un indirizzo e-mail.

Come posso analizzare questo indirizzo in un nome visualizzato (Jim) e indirizzo e-mail (jim@example.com) in C #?

EDIT: sto cercando il codice C # per analizzarlo.

EDIT2: ho scoperto che l'eccezione veniva generata da MailAddress perché avevo uno spazio all'inizio della stringa dell'indirizzo e-mail.

È stato utile?

Soluzione

Se stai cercando di analizzare manualmente l'indirizzo e-mail, vuoi leggere RFC2822 ( https://tools.ietf.org/html/rfc822.html#section-3.4 ). La sezione 3.4 parla del formato dell'indirizzo.

Ma analizzare correttamente gli indirizzi e-mail non è facile e MailAddress dovrebbe essere in grado di gestire la maggior parte degli scenari.

Secondo la documentazione MSDN per "Tom Smith <tsmith@contoso.com>":

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

Dovrebbe essere in grado di analizzare un indirizzo con un nome visualizzato. Danno <=> come esempio. Forse le citazioni sono il problema? In tal caso, basta eliminare le virgolette e utilizzare MailAddress per analizzare il resto.

string emailAddress = "\"Jim\" <jim@example.com>";

MailAddress address = new MailAddress(emailAddress.Replace("\"", ""));

L'analisi manuale di RFC2822 non vale la pena se puoi evitarlo.

Altri suggerimenti

Funziona per me:

string s = "\"Jim\" <jim@example.com>";
System.Net.Mail.MailAddress a = new System.Net.Mail.MailAddress(s);
Debug.WriteLine("DisplayName:  " +  a.DisplayName);
Debug.WriteLine("Address:  " + a.Address);

La classe MailAddress ha un metodo privato che analizza un indirizzo e-mail. Non so quanto sia bello, ma tenderei a usarlo piuttosto che a scrivere il mio.

Prova:

"Jimbo <jim@example.com>"

prova: " Jim " lt &; & jim@example.com gt; non sono sicuro che funzionerà, ma è così che generalmente lo vedo nei client di posta elettronica.

se assumi che ci sia sempre uno spazio tra i 2, potresti semplicemente usare String.Split ('') per dividerlo negli spazi. Ciò ti darebbe un array con le parti divise.

quindi forse in questo modo:

string str = "\"Jimbo\" jim@example.com"
string[] parts = str.Trim().Replace("\"","").Split(' ')

Un problema da verificare è che se il nome visualizzato contiene uno spazio, verrà diviso in 2 o più elementi nel proprio array, ma l'e-mail sarebbe sempre l'ultima.

Modifica: potrebbe anche essere necessario modificare le parentesi, basta aggiungere sostituzioni con quelle.

L'ho appena scritto, prende il primo indirizzo e-mail ben formato da una stringa. In questo modo non devi assumere dove si trova l'indirizzo e-mail nella stringa

Un sacco di spazio per migliorare, ma devo partire per lavoro :)

class Program
{
    static void Main(string[] args)
    {
        string email = "\"Jimbo\" <jim@example.com>";
        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");
    }
}

È un po '" approssimativo e pronto " ma funzionerà per l'esempio che hai fornito:

        string emailAddress, displayname;
        string unparsedText = "\"Jimbo\" <jim@example.com>";
        string[] emailParts = unparsedText.Split(new char[] { '<' });

        if (emailParts.Length == 2)
        {
            displayname = emailParts[0].Trim(new char[] { ' ', '\"' });
            emailAddress = emailParts[1].TrimEnd('>');
        }
new MailAddress("jim@example.com", "Jimbo");

per analizzare la stringa che hai fornito:

string input = "\"Jimbo\" jim@example.com";
string[] pieces = input.Split(' ');
MailAddress ma = new MailAddress(pieces[1].Replace("<", string.Empty).Replace(">",string.Empty), pieces[0].Replace("\"", string.Empty));
string inputEmailString = "\"Jimbo\" <jim@example.com>";
string[] strSet =  inputEmailString.Split('\"','<','>');   

MailAddress mAddress = new MailAddress(strSet[0], strSet[2]);

Per gestire gli spazi incorporati, dividere tra parentesi, come segue:

string addrin = "\"Jim Smith\" <jim@example.com>";
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]);

Quindi, questo è quello che ho fatto. È un po 'veloce e sporco, ma sembra funzionare.

string emailTo = "\"Jim\" <jim@example.com>";
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);

Commenti?

Non codifico in questa lingua, ma vedo due problemi che potresti voler controllare:

1- Non sai esattamente perché è stato rifiutato. La possibilità immediata era che avesse una lista nera per esempio.com.

2- La vera soluzione che desideri è probabilmente implementare un validatore rigoroso. Stack Overflow è probabilmente un buon posto per svilupparlo, perché ci sono molte persone con esperienza pratica.

Ecco un paio di cose che ti servono:

  1. taglia gli spazi bianchi e ovviamente l'innesto.
  2. analizzare in singole parti (nome visualizzato, lato sinistro dell'indirizzo, lato destro dell'indirizzo).
  3. convalidare ciascuno di questi con un validatore specifico per la struttura dei dati. Ad esempio, il lato destro deve essere un nome di dominio completo valido (o nome host non qualificato se si utilizza un sistema di posta liberale).

Questo è il miglior approccio a lungo termine per risolvere questo problema.

Posso suggerire la mia soluzione basata su regex per decodificare i valori dei campi dell'indirizzo e-mail (" Da " ;, " A ") e il valore del campo " soggetto quot &;

https: // www .codeproject.com / Consigli / 1198601 / parsing-e-decodifica-valori-of-Alcuni-mail-Message

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top