Sprawdzanie, czy format poczty e-mail ciągów jest prawidłowy

W przykładzie w tym artykule użyto wyrażenia regularnego, aby sprawdzić, czy ciąg jest w prawidłowym formacie poczty e-mail.

To wyrażenie regularne jest stosunkowo proste do tego, co można faktycznie użyć jako wiadomości e-mail. Używanie wyrażenia regularnego do sprawdzania poprawności wiadomości e-mail jest przydatne, aby upewnić się, że struktura wiadomości e-mail jest poprawna. Nie jest to jednak podstawianie do sprawdzania, czy wiadomość e-mail rzeczywiście istnieje.

✔️ DO użyj małego wyrażenia regularnego, aby sprawdzić prawidłową strukturę wiadomości e-mail.

✔️ CZY wysłać testową wiadomość e-mail na adres dostarczony przez użytkownika aplikacji.

❌ Nie używaj wyrażenia regularnego jako jedynego sposobu weryfikacji wiadomości e-mail.

Jeśli spróbujesz utworzyć idealne wyrażenie regularne, aby sprawdzić, czy struktura wiadomości e-mail jest poprawna, wyrażenie staje się tak złożone, że jest niezwykle trudne do debugowania lub ulepszania. Wyrażenia regularne nie mogą zweryfikować, czy wiadomość e-mail istnieje, nawet jeśli jest ona poprawnie ustrukturyzowana. Najlepszym sposobem weryfikacji wiadomości e-mail jest wysłanie testowej wiadomości e-mail na adres.

Ostrzeżenie

W przypadku używania System.Text.RegularExpressions metody do przetwarzania niezaufanych danych wejściowych należy przekazać limit czasu. Złośliwy użytkownik może przekazać dane wejściowe , RegularExpressionspowodując atak typu "odmowa usługi". ASP.NET podstawowe interfejsy API platformy, które używają RegularExpressions przekroczenia limitu czasu.

Przykład

W przykładzie zdefiniowano metodę IsValidEmail , która zwraca true wartość , jeśli ciąg zawiera prawidłowy adres e-mail, a false jeśli nie, ale nie podejmuje żadnej innej akcji.

Aby sprawdzić, czy adres e-mail jest prawidłowy, IsValidEmail metoda wywołuje Regex.Replace(String, String, MatchEvaluator) metodę ze (@)(.+)$ wzorcem wyrażenia regularnego, aby oddzielić nazwę domeny od adresu e-mail. Trzeci parametr to delegat reprezentujący metodę MatchEvaluator przetwarzającą i zastępującą dopasowany tekst. Wzorzec wyrażenia regularnego jest interpretowany w następujący sposób:

Wzorzec opis
(@) Dopasuj znak @ . Ta część jest pierwszą grupą przechwytywania.
(.+) Dopasuj co najmniej jedno wystąpienie dowolnego znaku. Ta część jest drugą grupą przechwytywania.
$ Zakończ dopasowanie na końcu ciągu.

Nazwa domeny wraz z znakiem @ jest przekazywana DomainMapper do metody . Metoda używa IdnMapping klasy do tłumaczenia znaków Unicode, które znajdują się poza zakresem znaków US-ASCII do punycode. Metoda ustawia również flagę invalid na True , jeśli IdnMapping.GetAscii metoda wykryje nieprawidłowe znaki w nazwie domeny. Metoda zwraca nazwę domeny Punycode poprzedzoną symbolem @ do IsValidEmail metody .

Napiwek

Zaleca się użycie prostego (@)(.+)$ wzorca wyrażenia regularnego w celu normalizacji domeny, a następnie zwrócenie wartości wskazującej, że została przekazana lub nie powiodła się. Jednak w przykładzie w tym artykule opisano sposób dalszego używania wyrażenia regularnego do weryfikowania wiadomości e-mail. Niezależnie od tego, jak weryfikujesz wiadomość e-mail, zawsze należy wysłać testową wiadomość e-mail na adres, aby upewnić się, że istnieje.

Następnie IsValidEmail metoda wywołuje metodę Regex.IsMatch(String, String) , aby sprawdzić, czy adres jest zgodny ze wzorcem wyrażenia regularnego.

Metoda IsValidEmail określa jedynie, czy format wiadomości e-mail jest prawidłowy dla adresu e-mail; nie sprawdza, czy wiadomość e-mail istnieje. Ponadto metoda nie sprawdza, IsValidEmail czy nazwa domeny najwyższego poziomu jest prawidłową nazwą domeny wymienioną w bazie danych strefy głównej IANA, co wymaga operacji wyszukiwania.

using System;
using System.Globalization;
using System.Text.RegularExpressions;

namespace RegexExamples
{
    class RegexUtilities
    {
        public static bool IsValidEmail(string email)
        {
            if (string.IsNullOrWhiteSpace(email))
                return false;

            try
            {
                // Normalize the domain
                email = Regex.Replace(email, @"(@)(.+)$", DomainMapper,
                                      RegexOptions.None, TimeSpan.FromMilliseconds(200));

                // Examines the domain part of the email and normalizes it.
                string DomainMapper(Match match)
                {
                    // Use IdnMapping class to convert Unicode domain names.
                    var idn = new IdnMapping();

                    // Pull out and process domain name (throws ArgumentException on invalid)
                    string domainName = idn.GetAscii(match.Groups[2].Value);

                    return match.Groups[1].Value + domainName;
                }
            }
            catch (RegexMatchTimeoutException e)
            {
                return false;
            }
            catch (ArgumentException e)
            {
                return false;
            }

            try
            {
                return Regex.IsMatch(email,
                    @"^[^@\s]+@[^@\s]+\.[^@\s]+$",
                    RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));
            }
            catch (RegexMatchTimeoutException)
            {
                return false;
            }
        }
    }
}
Imports System.Globalization
Imports System.Text.RegularExpressions

Public Class RegexUtilities
    Public Shared Function IsValidEmail(email As String) As Boolean

        If String.IsNullOrWhiteSpace(email) Then Return False

        ' Use IdnMapping class to convert Unicode domain names.
        Try
            'Examines the domain part of the email and normalizes it.
            Dim DomainMapper =
                Function(match As Match) As String

                    'Use IdnMapping class to convert Unicode domain names.
                    Dim idn = New IdnMapping

                    'Pull out and process domain name (throws ArgumentException on invalid)
                    Dim domainName As String = idn.GetAscii(match.Groups(2).Value)

                    Return match.Groups(1).Value & domainName

                End Function

            'Normalize the domain
            email = Regex.Replace(email, "(@)(.+)$", DomainMapper,
                                  RegexOptions.None, TimeSpan.FromMilliseconds(200))

        Catch e As RegexMatchTimeoutException
            Return False

        Catch e As ArgumentException
            Return False

        End Try

        Try
            Return Regex.IsMatch(email,
                                 "^[^@\s]+@[^@\s]+\.[^@\s]+$",
                                 RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250))

        Catch e As RegexMatchTimeoutException
            Return False

        End Try

    End Function
End Class

W tym przykładzie wzorzec ^[^@\s]+@[^@\s]+\.[^@\s]+$ wyrażenia regularnego jest interpretowany, jak pokazano w poniższej tabeli. Wyrażenie regularne jest kompilowane przy użyciu flagi RegexOptions.IgnoreCase .

Wzorzec opis
^ Rozpocznij dopasowanie na początku ciągu.
[^@\s]+ Dopasuj co najmniej jedno wystąpienie dowolnego znaku innego niż znak @ lub biały znak.
@ Dopasuj znak @ .
[^@\s]+ Dopasuj co najmniej jedno wystąpienie dowolnego znaku innego niż znak @ lub biały znak.
\. Dopasuj pojedynczy znak kropki.
[^@\s]+ Dopasuj co najmniej jedno wystąpienie dowolnego znaku innego niż znak @ lub biały znak.
$ Zakończ dopasowanie na końcu ciągu.

Ważne

To wyrażenie regularne nie ma na celu pokrycia każdego aspektu prawidłowego adresu e-mail. Jest on podany jako przykład rozszerzenia w razie potrzeby.

Zobacz też