Frage

Ich habe eine Webhook -Posting in einem Formular in meiner Webanwendung und muss die E -Mail -Header -Adressen analysieren.

Hier ist der Quelltext:

Thread-Topic: test subject
Thread-Index: AcwE4mK6Jj19Hgi0SV6yYKvj2/HJbw==
From: "Lastname, Firstname" <firstname_lastname@domain.com>
To: <testto@domain.com>, testto1@domain.com, testto2@domain.com
Cc: <testcc@domain.com>, test3@domain.com
X-OriginalArrivalTime: 27 Apr 2011 13:52:46.0235 (UTC) FILETIME=[635226B0:01CC04E2]

Ich möchte Folgendes herausziehen:

<testto@domain.com>, testto1@domain.com, testto2@domain.com

Ich habe den ganzen Tag ohne Glück mit Regex zu kämpfen.

War es hilfreich?

Lösung

Im Gegensatz zu einigen der Beiträge hier muss ich mit Mmutz zustimmen, Sie können E -Mails nicht mit einem Regex analysieren ... Siehe diesen Artikel:

http://tools.ietf.org/html/rfc2822#section-3.4.1

3.4.1. ADDR-Spec-Spezifikation

Ein ADDR-Spec ist eine spezifische Internet-Kennung, die eine lokal interpretierte Zeichenfolge enthält, gefolgt vom AT-Sign-Zeichen ("@", ASCII-Wert 64), gefolgt von einer Internetdomäne.

Die Idee von "lokal interpretiert" bedeutet, dass nur der empfangende Server erwartet wird, dass er ihn analysieren kann.

Wenn ich versuchen würde, dies zu lösen, würde ich den "To" -Leitungsinhalt finden, sie auseinander brechen und jedes Segment mit System.net.mail.mailaddress analysieren.

    static void Main()
    {
        string input = @"Thread-Topic: test subject
Thread-Index: AcwE4mK6Jj19Hgi0SV6yYKvj2/HJbw==
From: ""Lastname, Firstname"" <firstname_lastname@domain.com>
To: <testto@domain.com>, ""Yes, this is valid""@[emails are hard to parse!], testto1@domain.com, testto2@domain.com
Cc: <testcc@domain.com>, test3@domain.com
X-OriginalArrivalTime: 27 Apr 2011 13:52:46.0235 (UTC) FILETIME=[635226B0:01CC04E2]";

        Regex toline = new Regex(@"(?im-:^To\s*:\s*(?<to>.*)$)");
        string to = toline.Match(input).Groups["to"].Value;

        int from = 0;
        int pos = 0;
        int found;
        string test;

        while(from < to.Length)
        {
            found = (found = to.IndexOf(',', from)) > 0 ? found : to.Length;
            from = found + 1;
            test = to.Substring(pos, found - pos);

            try
            {
                System.Net.Mail.MailAddress addy = new System.Net.Mail.MailAddress(test.Trim());
                Console.WriteLine(addy.Address);
                pos = found + 1;
            }
            catch (FormatException)
            {
            }
        }
    }

Ausgabe aus dem obigen Programm:

testto@domain.com
"Yes, this is valid"@[emails are hard to parse!]
testto1@domain.com
testto2@domain.com

Andere Tipps

Der RFC 2822-konforme E-Mail-Regex lautet:

(?:[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])+)\])

Führen Sie es einfach über Ihren Text aus und Sie erhalten die E -Mail -Adressen.

Natürlich gibt es immer die Möglichkeit, Regex nicht zu verwenden, bei dem Regex nicht die beste Option ist. Aber bis zu dir!

Sie können regelmäßige Ausdrücke nicht verwenden, um RFC2822 -Mails zu analysieren, da ihre Grammatik eine rekursive Produktion enthält (von der Spitze meines Kopfes, es war für Kommentare bestimmt (a (nested) comment)) was die Grammatik nicht regelmäßig macht. Regelmäßige Ausdrücke (wie der Name schon sagt) können nur analysieren regulär Grammatiken.

Siehe auch Regex übereinstimmen offene Tags außer xhtml in sich geschlossene Tags für mehr Informationen.

Wie Blindy vorschlägt, können Sie es manchmal einfach auf altmodische Weise analysieren.

Wenn Sie dies vorziehen, wird hier ein kurzer Ansatz unter der Annahme, dass der E -Mail -Header -Text als "Header" bezeichnet wird:

int start = header.IndexOf("To: ");
int end = header.IndexOf("Cc: ");
string x = header.Substring(start, end-start);

Ich bin vielleicht mit einem Byte in der Subtraktion aus, aber Sie können dies sehr leicht testen und ändern. Natürlich müssen Sie auch sicher sein, dass Sie immer einen CC: Row in Ihrem Header haben, oder dies wird nicht funktionieren.

Es gibt eine Aufschlüsselung der Validierung von E -Mails mit Regex hier, was auf eine praktischere Implementierung von RFC 2822 mit:

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

Es sieht auch so aus, als ob Sie nur die E -Mail -Adressen aus dem Feld "zu" herausholen möchten, und Sie müssen sich auch Sorgen machen, sodass so etwas wie das folgende wahrscheinlich funktionieren würde:

^To: ((?:\<?[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\>?,?(?:\s*))*)

Wie andere erwähnt haben, möchten Sie dies vielleicht nicht tun. Aber wenn Sie möchten, dass Regex diese Eingabe in die Eingabe verwandelt <testto@domain.com>, testto1@domain.com, testto2@domain.com, Das wird es tun.

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