Check om e-mail er valid - inklusive DNS MX lookup
Mange personer skriver et php script der udelukkende ser med en strpos - om der er et @ i strengen og om domain TLD er valid (f.eks. .dk .com .net osv). Men her følger så et eksempel på et script der er brugbart - og som næsten checker så langt som - om der er en modtager på webserveren.
* Der checkes også for om den lokale brugers username længde er over det tilladte på 64 tegn.
* Domainets max længde på 255 tegn checkes også.
* Der undersøges om den lokale brugers navn starter eller slutter med et punktum
* Der undersøges om der er to punktummer efter hinanden i navnet (ikke tilladt).
* Der undersøges om der er to punktummer efter hinanden i domæne (ikke tilladt).
* Special tegn i lokale bruger ikke tilladt med mindre de er i anførselstegn.
* Endelig checkes der med et DNS lookup - ser om der er et MX (mail server) record på domainnavnet.
Lad os komme igang...
I dette script eksempel har jeg valgt at kommentere inde i selve koden - du kan selvfølgelig bare fjerne de kommentarer.
<?PHP function check_email_address($email) { $isValid = true; /* Først sættes $isValid til at være true */ $atIndex = strrpos($email, "@"); /* check om der er et @ i $email der sendes ind i funktionen og hvis - så er $atIndex selve positionen hvor @ er placeret. */ if (is_bool($atIndex) && !$atIndex) { $isValid = false; /* Hvis der ikke findes et @ er den allerede nu false */ } else { $domain = substr($email, $atIndex+1); /* Domainnavnet starter ved $atIndex + 1 - hvorfor $domain er substr($email, $atIndex+1) */ $local = substr($email, 0, $atIndex); /* Den lokale bruger er så substr($email, 0, $atIndex) */ $localLen = strlen($local); /* Den lokale brugers navne længde (de er max 64 i længde) */ $domainLen = strlen($domain); /* Domainnavns længde */ if ($localLen < 1 || $localLen > 64) /* Hvis brugernavn er for kort eller for langt */ { $isValid = false; /* Sætter vi $isValid til false */ } else if ($domainLen < 1 || $domainLen > 255) /* Hvis domainnavnet er for kort eller for langt */ { $isValid = false; /* Sætter vi $isValid til false */ } else if ($local[0] == '.' || $local[$localLen-1] == '.') /* starter eller slutter med et . */ { $isValid = false; /* Sætter vi $isValid til false */ } else if (preg_match('/\\.\\./', $local)) /* Er der to . efter hinanden i navn? */ { $isValid = false; /* Sætter vi $isValid til false */ } else if (!preg_match('/^[A-Za-z0-9-.]+$/', $domain)) /* Er der ugyldige karakterer? */ { $isValid = false; /* Sætter vi $isValid til false */ } else if (preg_match('/\\.\\./', $domain)) { /* Er der to . efter hinanden i domæne? */ $isValid = false; /* Sætter vi $isValid til false */ } else if (!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/', str_replace("\\\\","",$local))) { /* Special karakterer er ikke tilladt i navnet med mindre det er i anførselstegn " */ if (!preg_match('/^"(\\\\"|[^"])+"$/', str_replace("\\\\","",$local))) /* Så det checker vi mod - og finder vi dem - */ { $isValid = false; /* Sætter vi $isValid til false */ } } /* Hvis $isValid stadig true - men den fejler med getmxrr hvor den checker for en MX record på domæne navnet */ if ($isValid && !getmxrr($domain,$mxhosts)) { $isValid = false; /* Sætter vi $isValid til false */ } } return $isValid; /* Og endelig returnerer vi $isValid - hvis denne stadig er true - så melder scriptet - true tilbage... */ } ?>
Endelig kaldes det sådan:
<?PHP $email = 'tom@phptips.dk'; if (check_email_address($email)) { echo "Dette er en gyldigt e-mail adresse"; } else { echo "Dette er IKKE en gyldigt e-mail adresse"; } ?>
