Comment valider une adresse email avec PHP

Avant d'envoyer des emails par SMTP, l'ordinateur client fait une transaction avec le serveur de messagerie SMTP qui interpréte les commandes sur le port TCP 25. La commande "SMTP COUCOU" fait une transaction avec le serveur de messagerie et s'identifie, "MAIL FROM" et "RCTP" spécifient respectivement l'expéditeur et les destinataires tandis que la commande "QUIT" fermera la conversation.
Si le serveur de messagerie transmet le statut 250, cela signifie que l'adresse email existe et confirmée.

 @hbattat a écrit une archive "PHP wrapper" qui peut être utilisée pour déterminer si une adresse email est réelle ou non.Vous allez spécifier l'email de l'expéditeur, l'email du destinataire et vous connecteriez au serveur de messagerie pour savoir si cet email existe ou non. A noter La vérification de ces emails peut également être exécutée par la pratique de Windows Telnet. (N.B: Pour un affichage total sur les smartphones,cliquer deux fois successivement sur le script)
/* Credit: https://github.com/hbattat/verifyEmail */

function verifyEmail($toemail, $fromemail, $getdetails = false)
{
    // Get the domain of the email recipient
    $email_arr = explode('@', $toemail);
    $domain = array_slice($email_arr, -1);
    $domain = $domain[0];

    // Trim [ and ] from beginning and end of domain string, respectively
    $domain = ltrim($domain, '[');
    $domain = rtrim($domain, ']');

    if ('IPv6:' == substr($domain, 0, strlen('IPv6:'))) {
        $domain = substr($domain, strlen('IPv6') + 1);
    }

    $mxhosts = array();
        // Check if the domain has an IP address assigned to it
    if (filter_var($domain, FILTER_VALIDATE_IP)) {
        $mx_ip = $domain;
    } else {
        // If no IP assigned, get the MX records for the host name
        getmxrr($domain, $mxhosts, $mxweight);
    }

    if (!empty($mxhosts)) {
        $mx_ip = $mxhosts[array_search(min($mxweight), $mxhosts)];
    } else {
        // If MX records not found, get the A DNS records for the host
        if (filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
            $record_a = dns_get_record($domain, DNS_A);
             // else get the AAAA IPv6 address record
        } elseif (filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
            $record_a = dns_get_record($domain, DNS_AAAA);
        }

        if (!empty($record_a)) {
            $mx_ip = $record_a[0]['ip'];
        } else {
            // Exit the program if no MX records are found for the domain host
            $result = 'invalid';
            $details .= 'No suitable MX records found.';

            return ((true == $getdetails) ? array($result, $details) : $result);
        }
    }

    // Open a socket connection with the hostname, smtp port 25
    $connect = @fsockopen($mx_ip, 25);

    if ($connect) {

              // Initiate the Mail Sending SMTP transaction
        if (preg_match('/^220/i', $out = fgets($connect, 1024))) {

                      // Send the HELO command to the SMTP server
            fputs($connect, "HELO $mx_iprn");
            $out = fgets($connect, 1024);
            $details .= $out."n";

            // Send an SMTP Mail command from the sender's email address
            fputs($connect, "MAIL FROM: <$fromemail>rn");
            $from = fgets($connect, 1024);
            $details .= $from."n";

                        // Send the SCPT command with the recepient's email address
            fputs($connect, "RCPT TO: <$toemail>rn");
            $to = fgets($connect, 1024);
            $details .= $to."n";

            // Close the socket connection with QUIT command to the SMTP server
            fputs($connect, 'QUIT');
            fclose($connect);

            // The expected response is 250 if the email is valid
            if (!preg_match('/^250/i', $from) || !preg_match('/^250/i', $to)) {
                $result = 'invalid';
            } else {
                $result = 'valid';
            }
        }
    } else {
        $result = 'invalid';
        $details .= 'Could not connect to server';
    }
    if ($getdetails) {
        return array($result, $details);
    } else {
        return $result;
    }
}
La même méthode déjà citée SMTP vous apporte également la commande "VRFY" pour une certaine inspection lorsque l'utilisateur déterminé existe sur l'hôte ou non, mais elle est souvent ignorée par les serveurs de messagerie.

Enregistrer un commentaire