621 Stimmen

C#-Code zur Validierung von E-Mail-Adressen

Was ist der eleganteste Code, um zu überprüfen, ob eine Zeichenkette eine gültige E-Mail-Adresse ist?

7voto

Manuel Fuchs Punkte 362

Ich möchte nur darauf hinweisen, dass es kürzlich eine Ergänzung der .NET-Dokumentation zur E-Mail-Validierung gegeben hat, die auch Regex-Operationen verwendet. Eine ausführliche Erklärung zu deren Implementierung ist dort zu finden.

https://docs.microsoft.com/en-us/dotnet/standard/base-types/how-to-verify-that-strings-are-in-valid-email-format

Der Einfachheit halber finden Sie hier eine Liste ihrer Testergebnisse:

//       Valid: david.jones@proseware.com
//       Valid: d.j@server1.proseware.com
//       Valid: jones@ms1.proseware.com
//       Invalid: j.@server1.proseware.com
//       Valid: j@proseware.com9
//       Valid: js#internal@proseware.com
//       Valid: j_9@[129.126.118.1]
//       Invalid: j..s@proseware.com
//       Invalid: js*@proseware.com
//       Invalid: js@proseware..com
//       Valid: js@proseware.com9
//       Valid: j.s@server1.proseware.com
//       Valid: "j\"s\""@proseware.com
//       Valid: js@contoso.

7voto

Matthew Lock Punkte 12498

Ich finde, diese Regex ist ein guter Kompromiss zwischen der Überprüfung auf mehr als nur das @-Zeichen und der Akzeptanz von seltsamen Randfällen:

^[^@\s]+@[^@\s]+(\.[^@\s]+)+$

Es wird Sie zumindest dazu bringen, etwas um das @-Zeichen herum zu setzen und zumindest eine normal aussehende Domain anzugeben.

6voto

Vasya Milovidov Punkte 485

Ich fasse alle oben genannten Antworten ab dem laufenden Jahr 2021 zusammen, das ich für mich selbst in dieser Klasse geschrieben habe:

public static class StringExt {
    private const string emailPattern = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|" 
            + @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)" 
            + @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";

    public static bool IsValidMailAddress(this string pThis) 
            => pThis is not null 
            && Regex.IsMatch(pThis, emailPattern, RegexOptions.IgnoreCase);
}

5voto

Ralph N Punkte 4050

Hier ist meine Antwort: Phils Lösung versagt bei Domänen mit nur einem Buchstaben wie "someone@q.com". Ob Sie es glauben oder nicht, das wird verwendet =) (geht z.B. an centurylink).

Phil's Antwort wird auch nur mit PCRE-Standard funktionieren... so C# wird es nehmen, aber Javascript wird zu bombardieren. Es ist zu komplex für Javascript. So können Sie nicht verwenden Phil's Lösung für mvc Validierung Attribute.

Hier ist meine Regex. Es wird schön mit MVC Validierung Attribute arbeiten.
- Alles vor dem @ ist vereinfacht, so dass zumindest Javascript funktioniert. Ich habe kein Problem damit, die Validierung hier zu entspannen, solange der Exchange Server mir keine 5.1.3 gibt. - Alles nach dem @ ist Phils Lösung, modifiziert für Domains mit nur einem Buchstaben.

public const string EmailPattern =
        @"^\s*[\w\-\+_']+(\.[\w\-\+_']+)*\@[A-Za-z0-9]([\w\.-]*[A-Za-z0-9])?\.[A-Za-z][A-Za-z\.]*[A-Za-z]$";

Für Leute, die vorschlagen, system.net.mail MailMessage() zu verwenden, ist das Ding VIEL zu flexibel. Sicher, C# wird die E-Mail akzeptieren, aber dann Exchange Server wird mit 5.1.3 Laufzeitfehler bombardieren, sobald Sie versuchen, die E-Mail zu senden.

5voto

Mauricio Scheffer Punkte 97391

Die Überprüfung von E-Mail-Adressen ist nicht so einfach, wie es scheinen mag. Es ist theoretisch unmöglich, eine E-Mail-Adresse nur mit einem regulären Ausdruck vollständig zu validieren.

Sehen Sie sich meine Blogbeitrag für eine Diskussion zu diesem Thema und eine F#-Implementierung mit FParsec. [/shameless_plug]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X