Jaki jest najbardziej elegancki kod potwierdzający, że ciąg jest prawidłowym adresem e-mail?
c#
email
email-validation
leora
źródło
źródło
Odpowiedzi:
A co z tym?
Aby wyjaśnić, pytanie dotyczy tego, czy określony ciąg jest prawidłową reprezentacją adresu e-mail, a nie czy adres e-mail jest prawidłowym miejscem docelowym do wysłania wiadomości. W tym celu jedynym prawdziwym sposobem jest wysłanie wiadomości w celu potwierdzenia.
Pamiętaj, że adresy e-mail są bardziej wyrozumiałe, niż możesz przypuszczać. Są to wszystkie doskonale obowiązujące formularze:
W większości przypadków użycia fałszywa „nieprawidłowa” jest znacznie gorsza dla użytkowników i sprawdzania w przyszłości niż fałszywa „ważna”. Oto artykuł, który kiedyś był akceptowaną odpowiedzią na to pytanie (odpowiedź ta została już usunięta). Ma o wiele więcej szczegółów i kilka innych pomysłów na rozwiązanie problemu.
Zapewnienie kontroli poczytalności jest nadal dobrym pomysłem dla wygody użytkownika. Zakładając, że adres e-mail jest prawidłowy, możesz poszukać znanych domen najwyższego poziomu, sprawdzić domenę pod kątem rekordu MX, sprawdzić błędy ortograficzne w popularnych nazwach domen (gmail.cmo) itp. Następnie przedstaw ostrzeżenie dla użytkownika możliwość powiedzenia „tak, mój serwer pocztowy naprawdę pozwala 🌮🍳🎁 jako adres e-mail”.
Jeśli chodzi o korzystanie z obsługi wyjątków w logice biznesowej, zgadzam się, że należy tego unikać. Jest to jednak jeden z tych przypadków, w których wygoda i przejrzystość mogą przeważać nad dogmatem.
Poza tym, jeśli robisz cokolwiek innego z adresem e-mail, prawdopodobnie będzie to wymagało przekształcenia go w adres mailowy. Nawet jeśli nie użyjesz dokładnie tej funkcji, prawdopodobnie będziesz chciał użyć tego samego wzorca. Możesz także sprawdzić, czy nie występują określone rodzaje awarii, wychwytując różne wyjątki : zerowy, pusty lub nieprawidłowy format.
Według komentarza Stuarta porównuje on końcowy adres z oryginalnym ciągiem, zamiast zawsze zwracając wartość true. MailAddress próbuje parsować ciąg ze spacjami w częściach „Nazwa wyświetlana” i „Adres”, więc oryginalna wersja zwracała wyniki fałszywie dodatnie.
--- Dalsze czytanie ---
Dokumentacja dla System.Net.Mail.MailAddress
Wyjaśnienie, co stanowi prawidłowy adres e-mail
źródło
System.Net.Mail
klas do wysyłania poczty, co prawdopodobnie jest, jeśli używasz platformy .NET. Podjęliśmy decyzję o zastosowaniu tego rodzaju sprawdzania poprawności po prostu dlatego, że nie ma sensu akceptować adresów e-mail - nawet tych ważnych - na które nie możemy wysyłać poczty.IsValidEmail("this is not valid@email$com");
To stare pytanie, ale na wszystkie odpowiedzi, które znalazłem na SO, w tym nowsze, odpowiedziały podobnie do tego. Jednak w .Net 4.5 / MVC 4 możesz dodać weryfikację adresu e-mail do formularza, dodając adnotację [EmailAddress] z System.ComponentModel.DataAnnotations, więc zastanawiałem się, dlaczego nie mogłem po prostu korzystać z wbudowanej funkcjonalności. Netto w ogóle.
To wydaje się działać i wydaje mi się dość eleganckie:
źródło
EmailAddressAttribute
jest mniej liberalny niżSystem.Net.Mail.MailAddress
- na przykład,MailAddress
akceptuje adres TLD. Pamiętaj o tym, jeśli chcesz być jak najbardziej tolerancyjny.foo.IsValid(null);
zwrotytrue
.Używam tej metody pojedynczej wkładki, która działa dla mnie-
Zgodnie z komentarzami „nie powiedzie się”, jeśli
source
(adres e-mail) ma wartość NULL.źródło
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
zwracała ciągi zerowe. Dlatego proponuję (nawet lepiej) ++ lepszą wersję:public static bool IsValidEmailAddress(this string address) => new EmailAddressAttribute().IsValid(address ?? throw new ArgumentNullException());
. Pójdę teraz i znajdę Reformowany Kościół jeszcze lepszych wersjonistów..net 4.5 dodał System.ComponentModel.DataAnnotations.EmailAddressAttribute
Możesz przeglądać źródło EmailAddressAttribute , jest to Regex, którego używa wewnętrznie:
źródło
RegexOptions.IgnoreCase
ponieważ ten wzór nie dopuszcza wyraźnie wielkich liter!Wziąłem odpowiedź Phila z nr 1 i stworzyłem tę klasę. Nazwij to tak:
bool isValid = Validator.EmailIsValid(emailString);
Oto klasa:
źródło
Osobiście powiedziałbym, że powinieneś tylko upewnić się, że jest tam symbol @, ewentualnie z. postać. Istnieje wiele wyrażeń regularnych, których można użyć z różną poprawnością, ale myślę, że większość z nich pomija prawidłowe adresy e-mail lub przepuszcza nieprawidłowe. Jeśli ludzie chcą podać fałszywy adres e-mail, podadzą fałszywy adres. Jeśli musisz sprawdzić, czy adres e-mail jest prawidłowy i czy dana osoba ma kontrolę nad tym adresem e-mail, musisz wysłać mu wiadomość e-mail ze specjalnym kodowanym łączem, aby mogli zweryfikować, czy rzeczywiście jest to prawdziwy adres.
źródło
Myślę, że najlepszy sposób jest następujący:
Możesz mieć tę funkcję statyczną w klasie ogólnej.
źródło
Krótki i dokładny kod
źródło
Najbardziej eleganckim sposobem jest użycie metod wbudowanych w .Net.
Te metody:
Są wypróbowane i przetestowane. Te metody są stosowane w moich własnych profesjonalnych projektach.
Używaj wyrażeń regularnych wewnętrznie, które są niezawodne i szybkie.
Wykonane przez Microsoft dla C #. Nie ma potrzeby wymyślania nowego koła.
Zwraca wynik bool. Prawda oznacza, że adres e-mail jest prawidłowy.
Dla użytkowników .Net 4.5 i nowszych
Dodaj to odniesienie do swojego projektu:
Teraz możesz użyć następującego kodu:
Przykład zastosowania
Oto kilka metod deklarowania:
... i kod pokazujący je w akcji:
Ponadto ten przykład:
;
.Alternatywnie, dla użytkowników wersji .Net mniejszej niż 4.5
W sytuacjach, w których .Net 4.5 nie jest dostępny, używam następującego rozwiązania:
W szczególności używam:
źródło
EmailAddressAttribute
niecałe cztery miesiące, choć ten chwytanull
problem.Szczerze mówiąc, w kodzie produkcyjnym najlepiej sprawdzać
@
symbol.Nigdy nie jestem w miejscu, aby całkowicie sprawdzać poprawność wiadomości e-mail. Wiesz, jak widzę, czy to naprawdę było ważne? Jeśli został wysłany. Jeśli nie, to źle, jeśli tak, życie jest dobre. To wszystko, co muszę wiedzieć.
źródło
Uważam, że ten regex stanowi dobry kompromis między sprawdzaniem czegoś więcej niż znaku @ i akceptowaniem dziwnych przypadków krawędzi:
Przynajmniej sprawi, że umieścisz coś wokół znaku @ i umieścisz przynajmniej normalnie wyglądającą domenę.
źródło
bob@companyinternal
?Sprawdzanie poprawności adresu e-mail nie jest tak proste, jak mogłoby się wydawać. W rzeczywistości teoretycznie niemożliwe jest pełne sprawdzenie adresu e-mail za pomocą wyrażenia regularnego.
Sprawdź mój post na blogu , aby uzyskać dyskusję na ten temat i implementację F # przy użyciu FParsec. [/ shameless_plug]
źródło
Oto moja odpowiedź - rozwiązanie Phila zawodzi w przypadku domen jednoliterowych, takich jak „ktoś@q.com”. Wierzcie lub nie, to jest używane =) (na przykład idzie do centurylink).
Odpowiedź Phila będzie działała tylko ze standardem PCRE ... więc C # to zajmie, ale javascript będzie bombardował. Jest zbyt skomplikowany dla javascript. Nie można więc użyć rozwiązania Phila do sprawdzania poprawności atrybutów mvc.
Oto moje wyrażenie regularne. Będzie działał ładnie z atrybutami sprawdzania poprawności MVC.
- Wszystko przed @ jest uproszczone, aby przynajmniej javascript działał. W porządku, rozluźniam sprawdzanie poprawności, o ile serwer Exchange nie daje mi wersji 5.1.3. - Wszystko po @ jest rozwiązaniem Phila zmodyfikowanym dla domen jednoliterowych.
Dla osób sugerujących użycie system.net.mail MailMessage () jest to DROGA do elastyczności. Jasne, C # zaakceptuje wiadomość e-mail, ale następnie serwer wymiany bombarduje błędem czasu wykonania 5.1.3, gdy tylko spróbujesz wysłać wiadomość e-mail.
źródło
basket@ball
jako prawidłowy adres e-mail, uzyskało poprawną odpowiedź, a także wszystkie te pozytywne opinie. W każdym razie dzięki!Jeśli naprawdę i mam na myśli naprawdę chcesz wiedzieć, czy adres e-mail jest prawidłowy ... poproś wymiennik poczty, aby to udowodnił, nie wymaga wyrażenia regularnego. Na żądanie mogę podać kod.
Ogólne kroki są następujące: 1. Czy adres e-mail ma część nazwy domeny? (indeks @> 0) 2. za pomocą zapytania DNS zapytaj, czy domena ma wymiennik poczty 3. otwórz połączenie TCP z wymiennikiem poczty 4. używając protokołu smtp otwórz wiadomość do serwera, używając adresu e-mail jako odbiorcy 5. przeanalizować odpowiedź serwera. 6. zamknij wiadomość, jeśli dotarłeś tak daleko, wszystko jest dobrze.
Jest to, jak możesz sobie wyobrazić, bardzo kosztowne pod względem czasu i opiera się na smtp, ale działa.
źródło
Ogólnie rzecz biorąc, wyrażenie regularne do sprawdzania adresów e-mail nie jest łatwe do wymyślenia; w chwili pisania tego tekstu składnia adresu e-mail musi być zgodna ze stosunkowo dużą liczbą standardów, a implementacja wszystkich z nich w wyrażeniu regularnym jest praktycznie niewykonalna!
Gorąco polecam do wypróbowania naszego EmailVerify.NET , dojrzałą biblioteki .NET, który może zatwierdzić następujące adresy e-mail wszystkich aktualnymi standardami IETF (RFC 1123, RFC 2821, RFC 2822, RFC 3696, RFC 4291, RFC 5321 i RFC 5322) , testuje powiązane rekordy DNS, sprawdza, czy docelowe skrzynki pocztowe mogą akceptować wiadomości, a nawet może stwierdzić, czy dany adres jest jednorazowy, czy nie.
Oświadczenie: Jestem głównym programistą tego komponentu.
źródło
źródło
W przypadku korzystania z FluentValidation możesz napisać coś tak prostego:
źródło
mała modyfikacja odpowiedzi na @Cogwheel
źródło
Console.WriteLine(MailAddress("asdf@asdf.").Address);
wyświetla „asdf @ asdf.”, Co nie jest poprawne.Istnieje tutaj wiele silnych odpowiedzi. Zalecam jednak cofnąć się o krok. @Cogwheel odpowiada na pytanie https://stackoverflow.com/a/1374644/388267 . Niemniej jednak może być kosztowne w scenariuszu weryfikacji zbiorczej, jeśli wiele z weryfikowanych adresów e-mail jest nieprawidłowych. Sugeruję, abyśmy zastosowali odrobinę logiki, zanim wejdziemy do jego bloku try-catch. Wiem, że poniższy kod można napisać przy użyciu RegEx, ale zrozumienie go przez nowych programistów może być kosztowne. To jest moja wartość podwójna:
źródło
Najbardziej głosowana odpowiedź z @Cogwheel jest najlepszą odpowiedzią, ale próbowałem zaimplementować
trim()
metodę string, aby odciąć wszystkie białe znaki użytkownika od początku do końca. Sprawdź poniższy kod w celu uzyskania pełnego przykładu-źródło
SanitizeEmail(string email)
, wykorzystując wyniki tej metody do sprawdzenia poprawności i wysłania wiadomości e-mail na adres.źródło
Sprawdź, czy ciąg wiadomości e-mail ma prawidłowy lub niewłaściwy format, wykonując
System.Text.RegularExpressions
:źródło
/ Korzystanie z wewnętrznego regexu używanego do tworzenia „nowego EmailAddressAttribute ();”; komponent w .Net4.5 >>> przy użyciu System.ComponentModel.DataAnnotations; // Aby zweryfikować adres e-mail ...... Testowany i działa.
Możesz także użyć tego:
http://msdn.microsoft.com/en-us/library/01escwtf(v=vs.110).aspx
źródło
W skrócie streściłem odpowiedź Poyson 1:
źródło
Prosty sposób identyfikacji adresu e-mail jest prawidłowy lub nie.
źródło
Występuje problem kulturowy w wyrażeniach regularnych w języku C # zamiast w js. Musimy więc użyć wyrażenia regularnego w trybie USA do sprawdzania poczty e-mail. Jeśli nie używasz trybu ECMAScript, twoje znaki specjalne w języku oznaczają w AZ za pomocą wyrażenia regularnego.
źródło
Skończyło się na tym wyrażeniu regularnym, ponieważ z powodzeniem sprawdza poprawność przecinków, komentarzy, znaków Unicode i adresów domen IP (v4).
Prawidłowe adresy to:
źródło
Prosty bez użycia Regex (co nie podoba mi się ze względu na słabą czytelność):
Przykłady:
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
Ma być prosty i dlatego nie zajmuje się rzadkimi przypadkami, takimi jak wiadomości e-mail z domenami w nawiasach kwadratowych, które zawierają spacje (zwykle dozwolone), wiadomości e-mail z adresami IPv6 itp.
źródło
Oto odpowiedź na twoje pytanie do sprawdzenia.
źródło
Na podstawie odpowiedzi @Cogwheel chcę udostępnić zmodyfikowane rozwiązanie, które działa dla SSIS i „Składnika skryptu”:
Umieść ten kod we właściwej metodzie:
Następnie możesz użyć podziału warunkowego, aby odfiltrować wszystkie nieprawidłowe rekordy lub cokolwiek chcesz zrobić.
źródło