Was ist der eleganteste Code, um zu überprüfen, ob eine Zeichenfolge eine gültige E-Mail-Adresse ist?
c#
email
email-validation
Leora
quelle
quelle
Antworten:
Was ist damit?
Zur Verdeutlichung wird die Frage gestellt, ob eine bestimmte Zeichenfolge eine gültige Darstellung einer E-Mail-Adresse ist und nicht, ob eine E-Mail-Adresse ein gültiges Ziel zum Senden einer Nachricht ist. Der einzige wirkliche Weg besteht darin, eine Nachricht zur Bestätigung zu senden.
Beachten Sie, dass E-Mail-Adressen verzeihender sind, als Sie zunächst annehmen könnten. Dies sind alles vollkommen gültige Formen:
In den meisten Anwendungsfällen ist ein falsches "ungültig" für Ihre Benutzer und die Zukunftssicherung viel schlechter als ein falsches "gültig". Hier ist ein Artikel, der früher die akzeptierte Antwort auf diese Frage war (diese Antwort wurde inzwischen gelöscht). Es enthält viel mehr Details und einige andere Ideen zur Lösung des Problems.
Die Bereitstellung von Sanity Checks ist immer noch eine gute Idee für die Benutzererfahrung. Angenommen, die E-Mail-Adresse ist gültig, können Sie nach bekannten Domains der obersten Ebene suchen, die Domain auf einen MX-Eintrag überprüfen, nach Rechtschreibfehlern bei allgemeinen Domainnamen (gmail.cmo) suchen usw. Anschließend eine Warnung an den Benutzer senden eine Chance zu sagen "Ja, mein Mailserver erlaubt wirklich 🌮🍳🎁 als E-Mail-Adresse."
Ich stimme zu, dass die Verwendung der Ausnahmebehandlung für die Geschäftslogik vermieden werden sollte. Dies ist jedoch einer der Fälle, in denen die Bequemlichkeit und Klarheit das Dogma überwiegen kann.
Wenn Sie mit der E-Mail-Adresse etwas anderes tun, müssen Sie sie wahrscheinlich in eine Mail-Adresse umwandeln. Auch wenn Sie nicht genau diese Funktion verwenden, möchten Sie wahrscheinlich dasselbe Muster verwenden. Sie können auch nach bestimmten Arten von Fehlern suchen, indem Sie verschiedene Ausnahmen abfangen: null, leer oder ungültiges Format.
Laut Stuarts Kommentar vergleicht dies die endgültige Adresse mit der ursprünglichen Zeichenfolge, anstatt immer true zurückzugeben. MailAddress versucht, eine Zeichenfolge mit Leerzeichen in die Bereiche "Anzeigename" und "Adresse" zu analysieren, sodass die ursprüngliche Version falsch positive Ergebnisse zurückgibt.
--- Weiterführende Literatur ---
Dokumentation für System.Net.Mail.MailAddress
Erläuterung, woraus eine gültige E-Mail-Adresse besteht
quelle
System.Net.Mail
Klassen zum Senden von E-Mails verwenden. Dies ist wahrscheinlich der Fall, wenn Sie .NET verwenden. Wir haben uns für diese Art der Validierung entschieden, weil es keinen Sinn macht, E-Mail-Adressen zu akzeptieren - auch gültige -, an die wir keine E-Mails senden können.IsValidEmail("this is not valid@email$com");
Dies ist eine alte Frage, aber alle Antworten, die ich auf SO gefunden habe, einschließlich neuerer, werden ähnlich wie diese beantwortet. In .Net 4.5 / MVC 4 können Sie einem Formular jedoch eine E-Mail-Adressüberprüfung hinzufügen, indem Sie die Anmerkung [EmailAddress] aus System.ComponentModel.DataAnnotations hinzufügen. Daher habe ich mich gefragt, warum ich die integrierte Funktionalität von nicht einfach verwenden kann. Netto im Allgemeinen.
Dies scheint zu funktionieren und scheint mir ziemlich elegant zu sein:
quelle
EmailAddressAttribute
weniger zulässig ist alsSystem.Net.Mail.MailAddress
beispielsweiseMailAddress
eine Adresse für eine TLD akzeptiert. Nur etwas zu beachten, wenn Sie so freizügig wie möglich sein müssen.foo.IsValid(null);
zurückkehrttrue
.Ich benutze diese Single-Liner-Methode, die die Arbeit für mich erledigt.
Gemäß den Kommentaren wird dies "fehlschlagen", wenn die
source
(die E-Mail-Adresse) null ist.quelle
public static Boolean IsValidMailAddress(this String pThis) => pThis == null ? false : new EmailAddressAttribute().IsValid(pThis);
public static bool IsValidEmailAddress(this string address) => address != null && new EmailAddressAttribute().IsValid(address);
false
für Nullzeichenfolgen zurückgegeben werden sollte. Deshalb schlage ich die (noch besser bessere) ++ Version vor :public static bool IsValidEmailAddress(this string address) => new EmailAddressAttribute().IsValid(address ?? throw new ArgumentNullException());
. Ich werde jetzt die reformierte Kirche der noch besseren, besseren Versionisten gründen..net 4.5 System.ComponentModel.DataAnnotations.EmailAddressAttribute hinzugefügt
Sie können die Quelle von EmailAddressAttribute durchsuchen. Dies ist der Regex, der intern verwendet wird:
quelle
RegexOptions.IgnoreCase
da dieses Muster keine expliziten Großbuchstaben zulässt!Ich habe Phils Antwort von # 1 genommen und diese Klasse erstellt. Nennen Sie es so:
bool isValid = Validator.EmailIsValid(emailString);
Hier ist die Klasse:
quelle
Persönlich würde ich sagen, dass Sie nur sicherstellen sollten, dass sich dort ein @ -Symbol befindet, möglicherweise mit einem. Charakter. Es gibt viele reguläre Ausdrücke, die Sie mit unterschiedlicher Korrektheit verwenden können, aber ich denke, die meisten davon lassen gültige E-Mail-Adressen aus oder lassen ungültige durch. Wenn Leute eine gefälschte E-Mail-Adresse eingeben möchten, geben sie eine gefälschte ein. Wenn Sie überprüfen müssen, ob die E-Mail-Adresse legitim ist und ob die Person die Kontrolle über diese E-Mail-Adresse hat, müssen Sie ihnen eine E-Mail mit einem speziellen codierten Link senden, damit sie überprüfen können, ob es sich tatsächlich um eine echte Adresse handelt.
quelle
Ich denke, der beste Weg ist wie folgt:
Sie können diese statische Funktion in einer allgemeinen Klasse haben.
quelle
Kurzer und genauer Code
quelle
Am elegantesten ist es, die in .Net integrierten Methoden zu verwenden.
Diese Methoden:
Sind bewährt. Diese Methoden werden in meinen eigenen beruflichen Projekten verwendet.
Verwenden Sie intern reguläre Ausdrücke, die zuverlässig und schnell sind.
Hergestellt von Microsoft für C #. Das Rad muss nicht neu erfunden werden.
Gibt ein Bool-Ergebnis zurück. True bedeutet, dass die E-Mail gültig ist.
Für Benutzer von .Net 4.5 und höher
Fügen Sie diese Referenz Ihrem Projekt hinzu:
Jetzt können Sie den folgenden Code verwenden:
Anwendungsbeispiel
Hier sind einige Methoden zum Deklarieren:
... und Code, der sie in Aktion demonstriert:
Außerdem dieses Beispiel:
;
.Alternative für Benutzer einer Version von .Net unter 4.5
In Situationen, in denen .Net 4.5 nicht verfügbar ist, verwende ich die folgende Lösung:
Insbesondere benutze ich:
quelle
EmailAddressAttribute
um knapp vier Monate, obwohl dieser dasnull
Problem auffängt .Um ehrlich zu sein, suche ich im Produktionscode am besten nach einem
@
Symbol.Ich bin nie in der Lage, E-Mails vollständig zu validieren. Sie wissen, wie ich sehe, ob es wirklich gültig war? Wenn es gesendet wurde. Wenn nicht, ist es schlecht, wenn ja, ist das Leben gut. Das ist alles was ich wissen muss.
quelle
Ich finde, dass dieser reguläre Ausdruck ein guter Kompromiss zwischen der Suche nach mehr als nur der @ -Marke und dem Akzeptieren seltsamer Randfälle ist:
Es wird Sie zumindest dazu bringen, etwas um die @ -Marke zu setzen und zumindest eine normal aussehende Domain.
quelle
bob@companyinternal
?Die Überprüfung der E-Mail-Adresse ist nicht so einfach, wie es scheint. Es ist theoretisch unmöglich, eine E-Mail-Adresse nur mit einem regulären Ausdruck vollständig zu validieren.
In meinem Blogbeitrag finden Sie eine Diskussion zu diesem Thema und eine F # -Implementierung mit FParsec. [/ shameless_plug]
quelle
Hier ist meine Antwort: Phils Lösung schlägt für Domänen mit einem Buchstaben wie "[email protected]" fehl. Ob Sie es glauben oder nicht, das wird verwendet =) (geht zum Beispiel zu centurylink).
Phils Antwort wird auch nur mit dem PCRE-Standard funktionieren ... also wird C # es nehmen, aber Javascript wird bombardieren. Es ist zu komplex für Javascript. Sie können Phils Lösung also nicht für MVC-Validierungsattribute verwenden.
Hier ist meine Regex. Es funktioniert gut mit MVC-Validierungsattributen.
- Alles vor dem @ wird vereinfacht, so dass zumindest Javascript funktioniert. Ich bin in Ordnung, die Validierung hier zu lockern, solange der Exchange-Server mir keine 5.1.3 gibt. - Alles nach dem @ ist Phils Lösung, die für Domänen mit einem Buchstaben geändert wurde.
Für Leute, die vorschlagen, system.net.mail MailMessage () zu verwenden, ist dieses Ding viel zu flexibel. Sicher, C # akzeptiert die E-Mail, aber dann wird der Exchange-Server mit dem Laufzeitfehler 5.1.3 bombardiert, sobald Sie versuchen, die E-Mail zu senden.
quelle
basket@ball
als gültige E-Mail-Adresse akzeptiert wird, die richtige Antwort sowie all diese positiven Stimmen erhalten hat. Danke trotzdem!Wenn Sie wirklich und ich meine wirklich wissen wollen, ob eine E-Mail-Adresse gültig ist ... bitten Sie den Mail-Austauscher, dies zu beweisen, es ist keine Regex erforderlich. Ich kann den Code auf Anfrage bereitstellen.
Die allgemeinen Schritte lauten wie folgt: 1. Hat die E-Mail-Adresse einen Domainnamen-Teil? (Index von @> 0) 2. Fragen Sie mithilfe einer DNS-Abfrage, ob die Domäne über einen Mail-Austauscher verfügt. 3. Öffnen Sie die TCP-Verbindung zum Mail-Austauscher. 4. Öffnen Sie mithilfe des SMTP-Protokolls eine Nachricht an den Server, indem Sie die E-Mail-Adresse als Empfänger verwenden. 5. Analysieren Sie die Antwort des Servers. 6. Beenden Sie die Nachricht, wenn Sie es bis hierher geschafft haben. Alles ist gut.
Dies ist, wie Sie sich vorstellen können, zeitlich sehr teuer und basiert auf SMTP, aber es funktioniert.
quelle
Im Allgemeinen ist es nicht einfach, einen regulären Ausdruck zum Überprüfen von E-Mail-Adressen zu finden. Zum Zeitpunkt dieses Schreibens muss die Syntax einer E-Mail-Adresse einer relativ hohen Anzahl von Standards entsprechen, und die Implementierung aller Standards in einem regulären Ausdruck ist praktisch nicht durchführbar!
Ich empfehle Ihnen dringend , unser EmailVerify.NET zu testen , eine ausgereifte .NET-Bibliothek, die E-Mail-Adressen nach allen aktuellen IETF-Standards validieren kann (RFC 1123, RFC 2821, RFC 2822, RFC 3696, RFC 4291, RFC 5321 und RFC 5322). , testet die zugehörigen DNS-Einträge, prüft, ob die Zielpostfächer Nachrichten annehmen und sogar feststellen können, ob eine bestimmte Adresse verfügbar ist oder nicht.
Haftungsausschluss: Ich bin der Hauptentwickler für diese Komponente.
quelle
quelle
Falls Sie verwenden FluentValidation könnten Sie etwas so einfach wie schreiben:
quelle
eine kleine Änderung an @Cogwheel Antwort
quelle
Console.WriteLine(MailAddress("asdf@asdf.").Address);
gibt "asdf @ asdf." Aus, was nicht gültig ist.Hier gibt es viele starke Antworten. Ich empfehle jedoch, einen Schritt zurückzutreten. @Cogwheel beantwortet die Frage https://stackoverflow.com/a/1374644/388267 . In einem Massenvalidierungsszenario kann es jedoch kostspielig sein, wenn viele der zu validierenden E-Mail-Adressen ungültig sind. Ich schlage vor, dass wir ein bisschen Logik anwenden, bevor wir in seinen Try-Catch-Block eintreten. Ich weiß, dass der folgende Code mit RegEx geschrieben werden kann, aber das Verständnis für neue Entwickler kann kostspielig sein. Das ist meine zwei Pence wert:
quelle
Die am häufigsten gewählte Antwort von @Cogwheel ist die beste Antwort. Ich habe jedoch versucht, die
trim()
Zeichenfolgenmethode zu implementieren , damit der gesamte Leerraum des Benutzers vom Anfang bis zum Ende der Zeichenfolge abgeschnitten wird . Überprüfen Sie den Code unten für ein vollständiges Beispiel.quelle
SanitizeEmail(string email)
, bei der das Ergebnis dieser Methode zum Validieren und Senden der E-Mail an verwendet wird.quelle
Überprüfen Sie, ob die E-Mail-Zeichenfolge das richtige oder das falsche Format hat
System.Text.RegularExpressions
:quelle
/ Verwenden des internen Regex, der beim Erstellen des "neuen EmailAddressAttribute ()" verwendet wird; Komponente in .Net4.5 >>> using System.ComponentModel.DataAnnotations; // So überprüfen Sie eine E-Mail-Adresse ...... Getestet und funktioniert.
Sie können auch Folgendes verwenden:
http://msdn.microsoft.com/en-us/library/01escwtf(v=vs.110).aspx
quelle
Ich habe die Antwort von Poyson 1 folgendermaßen zusammengefasst:
quelle
Der einfache Weg, die E-Mail-ID zu identifizieren, ist gültig oder nicht.
quelle
Es gibt ein Kulturproblem in Regex in C # und nicht in js. Daher müssen wir Regex im US-Modus für die E-Mail-Prüfung verwenden. Wenn Sie den ECMAScript-Modus nicht verwenden, werden Ihre Sprach-Sonderzeichen in AZ mit Regex angezeigt.
quelle
Am Ende habe ich diesen regulären Ausdruck verwendet, da er Kommas, Kommentare, Unicode-Zeichen und IP-Domänenadressen (v4) erfolgreich überprüft.
Gültige Adressen sind:
quelle
Eine einfache ohne Regex (die ich wegen ihrer schlechten Lesbarkeit nicht mag):
Beispiele:
IsValidEmail("@b.com") // false
IsValidEmail("[email protected]") // false
IsValidEmail("a@bcom") // false
IsValidEmail("a.b@com") // false
IsValidEmail("a@b.") // false
IsValidEmail("a [email protected]") // false
IsValidEmail("a@b c.com") // false
IsValidEmail("[email protected]") // true
IsValidEmail("[email protected]") // true
IsValidEmail("[email protected]") // true
IsValidEmail("[email protected]") // true
Es soll einfach sein und behandelt daher keine seltenen Fälle wie E-Mails mit Domänen in Klammern, die Leerzeichen enthalten (normalerweise zulässig), E-Mails mit IPv6-Adressen usw.
quelle
Hier ist eine Antwort auf Ihre Frage, die Sie überprüfen können.
quelle
Basierend auf der Antwort von @Cogwheel möchte ich eine modifizierte Lösung teilen, die für SSIS und die "Skriptkomponente" funktioniert:
Platzieren Sie diesen Code in der richtigen Methode:
Anschließend können Sie eine bedingte Aufteilung verwenden, um alle ungültigen Datensätze herauszufiltern oder was auch immer Sie tun möchten.
quelle