web-dev-qa-db-fra.com

Comment vérifier si une adresse email existe sans envoyer un email?

J'ai rencontré ceci code PHP pour vérifier l'adresse email en utilisant SMTP sans envoyer un email .

Quelqu'un a-t-il essayé quelque chose de similaire ou est-ce que cela fonctionne pour vous? Pouvez-vous dire si un email que le client/utilisateur entre est correct et existe?

112
php-guy

Il existe deux méthodes que vous pouvez parfois utiliser pour déterminer si un destinataire existe réellement:

  1. Vous pouvez vous connecter au serveur et émettre une commande VRFY. Très peu de serveurs supportent cette commande, mais elle est exactement destinée à cela. Si le serveur répond avec un DSN 2.0.0, l'utilisateur existe.

    Utilisateur VRFY

  2. Vous pouvez émettre un RCPT et voir si le courrier est rejeté.

    MAIL DE: <>

    RCPT TO: <utilisateur @ domaine>

Si l'utilisateur n'existe pas, vous obtiendrez un DSN 5.1.1. Cependant, le fait que le courrier électronique ne soit pas rejeté ne signifie pas que l'utilisateur existe. Certains serveurs rejettent en silence les demandes de ce type afin d’empêcher l’énumération de leurs utilisateurs. Les autres serveurs ne peuvent pas vérifier l'utilisateur et doivent accepter le message malgré tout.

Il existe également une technique antispam appelée greylisting, qui oblige le serveur à rejeter l’adresse initialement, dans l’attente d’un serveur SMTP réel qui tentera une nouvelle livraison ultérieurement. Cela gâchera les tentatives de validation de l'adresse.

Honnêtement, si vous essayez de valider une adresse, la meilleure approche consiste à utiliser une regex simple pour bloquer les adresses manifestement invalides, puis à envoyer un email contenant un lien vers votre système qui validera la réception de l'email. Cela garantit également que l'utilisateur a entré son email réel, pas une légère faute de frappe qui appartient à quelqu'un d'autre.

88
Joseph Tary

D'autres réponses abordent ici les différents problèmes rencontrés pour essayer de le faire. Je pensais montrer comment vous pourriez essayer ceci au cas où vous voudriez apprendre en le faisant vous-même.

Vous pouvez vous connecter à un serveur de messagerie via telnet pour demander si une adresse électronique existe. Voici un exemple de test d'une adresse email pour stackoverflow.com:

 C: \> nslookup -q = mx stackoverflow.com 
 Réponse ne faisant pas autorité: 
 Stackoverflow.com Préférence MX = 40, échange de courrier = STACKOVERFLOW.COM.S9B2.PSMTP .com 
 stackoverflow.com Préférence MX = 10, échangeur de courrier = STACKOVERFLOW.COM.S9A1.PSMTP.com 
 stackoverflow.com Préférence MX = 20, échangeur de courrier = STACKOVERFLOW.COM.S9A2.PSMTP .com 
 stackoverflow.com Préférence MX = 30, échange de courrier = STACKOVERFLOW.COM.S9B1.PSMTP.com 
 
 C: \> telnet STACKOVERFLOW.COM.S9A1.PSMTP. com 25 
 220 Postini ESMTP 213 y6_35_0c4 ready. La section 17538.45 du code des affaires et des professions CA interdit l’utilisation de ce système pour les publicités par courrier électronique non sollicitées. 
 
. courrier de: <me@monhôte.com> 
 250 Ok 
 
 rcpt à: <[email protected]> 
 550-5.1.1 Le compte de messagerie que vous avez essayé d'atteindre n'existe pas. Veuillez essayer 
 550-5.1.1 en revérifiant l’adresse électronique du destinataire pour y trouver des fautes de frappe ou 
 550-5.1.1 espaces inutiles. Pour plus d'informations, consultez 
 550 5.1.1 http://mail.google.com/support/bin/answer.py?answer=6596 w41si3198459wfd.71 
.

Les lignes précédées de codes numériques sont des réponses du serveur SMTP. J'ai ajouté des lignes vides pour le rendre plus lisible.

De nombreux serveurs de messagerie ne renverront pas ces informations afin d'empêcher la collecte d'adresses électroniques par des spammeurs. Vous ne pouvez donc pas vous fier à cette technique. Toutefois, vous pourrez peut-être éliminer certaines adresses électroniques manifestement mauvaises en détectant les serveurs de messagerie non valides ou en rejetant les adresses des destinataires comme indiqué ci-dessus.

Notez également que les serveurs de messagerie peuvent vous mettre sur une liste noire si vous leur faites trop de demandes.


Dans PHP Je pense que vous pouvez utiliser fsockopen, fwrite et fread pour exécuter les étapes ci-dessus par programmation:

$smtp_server = fsockopen("STACKOVERFLOW.COM.S9A1.PSMTP.com", 25, $errno, $errstr, 30);
fwrite($smtp_server, "helo hi\r\n");
fwrite($smtp_server, "mail from: <[email protected]>\r\n");
fwrite($smtp_server, "rcpt to: <[email protected]>\r\n");
45
Drew Noakes

La réponse générale est que vous pouvez ne pas vérifier si une adresse email existe même si vous lui envoyez un email: il pourrait simplement entrer dans un trou noir.

Cela étant dit, la méthode décrite est très efficace. Il est utilisé dans le code de production de ZoneCheck sauf qu'il utilise RSET au lieu de QUIT.

Lorsque l’interaction de l’utilisateur avec sa boîte aux lettres n’est pas excessive, de nombreux sites testent en fait que le courrier arrive quelque part en envoyant un numéro secret qu’il doit renvoyer à l’émetteur (soit en accédant à une URL secrète, soit en renvoyant ce numéro secret par courrier électronique). La plupart des listes de diffusion fonctionnent comme ça.

8
kmkaplan

Cela échouera (entre autres cas) lorsque le serveur de courrier cible utilise la liste grise.

Greylisting: le serveur SMTP refuse la livraison la première fois qu'un client précédemment inconnu se connecte, autorise la prochaine fois; cela conserve un certain pourcentage de spambots, tout en permettant une utilisation légitime - , car il est prévu qu'un expéditeur de courrier légitime réessayera , ce qui est ce que les agents de transfert de courrier normaux ça ira.

Cependant, si votre code ne vérifie que sur le serveur une seule fois , un serveur avec liste grise refusera la livraison (étant donné que votre client se connecte pour la première fois); à moins que vous ne vérifiiez de nouveau dans quelques instants, il est possible que vous refusiez de manière incorrecte des adresses électroniques valides.

6
Piskvor

Pas vraiment ..... Certains serveurs peuvent ne pas cocher la case "rcpt to:"

http://www.freesoft.org/CIE/RFC/1123/92.htm

Faire ainsi est un risque de sécurité .....

Si le serveur le fait, vous pouvez écrire un bot pour découvrir chaque adresse sur le serveur ....

6
l_39217_l

Quelques problemes:

  1. Je suis sûr que certains serveurs SMTP vous informeront immédiatement si une adresse que vous leur donnez n'existe pas, mais d'autres non. Ils acceptent simplement les adresses que vous leur donnez et ignorent en silence celles qui n'existent pas.
  2. Comme le dit l'article, si vous le faites trop souvent avec certains serveurs, ils vous placeront sur une liste noire.
  3. Pour certains serveurs SMTP (tels que gmail), vous devez utiliser SSL pour pouvoir effectuer quoi que ce soit.  Cela n’est vrai que lors de l’utilisation du serveur SMTP de gmail pour envoyer email.
4
Graeme Perrow
function EmailValidation($email)
{
    $email = htmlspecialchars(stripslashes(strip_tags($email))); //parse unnecessary characters to prevent exploits
    if (eregi('[a-z||0-9]@[a-z||0-9].[a-z]', $email)) {
        //checks to make sure the email address is in a valid format
        $domain = explode( "@", $email ); //get the domain name
        if (@fsockopen ($domain[1],80,$errno,$errstr,3)) {
            //if the connection can be established, the email address is probably valid
            echo "Domain Name is valid ";
            return true;
        } else {
            echo "Con not a email domian";
            return false; //if a connection cannot be established return false
        }
        return false; //if email address is an invalid format return false
    }
}
3
Sachin

"Pouvez-vous dire si un email que le client/utilisateur entre est correct et existe?"

En fait, ce sont deux choses distinctes. Cela pourrait exister mais pourrait ne pas être correct.

Parfois, vous devez prendre les entrées utilisateur à leur valeur nominale. Sinon, il existe de nombreuses façons de vaincre le système.

2
Learning

Bien que cette question soit un peu ancienne, cette astuce de service peut aider les utilisateurs à la recherche d'une solution similaire en vérifiant les adresses électroniques au-delà de la validation de la syntaxe avant l'envoi.

J'utilise ceci service à source ouverte pour une validation plus approfondie des courriels (vérification des enregistrements mx sur le domaine des adresses de messagerie, etc.) pour quelques projets avec de bons résultats. Il vérifie également les fautes de frappe courantes qui sont très utiles. Démo ici .

2
Henkealg

Tout ce que vous pouvez faire est de rechercher le DNS et de vous assurer que le domaine qui se trouve dans l'adresse de messagerie possède un enregistrement MX, à part cela, il n'existe aucun moyen fiable de gérer cela.

Certains serveurs peuvent fonctionner avec la méthode rcpt-to où vous parlez au serveur SMTP, mais cela dépend entièrement de la configuration du serveur. Un autre problème peut être qu'un serveur surchargé peut renvoyer un code 550 indiquant que l'utilisateur est inconnu, mais il s'agit d'une erreur temporaire. Il existe une erreur permanente (451 je pense?) Qui peut être renvoyée. Cela dépend entièrement de la configuration du serveur.

Personnellement, je vérifierais l'enregistrement MX du DNS, puis envoyer un courriel de vérification si l'enregistrement MX existe.

2
Bryan Rehbein

En supposant que c'est les utilisateurs adresse, certains serveurs de messagerie permettent à la commande SMTP VRFY de vérifier réellement l'adresse électronique par rapport à ses boîtes aux lettres. La plupart des sites majeurs ne vous donneront pas beaucoup d’informations; la réponse de gmail est "si vous essayez de l'envoyer par courrier, nous essaierons de le livrer" ou quelque chose d'intelligent comme ça.

1
Austin Salonen

Je pense que vous ne pouvez pas, il y a tellement de scénarios où même l'envoi d'un courrier électronique peut échouer. Par exemple. le serveur de messagerie du côté utilisateur est temporairement indisponible, la boîte aux lettres existe mais est pleine, le message ne peut pas être remis, etc.

C'est probablement pourquoi tant de sites valident une inscription après que l'utilisateur a confirmé avoir reçu le courrier électronique de confirmation.

1
PhiLho