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";
  }
?>

Kommentarer:
Denne funktion bruges blandt andet på PHPTips.dk samt adskillige andre steder jeg har været som udvikler :o)
Cirka 13 år siden (01/12/2010 16:28:02)
Du skal være logget ind for at bruge denne funktion.
Brugernavn
Kodeord


Det er gratis at oprette en bruger
Hop til toppen