E-mail cím ellenőrzés PHP-val

img

Sokan szembesülünk a problémával, hogy a felhasználók helytelenül írják be az e-mail címüket. Sajnos a mai rohanó világban előfordul, hogy elütünk egy-egy karaktert. Az email címnél ez igen súlyos gond, hisz nem érkezik értesítés, nem kapunk aktiváló linket. Ilyenkor a megrendelő megoldást vár a programozótól. Építsünk be annyi ellenőrzést, amennyit csak tudunk. Már lassan ott jár a dolog, hogy olvassuk is el helyette.

Tehát keressünk megoldást erre a problémára. A legegyszerűbb, amit sokan használnak, hogy egy regex-et húznak a beírt mail címre, és ha jónak tűnik, mehet tovább. De ez szerintem érezzük, hogy kevés lesz. Lássuk mit tehetünk.

A kód egyszerűen működik, és még domain ellenőrzést is végez. Ennek egyik feltétele, hogy a checkdnsrr engedélyezve legyen a webszerveren.

Nah lássuk a kódot:

function chkMail($email)
{
    $isValid = true;
    $atIndex = strrpos($email, “@”);
    if (is_bool($atIndex) && !$atIndex) {
        $isValid = false;
    } else {
        $domain = substr($email, $atIndex + 1);
        $local = substr($email, 0, $atIndex);
        $localLen = strlen($local);
        $domainLen = strlen($domain);
        if ($localLen < 1 || $localLen > 64) {
           $isValid = false;
        } elseif ($domainLen < 1 || $domainLen > 255) {
            $isValid = false;
        } elseif ($local[0] == ‘.’ || $local[$localLen-1] == ‘.’) {
            $isValid = false;
        } elseif (preg_match(‘/\\.\\./’, $local)) {
            $isValid = false;
        } elseif (!preg_match(‘/^[A-Za-z0-9\\-\\.]+$/’, $domain)) {
            $isValid = false;
        } elseif (preg_match(‘/\\.\\./’, $domain)) {
            $isValid = false;
        } elseif (!preg_match(‘/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/’, str_replace(“\\\\”,”",$local))) {
            if (!preg_match(‘/^”(\\\\”|[^"])+”$/’, str_replace(“\\\\”,”",$local))) {
                $isValid = false;
            }
        }
        if ($isValid && !(checkdnsrr($domain, ”MX”) || checkdnsrr($domain, ”A”))) {
            $isValid = false;
        }
    }
    return $isValid;
}

Akkor jöjjön a magyarázat, mi mit is csinál (nem megyek végig mindenen, csak a fontosabb sorokon!):

  • Megvizsgálja az email cím első része érvénytelen-e
  • Megvizsgálja az email cím domain része érvénytelen-e
  • Az első rész nem kezdődhet vagy végződhet ponttal
  • Az első rész nem tartalmazhat 2 egymást követő pontot
  • A domain részben nem engedélyezett karaktereket szűrjük
  • A domain rész nem tartalmazhat 2 egymást követő pontot
  • Az első részben nem engedélyezett karakterek szűrése vagy idézőjeleket tartalmaz
  • DNS ellenőrzés, a domain név nem található a megadott DNS-rekordban

Szerintem az egyik legjobb script az email cím helyességének ellenőrzésére.

FIGYELEM: Néhány szerveren tiltva lehet a dns ellenőrzés… tehát előfordulhat, hogy kiakad a script. Ilyenkor csak ki kell venni itt a legalján a 25.sorban a DNS ellenőrző részt. Ettől még mindig egy elég komoly ellenörző script, bár ekkor elveszíti az egyetlen hasznos funkcióját az elírt domain név ellenörzést

FIGYELEM: Az email cím létezését nem lehet vizsgálni vele, csak azt hogy létezik-e hozzá tartozó oldal (pl céges emailnél). Tehát csak a helyességét és a domain rész elérhetőségét tudjuk ellenőrizni vele. De akkor is közelebb vagyunk, mert nem tud asfakhf@afas.ga regisztrálni :)

Egy kis érdekesség: Olvastam régen, hogy értelmes megoldást az email cím létezésére nem adnak a mail szolgáltatók, mivel ez nagyban könnyítené a random spammerek dolgát. Hisz csak lekérdeznék, és már küldhetnék is a spamet. Időt spórolna nekik, hisz a következő mass-mail küldésnél már fix, létező listájuk lenne a címekről.

Ennek ellenére elvileg socket kapcsolaton keresztül egy kis hackelgetéssel vissza lehet kérdezni a mail cím létezését, bár ebbe nem folytam bele pontosabban. Nem állt szándékomban létező email címeket kigyűjteni és spammelni. Csak felvetődött bennem ez az ellenőrzés és akkor kerestem utána kicsit.

Ha hasznosnak találtad a cikket, kérlek oszd meg.