Frage

die E-Mail-Adresse Gegeben: "Jim"

Wenn ich versuche, dies zu Mailaddress passieren bekomme ich die Ausnahme:

  

Der angegebene String ist in der Form nicht für eine E-Mail-Adresse erforderlich.

Wie analysiere ich diese Adresse in einen Anzeigenamen (Jim) und E-Mail-Adresse (jim@example.com) in C #?

EDIT:. Ich suche nach C # -Code, um es zu analysieren

EDIT2: Ich fand, dass die Ausnahme von Mailaddress geworfen wurde, weil ich einen Platz am Anfang der E-Mail-Adresse Zeichenfolge hatte.

War es hilfreich?

Lösung

Wenn Sie schauen, um die E-Mail-Adresse manuell zu analysieren, möchten Sie RFC2822 ( http://msdn.microsoft.com/en-us/library /591bk9e8.aspx

Es sollte in der Lage sein, eine Adresse mit dem Anzeigenamen zu analysieren. Sie geben "Tom Smith <tsmith@contoso.com>" als Beispiel. Vielleicht sind die Anführungszeichen das Problem? Wenn ja, nur die Anführungszeichen Streifen aus und verwenden Mailaddress den Rest zu analysieren.

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

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

manuell Parsen RFC2822 ist nicht der Mühe wert, wenn Sie es vermeiden können.

Andere Tipps

Funktioniert bei mir:

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

Die Mailaddress-Klasse verfügt über eine eigene Methode, die eine E-Mail-Adresse analysiert. Sie wissen nicht, wie gut es ist, aber ich würde es dazu neigen, eher zu verwenden, als meine eigenen zu schreiben.

Versuchen:

"Jimbo <jim@example.com>"

Versuch: "Jim" wenn es wird nicht sicher funktionieren, aber das ist, wie ich sehe es in der Regel in E-Mail-Clients.

Wenn Sie die Annahme, es zu machen ist immer ein Raum zwischen dem 2, könnten Sie einfach String.Split verwenden (‘‚) auf die Räume zu teilen. Das würde man ein Array mit den Teilen.

so vielleicht wie folgt aus:

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

Ein Problem mit diesem zu prüfen ist, dass, wenn der Anzeigename ein Leerzeichen enthält, wird sie in zwei oder mehr Elemente in Ihrem Array aufgeteilt wird selbst, sondern die E-Mail würde immer letzte Mal gewesen sein.

Bearbeiten - Sie könnten auch die Halterungen herausschneiden müssen, nur ersetzt hinzufügen mit denen.

Ich schrieb diese auf, es die erste gut gebildet E-Mail-Adresse aus einer Zeichenkette packt. Auf diese Weise müssen Sie nicht davon ausgehen, wo die E-Mail-Adresse in der Zeichenfolge

Es gibt viel Raum für Verbesserungen, aber ich brauche, um Arbeit zu verlassen:)

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

Es ist ein bisschen „rough and ready“, sondern für das Beispiel, das Sie gegeben haben, funktioniert:

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

analysieren, um die Zeichenfolge, die Sie haben:

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

eingebettete Leerzeichen zu handhaben, auf den Konsolen aufgeteilt, wie folgt:

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

Also, das ist das, was ich getan habe. Es ist ein wenig schnell und schmutzig, aber scheint zu funktionieren.

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

Kommentare?

ich in dieser Sprache nicht Code zu tun, aber ich sehe zwei Probleme mögen Sie vielleicht überprüfen:

1- Sie nicht genau wissen, warum es wurde abgelehnt. Auf sofortige Möglichkeit war, dass es eine schwarze Liste für example.com hat.

2- Die wirkliche Lösung, die Sie wollen, ist wahrscheinlich einen strengen Validator zu implementieren. Stack-Überlauf ist wahrscheinlich ein guter Ort, dies zu entwickeln, denn es gibt viele Leute mit praktischer Erfahrung.

Hier sind ein paar Dinge, die Sie brauchen:

  1. trimmen Leerzeichen und offensichtlich cruft.
  2. analysieren in einzelne Teile (Anzeigename, links Seite der Adresse, rechten Seite der Adresse).
  3. validieren jede dieser mit einer Datenstruktur spezifischen Validator. Zum Beispiel muss die rechte Seite ein gültiger FQDN (oder unqualifizierte Hostnamen, wenn Sie auf einem liberal-Mail-System sind) sein.

Das ist der beste langfristige Ansatz zur Lösung dieses Problems.

Ich kann meine regex-basierte Lösung für die Decodierung E-Mail-Adresse Feldwert ( „From“, „To“) und Feldwert „Betreff“

vorschlagen

https: // www .codeproject.com / Tips / 1198601 / Parsing-und-Decodierung-Werte-of-some-E-Mail-Nachricht

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top