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

Weryfikacja adresu e-mail w PHP

Walidacja domen adresów e-mail przy pomocy checkdnsrr()

W celu sprawdzenia, czy adres mailowy użytkownika przynależy do jakiejś domeny, powinniśmy poszukać odpowiedniego rekordu domeny w DNS. Upewniamy się w ten sposób, że podany adres należy do istniejącej domeny. W celu przeprowadzenia tego sprawdzenia, z powodzeniem możemy wykorzystać parę funkcji PHP.

Funkcja checkdnsrr() sprawdza rekord DNS, czy przynależy do podanej nazwy hosta lub adresu IP. Dokładniej mówiąc szuka rekordu DNS określonego typu należącego do podanego hosta i jeśli znajdzie to funkcja zwróci wartość logiczną true. W przeciwnym wypadku lub jeśli wystąpi błąd false.

O to prototyp funkcji checkdnsrr():

int checkdnsrr ( string host [, string type]) ;

Funkcja akceptuje następujące typy rekordów: A, MX, NS, SOA, PTR, CNAME lub ANY razem z MX jako wyjściowy typ. Jeżeli więc nie podano żadnego typu funkcja będzie szukać rekordów MX dla podanego hosta. My, w naszym przypadku musimy szukać rekordu MX zgodnie z hostem podanym w ramach adresu e-mail. Zatem teraz dosyć łatwo możemy napisać nową funkcję, która zajmie się sprawdzaniem, czy istnieje dla podanego hosta rekord MX. Do dzieła:

function checkEmail($email) {
 if(preg_match("/^( [a-zA-Z0-9] )+( [a-zA-Z0-9\._-] )*@( [a-zA-Z0-9_-] )+( [a-zA-Z0-9\._-] +)+$/" , $email)){
  list($username,$domain)=split('@',$email);
  if(!checkdnsrr($domain,'MX')) {
   return false;
  }
  return true;
 }
 return false;
}

Powyższa funkcja przyjmuje ciąg jako parametr adresu e-mail, aby sprawdzić czy pasuje do odpowiedniego wzorca i czy należy do istniejącej domeny. W celu uzyskania części domeny rozbiliśmy adres e-mail na dwie części: nazwa użytkownika i sekcja domeny, odpowiednio używając w tym celu funkcji split():

list($username,$domain)=split('@',$email);

Teraz zmienna $domain przechowuje domenę. Mamy już to co nas interesuje, więc jedyne co pozostaje to przekazać tą wiedzę jako parametr do funkcji checkdnsrr(), aby mogła sprawdzić czy jest to aby na pewno istniejąca domena. Funkcja zacznie szukać rekordu Mail Exchange (MX) w DNSie (pamiętaj, że funkcja wyjściowo szuka typu MX) i jeśli znajdzie to zwróci true, co będzie oznaczać, że adres wyświetla poprawną domenę. Jeśli funkcja zwróci false domena adresu e-mail nie jest poprawna. Oczywiście adres e-mail, który przynależy do istniejącej domeny niekoniecznie musi oznaczać, że nazwa użytkownika jest poprawna. Mamy, więc spore wyzwanie przed sobą.

Kiedyś zdefiniowaliśmy nową funkcję, moglibyśmy nazwać to w ten sposób, zakładając, że przychodzące maile wysyłane są metodą POST z formularza:

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

Nasza funkcja jest bardzo prosta do zaimplementowania i na tyle dobra, aby poradzić sobie z problemem weryfikacji istniejącej domeny adresu, z jakim mamy do czynienia. Jednakże, jak podano w manualu PHP funkcja checkdnsrr() nie jest zaimplementowana pod platformy Windows. Było by, więc przydane posiadanie wersji działającej pod okienkami dla tych programistów, którzy tworzą swoje aplikacje i uruchamiają je na serwerach z Windowsem.

Można to obejść na parę sposobów. Większość z nich oznacza pisanie swego rodzaju innej wersji funkcji checkdnsrr(). No to zabierajmy się do roboty i napiszmy troszkę kodu dla tej funkcji pod winde.

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-2024 php.pl    Wszystkie prawa zastrzeżone    Powered by eZ publish Content Management System eZ publish Content Management System