Was ist der eleganteste Code, um zu überprüfen, ob eine Zeichenkette eine gültige E-Mail-Adresse ist?
Antworten
Zu viele Anzeigen?Persönlich würde ich sagen, dass Sie einfach sicherstellen sollten, dass ein @-Symbol darin vorkommt, möglicherweise mit einem . Es gibt viele Regexe mit unterschiedlicher Korrektheit, aber ich denke, dass die meisten davon gültige E-Mail-Adressen auslassen oder ungültige durchlassen. Wenn jemand eine gefälschte E-Mail-Adresse eingeben will, wird er eine gefälschte Adresse eingeben. Wenn Sie überprüfen müssen, ob die E-Mail-Adresse echt ist und ob die Person die Kontrolle über diese E-Mail-Adresse hat, müssen Sie ihr eine E-Mail mit einem speziellen kodierten Link schicken, damit sie überprüfen kann, ob es sich tatsächlich um eine echte Adresse handelt.
Kurzer und präziser Code
string Email = txtEmail.Text;
if (Email.IsValidEmail())
{
//use code here
}
public static bool IsValidEmail(this string email)
{
string pattern = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|" + @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)" + @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";
var regex = new Regex(pattern, RegexOptions.IgnoreCase);
return regex.IsMatch(email);
}
Ich denke, der beste Weg ist der folgende:
public static bool EmailIsValid(string email)
{
string expression = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
if (Regex.IsMatch(email, expression))
{
if (Regex.Replace(email, expression, string.Empty).Length == 0)
{
return true;
}
}
return false;
}
Sie können diese statische Funktion in einer allgemeinen Klasse haben.
Der eleganteste Weg ist die Verwendung der in .Net eingebauten Methoden.
Diese Methoden:
-
sind erprobt und bewährt. Diese Methoden werden in meinen eigenen professionellen Projekten eingesetzt.
-
Verwenden Sie intern reguläre Ausdrücke, die zuverlässig und schnell sind.
-
Hergestellt von Microsoft für C#. Es gibt keinen Grund, das Rad neu zu erfinden.
-
Gibt ein boolsches 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 zu Ihrem Projekt hinzu:
System.ComponentModel.DataAnnotations
Jetzt können Sie den folgenden Code verwenden:
(new EmailAddressAttribute().IsValid("youremailhere@test.test"));
Beispiel für die Verwendung
Hier sind einige Methoden zu deklarieren:
protected List<string> GetRecipients() // Gets recipients from TextBox named `TxtRecipients`
{
List<string> MethodResult = null;
try
{
List<string> Recipients = TxtRecipients.Text.Replace(",",";").Replace(" ", "").Split(';').ToList();
List<string> RecipientsCleaned = new List<string>();
foreach (string Recipient in RecipientsCleaned)
{
if (!String.IsNullOrWhiteSpace(Recipient))
{
RecipientsNoBlanks.Add(Recipient);
}
}
MethodResult = RecipientsNoBlanks;
}
catch//(Exception ex)
{
//ex.HandleException();
}
return MethodResult;
}
public static bool IsValidEmailAddresses(List<string> recipients)
{
List<string> InvalidAddresses = GetInvalidEmailAddresses(recipients);
return InvalidAddresses != null && InvalidAddresses.Count == 0;
}
public static List<string> GetInvalidEmailAddresses(List<string> recipients)
{
List<string> MethodResult = null;
try
{
List<string> InvalidEmailAddresses = new List<string>();
foreach (string Recipient in recipients)
{
if (!(new EmailAddressAttribute().IsValid(Recipient)) && !InvalidEmailAddresses.Contains(Recipient))
{
InvalidEmailAddresses.Add(Recipient);
}
}
MethodResult = InvalidEmailAddresses;
}
catch//(Exception ex)
{
//ex.HandleException();
}
return MethodResult;
}
...und Code, der sie in Aktion zeigt:
List<string> Recipients = GetRecipients();
bool IsValidEmailAddresses = IsValidEmailAddresses(Recipients);
if (IsValidEmailAddresses)
{
//Emails are valid. Your code here
}
else
{
StringBuilder sb = new StringBuilder();
sb.Append("The following addresses are invalid:");
List<string> InvalidEmails = GetInvalidEmailAddresses(Recipients);
foreach (string InvalidEmail in InvalidEmails)
{
sb.Append("\n" + InvalidEmail);
}
MessageBox.Show(sb.ToString());
}
Außerdem dieses Beispiel:
- Geht über die Spezifikation hinaus, da eine einzelne Zeichenkette verwendet wird, um 0, eine oder mehrere E-Mail-Adressen, getrennt durch ein Semikolon, zu enthalten.
;
. - Zeigt anschaulich, wie man die IsValid-Methode des EmailAddressAttribute-Objekts verwendet.
Alternativ, für Benutzer einer Version von .Net kleiner als 4.5
Für Situationen, in denen .Net 4.5 nicht verfügbar ist, verwende ich die folgende Lösung:
Genauer gesagt, ich verwende:
public static bool IsValidEmailAddress(string emailAddress)
{
bool MethodResult = false;
try
{
MailAddress m = new MailAddress(emailAddress);
MethodResult = m.Address == emailAddress;
}
catch //(Exception ex)
{
//ex.HandleException();
}
return MethodResult;
}
public static List<string> GetInvalidEmailAddresses(List<string> recipients)
{
List<string> MethodResult = null;
try
{
List<string> InvalidEmailAddresses = new List<string>();
foreach (string Recipient in recipients)
{
if (!IsValidEmail(Recipient) && !InvalidEmailAddresses.Contains(Recipient))
{
InvalidEmailAddresses.Add(Recipient);
}
}
MethodResult = InvalidEmailAddresses;
}
catch //(Exception ex)
{
//ex.HandleException();
}
return MethodResult;
}
Um ehrlich zu sein, in der Produktion Code, das Beste, was ich tun, ist für eine Überprüfung @
Symbol.
Ich bin nie in der Lage, E-Mails vollständig zu validieren. Wissen Sie, wie ich herausfinde, ob sie wirklich gültig war? Wenn sie abgeschickt wurde. Wenn nicht, ist es schlecht, wenn ja, ist das Leben gut. Das ist alles, was ich wissen muss.