147 votes

Comment vérifier si une adresse électronique existe sans envoyer d'e-mail ?

Je suis tombé sur ce Code PHP pour vérifier l'adresse e-mail en utilisant SMTP sans envoyer un e-mail .

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

110voto

Joseph Tary Points 731

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

  1. Vous pouvez vous connecter au serveur et lancer une commande VRFY. Très peu de serveurs prennent en charge 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 FROM:<>

    RCPT À:utilisateur@domaine

Si l'utilisateur n'existe pas, vous obtiendrez un DSN 5.1.1. Cependant, ce n'est pas parce que l'email n'est pas rejeté que l'utilisateur existe. Certains serveurs rejettent silencieusement les requêtes de ce type afin d'empêcher l'énumération de leurs utilisateurs. D'autres serveurs ne peuvent pas vérifier l'utilisateur, et doivent accepter le message malgré tout.

57voto

Drew Noakes Points 69288

D'autres réponses ici discutent des différents problèmes rencontrés en essayant de faire cela. J'ai pensé montrer comment vous pourriez essayer 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 de l'existence d'une adresse e-mail pour stackoverflow.com :

C:\\>nslookup -q=mx stackoverflow.com
Non-authoritative answer:
stackoverflow.com       MX preference = 40, mail exchanger = STACKOVERFLOW.COM.S9B2.PSMTP.com
stackoverflow.com       MX preference = 10, mail exchanger = STACKOVERFLOW.COM.S9A1.PSMTP.com
stackoverflow.com       MX preference = 20, mail exchanger = STACKOVERFLOW.COM.S9A2.PSMTP.com
stackoverflow.com       MX preference = 30, mail exchanger = STACKOVERFLOW.COM.S9B1.PSMTP.com

C:\\>telnet STACKOVERFLOW.COM.S9A1.PSMTP.com 25
220 Postini ESMTP 213 y6\_35\_0c4 ready.  CA Business and Professions Code Section 17538.45 forbids use of this system for unsolicited electronic mail advertisements.

helo hi
250 Postini says hello back

mail from: <me@myhost.com>
250 Ok

rcpt to: <fake@stackoverflow.com>
550-5.1.1 The email account that you tried to reach does not exist. Please try
550-5.1.1 double-checking the recipient's email address for typos or
550-5.1.1 unnecessary spaces. Learn more at
550 5.1.1 http://mail.google.com/support/bin/answer.py?answer=6596 w41si3198459wfd.71

Les lignes préfixées par des codes numériques sont des réponses du serveur SMTP. J'ai ajouté quelques lignes vides pour rendre le document plus lisible.

De nombreux serveurs de messagerie ne renvoient pas cette information afin d'éviter la récolte d'adresses électroniques par les spammeurs, vous ne pouvez donc pas compter sur cette technique. Cependant, vous pouvez réussir à éliminer certaines adresses électroniques manifestement mauvaises en détectant les serveurs de messagerie non valides ou en faisant rejeter les adresses des destinataires comme indiqué ci-dessus.

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


En PHP, je crois que vous pouvez utiliser fsockopen , fwrite et fread pour effectuer les étapes ci-dessus de manière programmatique :

$smtp_server = fsockopen("STACKOVERFLOW.COM.S9A1.PSMTP.com", 25, $errno, $errstr, 30);
fwrite($smtp_server, "helo hi\r\n");
fwrite($smtp_server, "mail from: <me@myhost.com>\r\n");
fwrite($smtp_server, "rcpt to: <fake@stackoverflow.com>\r\n");

11voto

kmkaplan Points 10338

La réponse générale est que vous pouvez pas vérifier si une adresse électronique existe événement si vous lui envoyez un courriel : il pourrait simplement aller dans un trou noir.

Cela dit, la méthode décrite ici est très efficace. Elle est utilisée dans le code de production dans 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 trop coûteuse, de nombreux sites vérifient que le courrier arrive quelque part en envoyant un numéro secret qui doit être renvoyé à l'émetteur (soit en allant sur une URL secrète, soit en renvoyant ce numéro secret par courrier électronique). La plupart des listes de diffusion fonctionnent de cette manière.

8voto

Piskvor Points 46986

Cela échouera (entre autres) si le serveur de messagerie cible utilise le greylisting.

Greylisting : Le serveur SMTP refuse la livraison la première fois qu'un client inconnu se connecte, mais autorise la ou les fois suivantes ; cela empêche un certain pourcentage de spambots d'entrer, tout en permettant une utilisation légitime. car on s'attend à ce qu'un expéditeur légitime de courrier réessaie C'est ce que font les agents de transfert de courrier habituels.

Cependant, si votre code ne vérifie que sur le serveur une fois un serveur avec une liste grise refusera la livraison (car votre client se connecte pour la première fois) ; à moins que vous ne vérifiiez à nouveau dans quelque temps, vous pouvez rejeter à tort des adresses électroniques valides.

7voto

Graeme Perrow Points 22249

Quelques problèmes :

  1. Je suis sûr que certains serveurs SMTP vous feront savoir immédiatement si une adresse que vous leur donnez n'existe pas, mais certains ne le feront pas par mesure de confidentialité. Ils acceptent simplement les adresses que vous leur donnez et ignorent silencieusement celles qui n'existent pas.
  2. Comme le dit l'article, si vous faites cela trop souvent avec certains serveurs, ils vous mettront sur liste noire.
  3. Pour certains serveurs SMTP (comme gmail), vous devez utiliser le protocole SSL pour pouvoir faire quoi que ce soit. Cela n'est vrai que lorsque l'on utilise le serveur SMTP de gmail pour envoyer e-mail.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X