Comment analyser une adresse électronique formatée en un nom complet et une adresse électronique?

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

  •  03-07-2019
  •  | 
  •  

Question

Étant donné l'adresse électronique: " Jim " < jim@example.com >

Si j'essaie de transmettre ceci à MailAddress, j'obtiens l'exception:

  

La chaîne spécifiée n'est pas sous la forme requise pour une adresse de messagerie.

Comment analyser cette adresse dans un nom complet (Jim) et une adresse électronique (jim@example.com) en C #?

EDIT: Je cherche du code C # pour l’analyser.

EDIT2: J'ai constaté que l'exception était émise par MailAddress car j'avais un espace au début de la chaîne d'adresse électronique.

Était-ce utile?

La solution

Si vous souhaitez analyser manuellement l'adresse électronique, vous souhaitez lire la RFC2822 ( https://tools.ietf.org/html/rfc822.html#section-3.4 ). La section 3.4 parle du format de l’adresse.

Toutefois, analyser correctement les adresses électroniques n'est pas une tâche facile et MailAddress devrait être en mesure de gérer la plupart des scénarios.

Selon la documentation MSDN pour "Tom Smith <tsmith@contoso.com>":

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

Il devrait pouvoir analyser une adresse avec un nom d'affichage. Ils donnent <=> à titre d'exemple. Peut-être que les citations sont le problème? Si tel est le cas, supprimez simplement les guillemets et utilisez MailAddress pour analyser le reste.

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

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

L'analyse manuelle de la RFC2822 ne vaut pas la peine si vous pouvez l'éviter.

Autres conseils

Fonctionne pour moi:

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 a une méthode privée qui analyse une adresse email. Je ne sais pas à quel point c'est bon, mais j'aurais tendance à l'utiliser plutôt que d'écrire le mien.

Essayez:

"Jimbo <jim@example.com>"

essayez: " Jim " < jim@example.com > Je ne sais pas si ça va marcher, mais c'est ce que je vois généralement dans les clients de messagerie.

si vous faites l'hypothèse qu'il y a toujours un espace entre les 2, vous pouvez simplement utiliser String.Split ('') pour le diviser sur les espaces. Cela vous donnerait un tableau avec les parties divisées.

alors peut-être comme ça:

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

Un problème avec ceci à vérifier est que si le nom complet contient un espace, il sera divisé en 2 éléments ou plus dans votre tableau, mais le courrier électronique sera toujours le dernier.

Modifier - vous devrez peut-être également supprimer les crochets, il suffit d’ajouter les remplace à ceux-ci.

Je viens d'écrire ceci, il saisit la première adresse e-mail bien formée dans une chaîne. De cette façon, vous n'avez pas à supposer où se trouve l'adresse de messagerie dans la chaîne

Il reste encore beaucoup à faire, mais je dois partir pour le travail:)

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");
    }
}

C'est un peu & "brutal et prêt"! mais fonctionnera pour l'exemple que vous avez donné:

        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");

pour analyser la chaîne que vous avez donnée:

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]);

Pour gérer les espaces incorporés, séparez les crochets de la manière suivante:

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]);

Donc, voici ce que j'ai fait. C'est un peu rapide et sale, mais semble fonctionner.

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);

Commentaires?

Je ne code pas dans cette langue, mais je vois deux problèmes à vérifier:

1- Vous ne savez pas exactement pourquoi cela a été rejeté. La possibilité immédiate était qu’il ait une liste noire pour example.com.

2- La vraie solution que vous souhaitez est probablement de mettre en place un validateur strict. Stack Overflow est probablement un bon endroit pour développer cela, car beaucoup de personnes ont une expérience pratique.

Voici quelques éléments dont vous avez besoin:

  1. coupez les espaces et bien sûr cruellement.
  2. analyser des parties individuelles (nom d'affichage, côté gauche de l'adresse, côté droit de l'adresse).
  3. validez chacun d'eux avec un validateur spécifique à la structure de données. Par exemple, le côté droit doit être un nom de domaine complet valide (ou un nom d’hôte non qualifié si vous êtes sur un système de messagerie libéral).

C’est la meilleure approche à long terme pour résoudre ce problème.

Je peux suggérer ma solution basée sur regex pour le décodage des valeurs de champ d'adresse électronique (& "; De &"; & "à &";) et de la valeur de champ & "; Sujet & Quot;

https: // www .codeproject.com / Tips / 1198601 / Message d'analyse et de décodage d'un message électronique

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top