Question

Je suis venu dans cette code PHP pour vérifier l'adresse e-mail via SMTP sans envoyer un e-mail .

Quelqu'un at-il essayé quelque chose de semblable ou ça marche pour vous? Pouvez-vous dire si un client entre e-mail / utilisateur est correct et existe?

Était-ce utile?

La solution

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 une commande VRFY. Très peu prennent en charge les serveurs de cette commande, mais il est prévu exactement cela. Si le serveur répond avec un DSN 2.0.0, l'utilisateur existe.

    utilisateur VRFY

  2. Vous pouvez publier un RCPT, et voir si le message est rejeté.

    MAIL FROM: <>

    RCPT TO:

Si l'utilisateur n'existe pas, vous obtiendrez un DSN 5.1.1. Cependant, juste parce que l'e-mail n'est pas rejeté, ne veut pas dire que l'utilisateur existe. Certains serveur silencieusement jeter des demandes comme celui-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 anti-spam appelée liste grise, ce qui entraînera le serveur de rejeter l'adresse d'abord, attendre un vrai serveur SMTP tenterait une nouvelle livraison quelque temps plus tard. Ce gâchera tente de valider l'adresse.

Honnêtement, si vous essayez de valider une adresse la meilleure approche est d'utiliser un simple regex pour bloquer les adresses invalides de toute évidence, puis envoyez un e-mail réelle avec un lien vers votre système qui validera l'e-mail a été reçu. Cela garantit également que leur utilisateur est entré dans leur e-mail réelle, pas une légère faute de frappe qui arrive à appartenir à quelqu'un d'autre.

Autres conseils

D'autres réponses discuter ici les différents problèmes en essayant de le faire. Je pensais montrer comment vous pouvez essayer cela dans le cas où vous vouliez apprendre en faisant vous-même.

Vous pouvez vous connecter à un serveur de messagerie via telnet de se 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
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 avec des 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 reviendra pas cette information comme moyen de prévenir contre la collecte d'adresses e-mail par des spammeurs, vous ne pouvez pas compter sur cette technique. Cependant, vous pouvez avoir un certain succès à nettoyer certaines adresses e-mail évidemment mauvais en détectant les serveurs de messagerie non valides ou ayant les adresses des destinataires rejetées comme ci-dessus.

Notez aussi que les serveurs de messagerie peuvent vous la liste noire si vous faites trop de demandes d'entre eux.


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

$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");

La réponse générale est que vous pouvez pas vérifier si une adresse e-mail existe événement si vous envoyez un courriel à ce. Il pourrait juste aller dans un trou noir

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

Lorsque l'interaction utilisateur avec sa boîte aux lettres ne sont pas overcostly de nombreux sites d'essai 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 ou renvoyer ce numéro secret par email ). La plupart des listes de diffusion fonctionnent comme ça.

Pas vraiment ..... Certains serveur peut ne pas cocher la case "RCPT à:"

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

Cela est un risque de sécurité .....

Si le serveur faire, vous pouvez écrire un bot à la découverte toutes les adresses sur le serveur ....

Cela échouera (entre autres cas) lorsque la mailserver cible utilise greylisting.

Greylisting : serveur SMTP refuse la livraison de la première fois qu'un client se connecte jusque-là inconnue, permet la prochaine fois (s); ce qui maintient un certain pourcentage de spams sur, tout en permettant une utilisation légitime -. comme il est prévu qu'un expéditeur de courrier légitime retente , qui est ce que les agents de transfert de courrier normal feront

Cependant, si votre code ne vérifie que sur le serveur une fois , un serveur avec greylisting nieront la livraison (comme votre client se connecte pour la première fois); à moins que vous vérifiez à nouveau dans peu de temps, vous pouvez rejeter de manière incorrecte les adresses e-mail valide.

Quelques questions:

  1. Je suis sûr que certains serveurs SMTP vous permettra de savoir immédiatement si une adresse que vous leur donnez n'existe pas, mais d'autres non comme une mesure de protection des renseignements personnels. Ils vont simplement accepter ce que vous leur donnez les adresses et ignorer en silence ceux qui n'existent pas.
  2. Comme dit l'article, si vous faites cela trop souvent avec certains serveurs, ils vous la liste noire.
  3. Pour certains serveurs SMTP (comme gmail), vous devez utiliser SSL pour quoi que ce soit. C'est vrai que lorsque vous utilisez le serveur SMTP gmail Envoyer email.
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
    }
}

« Pouvez-vous dire si un client entre e-mail / utilisateur est correct et existe? »

En fait, ce sont deux choses distinctes. Il pourrait existe , mais peut-être pas correct.

Parfois, il faut prendre les entrées de l'utilisateur à la valeur nominale. Il y a plusieurs façons de vaincre le système autrement.

A propos de tout ce que vous pouvez faire est de rechercher DNS et vérifiez que le domaine est l'adresse e-mail a un enregistrement MX, autre que qu'il n'y a aucun moyen fiable de traiter cette question.

Certains serveurs peuvent travailler avec le RCPT à la méthode où vous parlez au serveur SMTP, mais il dépend entièrement de la configuration du serveur. Un autre problème peut être un serveur surchargé peut retourner un code 550 disant utilisateur est inconnu, mais cela est une erreur temporaire, il y a une erreur permanente (451 je pense?) Qui peut être retourné. Cela dépend entièrement sur la configuration du serveur.

Personnellement, je vérifier l'enregistrement MX DNS, puis envoyer une vérification par courriel si l'enregistrement MX.

Bien que cette question est un peu vieux, cette astuce de service peut aider les utilisateurs à la recherche d'une solution similaire vérification adresses e-mail au-delà de la validation de syntaxe avant l'envoi.

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

En supposant qu'il est adresse de l'utilisateur, certains serveurs de messagerie ne permettent la commande VRFY SMTP pour vérifier effectivement l'adresse e-mail contre ses boîtes aux lettres. La majeure partie du site majeur ne vous donnera pas beaucoup d'informations; la réponse est gmail « si vous essayez de l'envoyer, nous allons essayer de le livrer » ou quelque chose d'intelligent comme ça.

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. serveur de messagerie sur le côté utilisateur est temporairement indisponible, boîte aux lettres existe, mais est pleine si un message ne peut pas être livré, etc.

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

<?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";

?>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top