Witaj, Gościu O nas | Kontakt | Mapa
Wortal Forum PHPEdia.pl Planeta Kubek IRC Przetestuj się!

Weryfikacja adresu e-mail w PHP

Empowering walidacji przy użyciu fsockopen()

W celu przekonania się, czy domena adresu e-mail jest faktycznie w użyciu wykorzystamy zalety PHP`owej funkcji fsockopen(), która jest używana do otwierania domenowego gniazda połączeń przez Internet. Od kiedy możemy otwierać gniazdo połączeń do serwera mailowego zidentyfikowanego przez podaną domenę nasz cel staje się łatwy do osiągnięcia.

Prototyp funkcji fsockopen wygląda następująco:

   int fsockopen ( string hostname, int port [, int errno [, string errstr [, float timeout]]]);

Funkcja, kiedy używana jest z domenami otwiera gniazdo TCP na danym hoscie i porcie i zwraca wskaźnik do pliku odpowiadający nazwie hosta. Kiedy operacja się nie powiedzie, funkcja zwróci false i jeśli podano opcjonalne argumenty errno i errstr będą one ustawione tak, aby wskazywały na rzeczywisty poziom systemowego błędu, który wystąpił w momencie wywoływania. Opcjonalny parametr timeout może być użyty do ustawienia czasu w sekundach wymaganego na realizację wykonania funkcji.

Spojrzawszy na funkcję i na to, co robi wykonamy za jej pomocą otwarcie gniazda na porcie 25 (porcie, na którym standardowo działają serwery SMPT) podanej domeny adresu e-mail użytkownika w następujący sposób:

If(!fsockopen($domain,25,$errno,$errstr,30)) {
 return false;
}

Tak oto staramy się otworzyć gniazdo połączeń z podaną domeną na porcie 25 ustawiając timeout na połączenie 30 sekund. Jeżeli połączenie się powiedzie, funkcja zwróci true, co oznacza, że serwer działa, domena adresu e-mail jest prawdziwa i jest szansa, że nazwa użytkownika jest także poprawna. Jeśli połączenie się nie powiedzie, funkcji zwróci false, co oznacza, że domena nie jest używana, a przynajmniej nie w momencie, w którym próbowaliśmy otworzyć gniazdo. Jak możesz łatwo zgadnąć, istnieje możliwość wystąpienia niepowodzenia w połączeniu z co najmniej kilku powodów. Nawet, jeśli nazwa użytkownika jest poprawna, to serwer poczty może być wyłączony, nasz system może mieć jakieś swoje problemy lub inne utrudnienia wynikające z natury sieci.

Tak czy inaczej, nasze próby usprawnienia procesu walidacji są ciągle warte świeczki. Oto funkcja checkMail() z nowymi ulepszeniami:

function checkEmail($email) {
 // checks proper syntax
 if(preg_match("/^( [a-zA-Z0-9] )+( [a-zA-Z0-9\._-] )*@( [a-zA-Z0-9_-] )+( [a-zA-Z0-9\._-] +)+$/" , $email)) {
  // gets domain name
  list($username,$domain)=split('@',$email);
  // checks for if MX records in the DNS
  if(!checkdnsrr($domain, 'MX')) {
   return false;
  }
  // attempts a socket connection to mail server
  if(!fsockopen($domain,25,$errno,$errstr,30)) {
   return false;
  }
  return true;
 }
 return false;
}

I kod wywołujący tą funkcję:

$email = trim($_POST['email']);   
if(!checkEmail($email)) {  
echo 'Invalid email address!';
}
else {
 echo 'Email address is valid';
}

Zrobilismy znaczący krok naprzód w ulepszeniu zwykłych metod walidacji w naszej funkcji.

Wyjaśnijmy krok po kroku, co zrobiliśmy: na początku przekazujemy adres e-mail do funkcji, w której to porównujemy go do wzorca zapisanego z wykorzystaniem wyrażeń regularnych. Jeśli podany adres pasuje do wzorca to jest rozbijany na elementy w celu uzyskania nazwy domeny.

Następnie funkcja sprawdza, czy domena jest prawdziwa szukając rekordów MX w DNS. Ponownie, jeśli rekordy zostały odnalezione kolejnym krokiem jest otworzenie gniazda do tej domeny na porcie 25 w celu sprawdzenia czy jest ona obecnie w użyciu. Jeśli udało się ustanowić połączenie, możemy być prawie pewni, że nazwa użytkownika jest również poprawnie podana. Jakiekolwiek zwrócenie przez test wyniku false spowoduje zwrócenie przez całą funkcję false przerywając ją. Oznacza to, że podany adres e-mail jest nieprawidłowy.

Informacje na podobny temat:
Wasze opinie
Wszystkie opinie użytkowników: (6)
Weryfikacja adresu e-mail w PHP
Czwartek 29 Marzec 2012 12:17:49 pm - pp-layouts <machine_at_nisza.org>

Wiedziałem, że w artykule będzie sposób 1 regexem. To zło, ten regex jest nieprawdopodobnie wolny, co wychodzi, jak chce się ten sam algorytm użyć do walidacji emaila po stronie klienta podczas wpisywania. Rozwiązanie jest banalnie proste - dzielimy e-mail po małpie na 2 części i walidujemy osobno domenę (prostsze reguły) i login (troszkę trudniejsze reguły). Ta metoda jest wystarczająco szybka nawet uruchamiana po każdym naciśnięciu klawisza w IE7.

Data Filtering Extension
Sobota 16 Styczeń 2010 10:15:55 pm - Meares <meares_at_mixbox.pl>

W PHP5.2 jest domyślnie aktywne rozszerzenie "Data Filtering", które pozwala na walidację wielu rzeczy, w tym adresu e-mail. Adres e-mail można sprawdzić w następujący sposób:
<?php
filter_var('admin@przyklad.pl', FILTER_VALIDATE_EMAIL);
?>

walidacja
Czwartek 16 Kwiecień 2009 1:09:39 am - x10d <djek_at_toya.net.pl>

@walidacja/rozny:
usun wszystkie spacje z wyrazenia preg_match, to zadziala:>

walidacja
Piątek 04 Styczeń 2008 4:33:12 pm - rozny <rozny_at_tlen.pl>

a mi to to nie dziala... jakiego meila bym nie wpisal wyswietla invalid email address... :(

validacja
Niedziela 20 Maj 2007 11:55:19 am - Prym

Oczywiście masz rację że najprościej jest wysłać maila z kodem aktywacyjnym. ale są sytuacje w których nie chodzi o zakładanie konta ale o np umowę - gość wprowadza dane łącznie ze swoim adresem mailowym który jest wymagany do kontaktu i to nawet nie dla mnie ten validator ale niech sie klient kropnie w swoim mailu - a juz kilka razy widzialem jak ludzie robia spacje nie tam gdzie trzeba a potem jest krzyk ze nie ma odzewu na zapytanie czy inną sprawę.

Dlatego napisze genialny artykuł :) zwłaszcza validacja domen mnie polozyła nie wiedzialem ze az tyle sposobów jest na to.

Komentarz ?
Poniedziałek 26 Luty 2007 8:58:02 am - puciek

A nie prosciej po prostu wyslac email na podany adres z kluczem aktywacyjnym ?
100% skuteczna metoda

Mentax.pl    NQ.pl- serwery z dodatkiem świętego spokoju...   
O nas | Kontakt | Mapa serwisu
Copyright (c) 2003-2020 php.pl    Wszystkie prawa zastrzeżone    Powered by eZ publish Content Management System eZ publish Content Management System