web-dev-qa-db-fra.com

Comment vérifier si une adresse email est réelle ou valide en utilisant PHP

Est-il possible de vérifier si un email existe de la même manière que ce site web?

http://verify-email.org/

<?php
    if($_POST['email'] != ''){
        // The email to validate
        $email = $_POST['email'];

        // An optional sender
        function domain_exists($email, $record = 'MX'){
            list($user, $domain) = explode('@', $email);
            return checkdnsrr($domain, $record);
        }
        if(domain_exists($email)) {
            echo('This MX records exists; I will accept this email as valid.');
        }
        else {
            echo('No MX record exists;  Invalid email.');
        }
    }
?>
<form method="POST">
    <input type="text" name="email">
    <input type="submit" value="submit">
</form>

C'est ce que j'ai en ce moment. Il vérifie si le domaine existe , mais il ne peut pas vérifier si l'adresse électronique de l'utilisateur existe sur ce domaine. Est-il possible de faire cela en utilisant PHP?

46
telexper

Vous devriez vérifier avec SMTP.

Cela signifie que vous devez vous connecter au serveur SMTP de cet email.

Une fois connecté au serveur SMTP, vous devez envoyer les commandes suivantes:

HELO somehostname.com
MAIL FROM: <[email protected]>
RCPT TO: <[email protected]>

Si vous obtenez "<[email protected]> Accès au relais refusé", cela signifie que cet email est invalide.

Il existe une simple PHP classe. Vous pouvez l'utiliser:

http://www.phpclasses.org/package/6650-PHP-Check-if-an-e-mail-is-valid-using-SMTP.html

39
Mohsen Alizadeh

Vous ne pouvez pas vérifier si un email existe réellement sans envoyer un email à ce compte. Mais vous pouvez vérifier qu'il est au moins formaté comme un

if(filter_var($email, FILTER_VALIDATE_EMAIL)) {
    //Email is valid
}

Vous pouvez ajouter un autre chèque si vous le souhaitez. Analyser le domaine et ensuite exécuter checkdnsrr

if(checkdnsrr($domain)) {
     // Domain at least has an MX record, necessary to receive email
}

Comme les gens continuent à voter contre cela, voici quelques remarques à prendre en compte si vous êtes lié et déterminé à valider votre courrier électronique:

  1. Les spammeurs font le tour de la connexion aussi, alors ne supposez pas que tous les serveurs répondront de la même manière. Un des autres liens de réponses à cette bibliothèque qui a cette mise en garde

    Certains serveurs de messagerie rejetteront le message de test en silence afin d'empêcher les spammeurs de consulter les adresses de messagerie de leurs utilisateurs et de filtrer les adresses de messagerie valides. Cette fonction risque donc de ne pas fonctionner correctement avec tous les serveurs de messagerie.

    Donc, s'il y a une adresse invalide, vous risquez de ne pas recevoir de réponse d'adresse invalide. La réponse la plus votée ne le mentionne pas.

  2. Listes de spam. Oui, vous pouvez vous retrouver sur une liste noire en essayant de le faire (rappelez-vous que j'ai dit aux spammeurs qu'ils connaissent aussi ces astuces). Ils dressent une liste noire par adresse IP et si votre serveur établit constamment des connexions de vérification, vous courez le risque de vous retrouver sur Spamhaus ou sur une autre liste de blocage. Si vous êtes sur la liste noire, à quoi sert-il de valider l'adresse e-mail?

  3. S'il est vraiment important de vérifier une adresse électronique, la méthode acceptée consiste à obliger l'utilisateur à répondre à un courrier électronique. Envoyez-leur un email complet avec un lien sur lequel ils doivent cliquer pour être vérifiés. Ce n'est pas du spam, et vous devez toujours vérifier s'il est valide.

35
Machavity

J'ai cherché cette même réponse toute la matinée et j'ai à peu près découvert qu'il était probablement impossible de vérifier si chaque adresse de courrier électronique que vous avez besoin de vérifier existe réellement au moment où vous devez le vérifier. En guise de solution de contournement, j’ai en quelque sorte créé un simple script PHP pour vérifier que l’adresse électronique est formatée correctement et pour vérifier que le nom de domaine utilisé est également correct.

GitHub ici https://github.com/DukeOfMarshall/PHP---JSON-Email-Verification/tree/master

<?php

# What to do if the class is being called directly and not being included in a script     via PHP
# This allows the class/script to be called via other methods like JavaScript

if(basename(__FILE__) == basename($_SERVER["SCRIPT_FILENAME"])){
$return_array = array();

if($_GET['address_to_verify'] == '' || !isset($_GET['address_to_verify'])){
    $return_array['error']              = 1;
    $return_array['message']            = 'No email address was submitted for verification';
    $return_array['domain_verified']    = 0;
    $return_array['format_verified']    = 0;
}else{
    $verify = new EmailVerify();

    if($verify->verify_formatting($_GET['address_to_verify'])){
        $return_array['format_verified']    = 1;

        if($verify->verify_domain($_GET['address_to_verify'])){
            $return_array['error']              = 0;
            $return_array['domain_verified']    = 1;
            $return_array['message']            = 'Formatting and domain have been verified';
        }else{
            $return_array['error']              = 1;
            $return_array['domain_verified']    = 0;
            $return_array['message']            = 'Formatting was verified, but verification of the domain has failed';
        }
    }else{
        $return_array['error']              = 1;
        $return_array['domain_verified']    = 0;
        $return_array['format_verified']    = 0;
        $return_array['message']            = 'Email was not formatted correctly';
    }
}

echo json_encode($return_array);

exit();
}

class EmailVerify {
public function __construct(){

}

public function verify_domain($address_to_verify){
    // an optional sender  
    $record = 'MX';
    list($user, $domain) = explode('@', $address_to_verify);
    return checkdnsrr($domain, $record);
}

public function verify_formatting($address_to_verify){
    if(strstr($address_to_verify, "@") == FALSE){
        return false;
    }else{
        list($user, $domain) = explode('@', $address_to_verify);

        if(strstr($domain, '.') == FALSE){
            return false;
        }else{
            return true;
        }
    }
    }
}
?>