Verifica di un indirizzo email

MarcoGrazia

Utente Attivo
15 Dic 2009
764
15
18
58
Udine
www.stilisticamente.com
Allora, navigando a naso tra gli snippet presenti sul sito di Mr.Webmaster mi sono imbattuto in una semplice funzione che dovrebbe ( il condizionale è d'obbligo perché per ora non posso provarla ) verificare l'esistenza di un indirizzo email, basandosi sulla funzione PHP checkdnsrr() e ho voluto svilupparla ulteriormente per migliorare il supporto di verifica dell'indirizzo che è carente.
Origine: https://www.mrwebmaster.it/php/verificare-se-indirizzo-email-esiste_11259.html
Tralasciando le migliaia di script REGEX esistenti, ho usato solo i filtri del PHP, così se non è verificato un determinato indirizzo è solo colpa di Zeev Suraski e Andi Gutmans :D
Ecco lo script commentato, almeno in parte:
PHP:
/**
 *    Verifica un indirizzo email
*/
function verificaEmail( $valore ) {
    $sanitized = filter_var( $valore, FILTER_SANITIZE_EMAIL );
    if ( filter_var( $sanitized, FILTER_VALIDATE_EMAIL )) {
        return $sanitized;
    }
return false;
}    //    verificaEmail()

/**
    *    Verifica l'esistenza di un indirizzo email
    *    uso:
    *    if (!emailExist('esempio@dominio-inesistente.com')) echo 'Email inesistente';
    *    else echo 'Email valida';
*/
function emailExist( $email ) {
    $email = verificaEmail( $email );
    if ( $email )
        if ( !checkdnsrr( array_pop( explode( '@', $email )), 'MX' )) return false;
return $email;
}    emailExist()
Come funziona:
intanto ho diviso l'unica funzione dello snippet iniziale in due funzioni distinte, così facendo è anche possibile utilizzare solo una o l'altra a seconda di cosa abbiamo bisogno.
Quindi parlo ora della prima, la verificaEmail()
PHP:
function verificaEmail( $valore ) {
    $sanitized = filter_var( $valore, FILTER_SANITIZE_EMAIL );
    if ( filter_var( $sanitized, FILTER_VALIDATE_EMAIL )) {
        return $sanitized;
    }
return false;
}    //    verificaEmail()
FILTER_SANITIZE_EMAIL filtra la parte spuria di un indirizzo email, ad esempio: gino@lemon.org è valida e non c'è nulla da fare (gino@lemon.org) è valida ma vanno tolte le parentesi e questo lo fa il filtro restituendo l'indirizzo nel modo corretto.
Se passa il test però non è detto che sia valida, perché avrei potuto scrivere gino AT lemon DOT org e FILTER_VALIDATE_EMAIL darebbe errore, cioè false.
Se uso solo FILTER_VALIDATE_EMAIL come nell'esempio originale, pure passando l'indirizzo corretto ma con le parentesi non passerebbe, ecco perché la sanitizzazione.

Ultima parte:
PHP:
function emailExist( $email ) {
    $email = verificaEmail( $email );
    if ( $email )
        if ( !checkdnsrr( array_pop( explode( '@', $email )), 'MX' )) return false;
return $email;
}    emailExist()
Da notare che fa da se il check sulla correttezza dell'indirizzo, quindi basta richiamare questa, e fa tutto, quindi se $email non è false, controlla se esiste il record MX, se questo esiste torna l'indirizzo email, se no false.

Dato che da dove sono ora non posso verificarla, troppi controlli sul proxy dell'ufficio, se qualcuno vuole divertirsi a controllarla e dire qui se funziona o proporre modifiche è il benvenuto.