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?

1027voto

Cogwheel Punkte 21865

Und was ist damit?

bool IsValidEmail(string email)
{
    var trimmedEmail = email.Trim();

    if (trimmedEmail.EndsWith(".")) {
        return false; // suggested by @TK-421
    }
    try {
        var addr = new System.Net.Mail.MailAddress(email);
        return addr.Address == trimmedEmail;
    }
    catch {
        return false;
    }
}

Gemäß Stuarts Kommentar vergleicht dies die endgültige Adresse mit der ursprünglichen Zeichenkette, anstatt immer true zurückzugeben. MailAddress versucht, eine Zeichenkette mit Leerzeichen in die Teile "Anzeigename" und "Adresse" zu zerlegen, so dass die ursprüngliche Version falsch positive Ergebnisse lieferte.


Zur Klarstellung: Die Frage lautet, ob eine bestimmte Zeichenkette eine gültige Darstellung einer E-Mail-Adresse ist, nicht ob eine E-Mail-Adresse ein gültiges Ziel für den Versand einer Nachricht ist. Die einzige Möglichkeit besteht darin, eine Nachricht zur Bestätigung zu senden.

Beachten Sie, dass E-Mail-Adressen mehr verzeihen, als Sie vielleicht zunächst annehmen. Alle diese Formen sind vollkommen gültig:

  • zahnrad@rad
  • "zahnrad die orange"@example.com
  • 123@$.xyz

Für die meisten Anwendungsfälle ist ein falsches "ungültig" viel schlimmer für Ihre Benutzer und die Zukunftssicherheit als ein falsches "gültig". Hier ist ein Artikel, der früher die akzeptierte Antwort war auf diese Frage (diese Antwort wurde inzwischen gelöscht). Sie enthält viel mehr Details und einige andere Ideen, wie das Problem gelöst werden kann.

Die Durchführung von Plausibilitätsprüfungen ist immer noch eine gute Idee für die Benutzerfreundlichkeit. Unter der Annahme, dass die E-Mail-Adresse gültig ist, könnten Sie nach bekannten Top-Level-Domänen suchen, die Domäne auf einen MX-Eintrag überprüfen, nach Rechtschreibfehlern bei gängigen Domänennamen (gmail.cmo) suchen usw. Dann sollte eine Warnung angezeigt werden, die dem Benutzer die Möglichkeit gibt, zu sagen: "Ja, mein Mailserver erlaubt wirklich eine E-Mail-Adresse".


Was die Verwendung der Ausnahmebehandlung für die Geschäftslogik betrifft, so stimme ich zu, dass dies zu vermeiden ist. Aber dies ist einer der Fälle, in denen die Bequemlichkeit und Klarheit das Dogma überwiegen kann.

Außerdem werden Sie die E-Mail-Adresse wahrscheinlich in eine MailAddress umwandeln, wenn Sie etwas anderes mit ihr machen. Auch wenn Sie nicht genau diese Funktion verwenden, werden Sie wahrscheinlich das gleiche Muster verwenden wollen. Sie können auch auf bestimmte Arten von Fehlern prüfen, indem Sie Folgendes abfangen verschiedene Ausnahmen : null, leer oder ungültiges Format.


--- Weitere Lektüre ---

Dokumentation für System.Net.Mail.MailAddress

Erläuterung, was eine gültige E-Mail-Adresse ausmacht

316voto

imjosh Punkte 4398

Dies ist eine alte Frage, aber alle Antworten, die ich auf SO gefunden habe, einschließlich der neueren, sind ähnlich wie diese beantwortet. In .Net 4.5 / MVC 4 können Sie jedoch die Validierung von E-Mail-Adressen zu einem Formular hinzufügen, indem Sie die [EmailAddress]-Anmerkung aus System.ComponentModel.DataAnnotations hinzufügen, also habe ich mich gefragt, warum ich nicht einfach die integrierte Funktionalität von .Net im Allgemeinen verwenden konnte.

Dies scheint zu funktionieren und erscheint mir recht elegant:

using System.ComponentModel.DataAnnotations;

class ValidateSomeEmails
{
    static void Main(string[] args)
    {
        var email = new EmailAddressAttribute();
        email.IsValid("someone@somewhere.com");         //true
        email.IsValid("someone@somewhere.co.uk");       //true
        email.IsValid("someone+tag@somewhere.net");     //true
        email.IsValid("futureTLD@somewhere.fooo");      //true

        email.IsValid("fdsa");                          //false
        email.IsValid("fdsa@");                         //false
        email.IsValid("fdsa@fdsa");                     //false
        email.IsValid("fdsa@fdsa.");                    //false

        //one-liner
        if (new EmailAddressAttribute().IsValid("someone@somewhere.com")) 
            return true;
    }
}

85voto

Manik Arora Punkte 4542

Ich verwende die Single-Liner-Methode, die die Arbeit für mich erledigt.

using System.ComponentModel.DataAnnotations;
public bool IsValidEmail(string source)
{
    return new EmailAddressAttribute().IsValid(source);
}

Gemäß den Kommentaren wird dies "fehlschlagen", wenn die source (die E-Mail-Adresse) ist null.

public static bool IsValidEmailAddress(this string address) => address != null && new EmailAddressAttribute().IsValid(address);

50voto

Chad Grant Punkte 41992

.net 4.5 hinzugefügt System.ComponentModel.DataAnnotations.EmailAddressAttribute

Sie können die Quelle von EmailAddressAttribute Dies ist die Regex, die intern verwendet wird:

const string pattern = @"^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$";

47voto

David Silva Smith Punkte 10859

Ich habe die Antwort von Phil aus Nr. 1 übernommen und diese Klasse erstellt. Nennen Sie sie so: bool isValid = Validator.EmailIsValid(emailString);

Hier ist die Klasse:

using System.Text.RegularExpressions;

public static class Validator
{

    static Regex ValidEmailRegex = CreateValidEmailRegex();

    /// <summary>
    /// Taken from http://haacked.com/archive/2007/08/21/i-knew-how-to-validate-an-email-address-until-i.aspx
    /// </summary>
    /// <returns></returns>
    private static Regex CreateValidEmailRegex()
    {
        string validEmailPattern = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|"
            + @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)"
            + @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";

        return new Regex(validEmailPattern, RegexOptions.IgnoreCase);
    }

    internal static bool EmailIsValid(string emailAddress)
    {
        bool isValid = ValidEmailRegex.IsMatch(emailAddress);

        return isValid;
    }
}

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