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

123

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

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

php-guy
la source
2
Je me demande simplement pourquoi est-ce que cela a la balise Telnet?
Piccolo
2
Il existe une bibliothèque PHP qui fait exactement cela: github.com/kickboxio/kickbox-php
Dan
Kickbox n'est pas gratuit. Cette API n'est qu'un wrapper pour se connecter à leur service.
Ashit Vora

Réponses:

92

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 VRFYcommande. Très peu de serveurs prennent en charge cette commande, mais elle est destinée exactement à cela. Si le serveur répond avec un DSN 2.0.0, l'utilisateur existe.

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

    MAIL FROM:<>
    RCPT TO:<user@domain>

Si l'utilisateur n'existe pas, vous obtiendrez un DSN 5.1.1. Cependant, ce n'est pas parce que l'e-mail n'est pas rejeté que l'utilisateur existe. Certains serveurs rejetteront silencieusement des demandes comme celle-ci pour 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 liste grise, qui obligera le serveur à rejeter l'adresse initialement, en s'attendant à ce qu'un vrai serveur SMTP tente une redistribution un peu plus tard. 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 simple regex pour bloquer les adresses manifestement invalides, puis à envoyer un e-mail réel avec un lien vers votre système qui validera la réception de l'e-mail. Cela garantit également que l'utilisateur a saisi son e-mail réel, et non une légère faute de frappe qui appartient à quelqu'un d'autre.

Joseph Tary
la source
10
Certains serveurs accepteront même le message mais renverront plus tard un message d'erreur à l'expéditeur de l'enveloppe, surtout si c'est une grande organisation avec de nombreux services internes avec leurs propres serveurs de messagerie. Le serveur frontalier peut même ne pas connaître tous les comptes qu'il contient.
David Mårtensson
3
Alors pourquoi les spammeurs n'utilisent-ils pas cette méthode pour vérifier les adresses e-mail? Je veux dire à part le fait que ces méthodes sont prises en charge par très peu de serveurs. Ou le font-ils?
Shahriyar Imanov
7
@Shehi: En fait, les spammeurs peuvent utiliser cette méthode, c'est difficile à dire. Cependant, comme les spammeurs peuvent l' utiliser, presque tous les serveurs de messagerie désactivent VRFY, donc en pratique VRFY est probablement inutile.
sleske
2
Pouvez-vous donner un exemple de code sur la façon d'utiliser un RCPT TO: <utilisateur @ domaine>? Merci
Papa De Beau
4
A VRFY, gmail répond "Envoyez un mail, je ferai de mon mieux" ;-)
Armel Larcier
46

D'autres réponses ici discutent des divers problèmes liés à cette tentative. J'ai pensé montrer comment vous pourriez essayer cela 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 e-mail existe. Voici un exemple de test d'une adresse e-mail pour stackoverflow.com:

C: \> nslookup -q = mx stackoverflow.com
Réponse ne faisant pas autorité:
Préférence MX stackoverflow.com = 40, échangeur de courrier = STACKOVERFLOW.COM.S9B2.PSMTP.com
Préférence MX stackoverflow.com = 10, échangeur de courrier = STACKOVERFLOW.COM.S9A1.PSMTP.com
Préférence MX stackoverflow.com = 20, échangeur de courrier = STACKOVERFLOW.COM.S9A2.PSMTP.com
Préférence MX stackoverflow.com = 30, échangeur de courrier = STACKOVERFLOW.COM.S9B1.PSMTP.com

C: \> telnet STACKOVERFLOW.COM.S9A1.PSMTP.com 25
220 Postini ESMTP 213 y6_35_0c4 prêt. La section 17538.45 du Code des affaires et professions de CA interdit l'utilisation de ce système pour les publicités électroniques non sollicitées.

helo salut
250 Postini dit bonjour

mail de: <[email protected]>
250 Ok

rcpt à: <[email protected]>
550-5.1.1 Le compte de messagerie auquel vous avez tenté d'accéder n'existe pas. S'il vous plaît essayez
550-5.1.1 revérifier l'adresse e-mail du destinataire pour les fautes de frappe ou
550-5.1.1 espaces inutiles. En savoir plus sur
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é quelques lignes vides pour le rendre plus lisible.

De nombreux serveurs de messagerie ne renverront pas ces informations pour empêcher la collecte d'adresses e-mail par les spammeurs, vous ne pouvez donc pas vous fier à cette technique. Cependant, vous pouvez réussir à nettoyer certaines adresses e-mail manifestement incorrectes en détectant des serveurs de messagerie invalides ou en rejetant les adresses des destinataires comme ci-dessus.

Notez également que les serveurs de messagerie peuvent vous mettre sur liste noire si vous en faites trop de requêtes.


En PHP , je crois que vous pouvez utiliser fsockopen, fwriteet freadpour effectuer 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");
Drew Noakes
la source
chapeau bas! un problème que j'ai trouvé est, est-ce que le port 25 fonctionne toujours avec un enregistrement MX à faible priorité?
Dhruvenkumar Shah
@DhruvenkumarShah, désolé je ne sais pas. Si vous le découvrez, veuillez commenter à nouveau.
Drew Noakes
Salut, j'essayais juste de trouver mon propre compte universitaire pour tout savoir sur les enregistrements MX, mais cela n'a pas fonctionné pendant 25 .. mais le type de site Web en ligne verify-email.org a fonctionné .. comment ils le font .. je vous le fera savoir si je le découvre
Dhruvenkumar Shah
1
@DhruvenkumarShah il donne quelques noms de serveur d'échange de courrier. voir la réponse pour les échangeurs de courrier. donc si l'un échoue, l'autre de la liste devrait fonctionner.
Janaka R Rajapaksha
vraiment très aide à mee .. merci monsieur..je l'ai essayé dans du mastic et fonctionne comme des charmes .. merci ..
Mohammed Sufian
8

La réponse générale est que vous ne pouvez pas vérifier si une adresse e-mail existe événement si vous lui envoyez un e-mail: elle pourrait simplement aller dans un trou noir.

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

Là où l'interaction de l'utilisateur avec sa boîte aux lettres n'est pas trop coûteuse, de nombreux sites testent en fait que le courrier arrive quelque part en envoyant un numéro secret qui doit être renvoyé à l'émetteur (soit en allant vers une URL secrète, soit en renvoyant ce numéro secret par courrier électronique). La plupart des listes de diffusion fonctionnent comme ça.

kmkaplan
la source
6

Pas vraiment ..... Certains serveurs peuvent ne pas vérifier le "rcpt to:"

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

Cela constitue un risque pour la sécurité .....

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

l_39217_l
la source
j'y pensais aussi :)
Janaka R Rajapaksha
6

Cela échouera (parmi d'autres cas) lorsque le serveur de messagerie cible utilise la liste grise.

Liste grise : le serveur SMTP refuse la livraison la première fois qu'un client précédemment inconnu se connecte, autorise la ou les prochaines fois; cela permet de conserver un certain pourcentage de spambots, tout en permettant une utilisation légitime - car on s'attend à ce qu'un expéditeur de courrier légitime réessaye , ce que font les agents de transfert de courrier normaux.

Toutefois, si votre code ne vérifie que sur le serveur une fois , un serveur avec greylisting refusera la livraison (comme votre client se connecte pour la première fois); à moins que vous ne vérifiiez à nouveau dans quelques instants, vous rejetez peut-être par erreur des adresses e-mail valides.

Piskvor a quitté le bâtiment
la source
(expérience personnelle: j'ai dû discuter avec mon fournisseur de messagerie pour dire que oui , je suis conscient de ce que je fais, et oui , j'ai besoin de la mise en liste grise - parce que ces contrôles d'un service tiers échouaient )
Piskvor a quitté le bâtiment
4

Quelques problemes:

  1. Je suis sûr que certains serveurs SMTP vous permettront de savoir immédiatement si une adresse que vous leur donnez n'existe pas, mais certains ne le seront pas par mesure de confidentialité. Ils accepteront simplement les adresses que vous leur donnerez et ignoreront 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 la liste noire.
  3. Pour certains serveurs SMTP (comme gmail), vous devez utiliser SSL pour faire quoi que ce soit. Cela n'est vrai que lorsque vous utilisez le serveur SMTP de gmail pour envoyer des e-mails.
Graeme Perrow
la source
Concernant le troisième point, cela n'arrive que si vous souhaitez l'utiliser comme relais. Je ne connais aucun échangeur de courrier nécessitant SSL. Si quelqu'un faisait cela, il cesserait de recevoir des e-mails de nombreux utilisateurs.
kmkaplan
Désolé, mon erreur. Si vous souhaitez envoyer des e-mails à l'aide du serveur SMTP de gmail, vous devez utiliser SSL.
Graeme Perrow
3

Bien que cette question soit un peu ancienne, cette astuce de service peut aider les utilisateurs qui recherchent une solution similaire à vérifier les adresses e-mail au-delà de la validation de la syntaxe avant l'envoi.

J'utilise ce service open source pour une validation plus approfondie des e-mails (vérification des enregistrements mx sur le domaine de l'adresse e-mail, etc.) pour quelques projets avec de bons résultats. Il vérifie également les fautes de frappe courantes, ce qui est très utile. Démo ici .

Henkealg
la source
Vous prétendez que ce service est open-source. Pourriez-vous fournir un lien vers la source?
amaurymartiny
Je suis désolé @amaurymartiny, je ne peux pas. Au moment de la rédaction de cet article, le projet Mailgun était open source si je me souviens bien, mais je suis incapable de trouver un lien vers un dépôt fournissant la source après cette période.
Henkealg le
2

"Pouvez-vous dire si un e-mail / utilisateur saisi est correct et existe?"

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

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

Apprentissage
la source
2
+1 Vous ne pouvez jamais être sûr qu'il est correct sans envoyer un e-mail et obtenir une réponse humaine, par exemple en cliquant sur un lien.
Daniel Daranas
vous pouvez conserver un lien (pour une image, etc.) dans le corps de l'e-mail et compter chaque chargement pour ce lien. pas besoin d'attendre les clics
Janaka R Rajapaksha
2

Tout ce que vous pouvez faire est de rechercher DNS et de vous assurer que le domaine qui se trouve dans l'adresse e-mail a un enregistrement MX, à part qu'il n'y a pas de 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 y a une erreur permanente (451 je pense?) Qui peut être renvoyée. Cela dépend entièrement de la configuration du serveur.

Je vérifierais personnellement l'enregistrement MX DNS, puis enverrais un e-mail de vérification si l'enregistrement MX existe.

Bryan Rehbein
la source
2
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
    }
}
Sachin
la source
1
port 80 n'a pas de sens
jrosell
5
Je pense qu'il s'agit simplement de vérifier que le nom de domaine existe plutôt que de vérifier l'e-mail lui-même.
The Angry Saxon
Cela pourrait être plus utile:getmxrr
jchook
1

En supposant qu'il s'agisse de l' adresse de l'utilisateur , certains serveurs de messagerie permettent à la commande SMTP VRFY de vérifier réellement l'adresse e-mail 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, nous essaierons de le livrer" ou quelque chose d'intelligent comme ça.

Austin Salonen
la source
1

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

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

PhiLho
la source
0

Je peux confirmer les réponses de Joseph et Drew à utiliser RCTP TO: <address_to_check>. Je voudrais ajouter quelques petits additifs en plus de ces réponses.

Fournisseurs fourre-tout

Certains fournisseurs de messagerie mettre en œuvre une politique fourre-tout, ce qui signifie *@mydomain.comretournera positive à laRCTP TO: commande . Mais cela ne signifie pas nécessairement que la boîte aux lettres "existe", comme dans "appartient à un humain". Rien ne peut être fait grand-chose ici, soyez juste conscient.

Liste grise / liste noire IP

Liste grise: la première connexion depuis une adresse IP inconnue est bloquée. Solution: réessayez au moins 2 fois.

Blacklisting: si vous envoyez trop de requêtes depuis la même IP, cette IP est bloquée. Solution: utilisez la rotation IP; Reacher utilise Tor.

Requêtes HTTP sur les formulaires d'inscription

Ceci est très spécifique au fournisseur, mais vous pouvez parfois utiliser des requêtes HTTP bien conçues et analyser les réponses de ces requêtes pour voir si un nom d'utilisateur est déjà inscrit ou non avec ce fournisseur.

Voici la fonction pertinente d'une bibliothèque open-source que j'ai écrite pour vérifier les *@yahoo.comadresses à l'aide de requêtes HTTP: check-if-email-exists . Je sais que mon code est Rust et que ce fil est étiqueté PHP, mais les mêmes idées s'appliquent.

Boîte de réception complète

Cela peut être un cas extrême, mais lorsque l'utilisateur a une boîte de réception pleine, RCTP TO:il renverra un 5.1.1 DSNmessage d'erreur indiquant qu'elle est pleine. Cela signifie que le compte existe réellement!

Divulgation

Je lance Reacher , une API de vérification des e-mails en temps réel. Mon code est écrit en Rust et est 100% open-source. Découvrez-le si vous voulez une solution plus robuste:

Github: https://github.com/amaurymartiny/check-if-email-exists

Avec une combinaison de différentes techniques pour sauter à travers les cerceaux, j'arrive à vérifier environ 80% des e-mails que mes clients vérifient.

amaurymartiny
la source
-8
<?php

   $email = "someone@exa mple.com";

   if(!filter_var($email, FILTER_VALIDATE_EMAIL))
      echo "E-mail is not valid";
   else
      echo "E-mail is valid";

?>
user4314333
la source
L'utilisateur demande une solution .Net et non php.