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

j'ai trouvé ce code PHP pour vérifier l'adresse e-mail en utilisant SMTP sans envoyer un e-mail .

quelqu'un A déjà essayé quelque chose de similaire ou faut-il travailler pour vous? Pouvez-vous dire si un client / utilisateur de messagerie entre est correcte et existe?

100
demandé sur SagarPPanchal 2009-02-19 17:20:43

13 réponses

il y a 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 prennent en charge cette commande, mais elle est destinée précisément à cela. Si le serveur répond avec un DSN 2.0.0, l'utilisateur existe.

    VRFY utilisateur

  2. vous pouvez délivrer un RCPT, et voir si le courrier est rejeté.

    MAIL FROM:<>

    RCPT to:

si l'utilisateur n'existe pas, vous obtiendrez un 5.1.1 DSN. Cependant, ce n'est pas parce que le courriel n'est pas rejeté que l'utilisateur existe. Certains serveurs rejetteront silencieusement des requêtes comme celle-ci pour empêcher l'énumération de leurs utilisateurs. D'autres serveurs ne peuvent pas vérifier l'utilisateur, et doivent accepter le message indépendamment.

Il y a aussi une technique antispam appelée greylisting, qui fera que le serveur rejettera l'adresse initialement, en s'attendant à ce qu'un vrai serveur SMTP tente une nouvelle livraison plus tard. Cela embrouillerait tente de valider l'adresse.

honnêtement, si vous tentez de valider une adresse la meilleure approche est d'utiliser un regex simple pour bloquer les adresses évidemment invalides, puis envoyer un courriel réel avec un lien vers votre système qui va valider le courriel a été reçu. Cela permet également de s'assurer qu'ils ont saisi leur courriel réel, pas une légère faute de frappe qui se trouve appartenir à quelqu'un d'autre.

80
répondu Joseph Tary 2016-06-07 22:52:01

D'autres réponses ici discutent les différents problèmes avec essayer de le faire. Je voulais vous montrer comment vous pourriez essayer ça 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'adresse email 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 de codes numériques sont des réponses du serveur SMTP. J'ai ajouté quelques lignes blanches le rendre plus lisible.

beaucoup de serveurs de messagerie ne retourneront pas ces informations comme un moyen d'empêcher la récolte d'adresse email par les spammeurs, de sorte que vous ne pouvez pas compter sur cette technique. Cependant, vous pouvez avoir un certain succès à nettoyer certaines adresses email évidemment mauvaises en détectant des serveurs de courrier invalides, ou avoir des adresses de destinataire rejeté comme ci-dessus.

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


en PHP je crois que vous pouvez utiliser fsockopen , fwrite et fread pour effectuer les étapes ci-dessus programmatically:

$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");
44
répondu Drew Noakes 2012-12-04 11:09:25

La réponse générale est que vous pouvez pas vérifier si une adresse email existe événement si vous envoyez un courriel à: il peut juste aller dans un trou noir.

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

où l'interaction de l'utilisateur avec sa boîte aux lettres n'est pas excessivement de nombreux sites réellement tester que le courrier arrive quelque part en envoyant un numéro secret qui doit être renvoyé à l'émetteur (soit en allant à une URL secrète ou en renvoyant ce numéro secret par courriel). La plupart des listes de diffusion fonctionnent ainsi.

8
répondu kmkaplan 2009-02-19 15:51:05

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

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

cela représente un risque pour la sécurité.....

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

6
répondu l_39217_l 2009-02-19 14:26:19

cela échouera (entre autres cas) lorsque le serveur de messagerie cible utilise greylisting.

Greylisting : le serveur SMTP refuse la livraison la première fois qu'un client inconnu se connecte, permet la(Les) prochaine (S) fois; cela permet de garder un certain pourcentage de spambots, tout en permettant l'utilisation légitime - comme il est prévu qu'un expéditeur de courrier légitime rejettera , ce qui est ce que les agents normaux de transfert de courrier feront.

cependant, si votre code ne vérifie que sur le serveur une fois , un serveur avec greylisting refusera la livraison (car votre client se connecte pour la première fois); à moins que vous ne vérifiiez à nouveau dans un peu de temps, vous pourriez rejeter incorrectement les adresses e-mail valides.

5
répondu Piskvor 2011-05-20 17:38:33

Certaines questions:

  1. je suis sûr que certains serveurs SMTP vous préviendront immédiatement si une adresse que vous leur donnez n'existe pas, mais certains n'existeront pas en tant que mesure de confidentialité. Ils accepteront les adresses que vous leur donnerez et ignoreront celles qui n'existent pas.
  2. Comme le dit l'article, si vous le faites trop souvent avec certains serveurs, ils seront de la liste noire.
  3. pour certains serveurs SMTP (comme gmail), vous devez utiliser SSL afin de faire quoi que ce soit. ceci n'est vrai que si vous utilisez le serveur SMTP de gmail pour envoyer email.
4
répondu Graeme Perrow 2009-02-19 15:08:33

"Pouvez-vous dire si un e-mail, le client / utilisateur entrée est correcte et existe?"

en Fait, ce sont deux choses distinctes. Il pourrait exister mais pourrait ne pas être correct.

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

2
répondu Learning 2009-02-19 14:41:17

à propos de tout ce que vous pouvez faire est de rechercher DNS et de s'assurer que le domaine qui est dans l'adresse e-mail a un enregistrement MX, autre que qu'il n'y a aucun moyen fiable de traiter avec 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 un serveur surchargé peut retourner un code 550 disant que l'utilisateur est inconnu, mais il s'agit d'une erreur temporaire, il y a une erreur permanente (451 je pense?) qui peuvent être retournés. Cela dépend entièrement de la configuration du serveur.

personnellement, je vérifierais l'enregistrement MX DNS, puis j'enverrais un email de vérification si L'enregistrement MX existe.

2
répondu Bryan Rehbein 2009-02-19 15:47:58
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
    }
}
2
répondu Sachin 2015-11-17 22:52:57

bien que cette question soit un peu vieille, cette astuce de service pourrait aider les utilisateurs à la recherche d'une solution similaire vérifier les adresses e-mail au-delà de la validation de la syntaxe avant l'envoi.

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

2
répondu Henkealg 2016-06-16 07:25:41

en supposant que c'est l'adresse de l'utilisateur, certains serveurs de messagerie permettent à la commande SMTP VRFY de vérifier effectivement l'adresse e-mail par rapport à ses boîtes aux lettres. La plupart du site principal ne vous donnera pas beaucoup d'informations; la réponse de gmail est "si vous essayez de le poster, nous essaierons de le livrer" ou quelque chose d'intelligent comme ça.

1
répondu Austin Salonen 2009-02-19 15:02:59

je pense que vous ne pouvez pas, Il ya tellement de scénarios où même l'envoi d'un e-mail peut échouer. Par exemple. le serveur de messagerie du côté de l'utilisateur est temporairement en panne, la boîte aux lettres existe mais est pleine de sorte que le message ne peut pas être livré, etc.

c'est probablement la raison pour laquelle tant de sites valident une inscription après que l'Utilisateur a confirmé avoir reçu l'e-mail de confirmation.

1
répondu PhiLho 2009-02-19 15:07:10
<?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";

?>
-6
répondu user4314333 2014-12-02 06:36:17