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: (0)
Mentax.pl    NQ.pl- serwery z dodatkiem świętego spokoju...   
O nas | Kontakt | Mapa serwisu
Copyright (c) 2003-2024 php.pl    Wszystkie prawa zastrzeżone    Powered by eZ publish Content Management System eZ publish Content Management System