wake-up-neo.com

Wie kann ich überprüfen, ob eine E-Mail-Adresse existiert, ohne eine E-Mail zu senden?

Ich bin auf diesen PHP-Code gestoßen, um die E-Mail-Adresse mit SMTP zu überprüfen, ohne eine E-Mail zu senden .

Hat jemand etwas ähnliches ausprobiert oder funktioniert es bei Ihnen? Können Sie feststellen, ob eine von Ihnen eingegebene E-Mail-Adresse korrekt ist und existiert?

112
php-guy

Es gibt zwei Methoden, mit denen Sie manchmal bestimmen können, ob ein Empfänger tatsächlich existiert:

  1. Sie können eine Verbindung zum Server herstellen und einen VRFY-Befehl absetzen. Nur sehr wenige Server unterstützen diesen Befehl, aber genau dafür ist er vorgesehen. Wenn der Server mit einem 2.0.0-DSN antwortet, ist der Benutzer vorhanden.

    VRFY-Benutzer

  2. Sie können ein RCPT ausstellen und prüfen, ob die E-Mail abgelehnt wird.

    MAIL FROM: <>

    RCPT TO: <Benutzer @ Domäne>

Wenn der Benutzer nicht existiert, erhalten Sie einen 5.1.1 DSN. Nur weil die E-Mail nicht abgelehnt wird, heißt das nicht, dass der Benutzer existiert. Einige Server verwerfen solche Anforderungen stillschweigend, um die Aufzählung ihrer Benutzer zu verhindern. Andere Server können den Benutzer nicht verifizieren und müssen die Nachricht trotzdem akzeptieren.

Es gibt auch eine Antispam-Technik namens Greylisting, die dazu führt, dass der Server die Adresse zunächst ablehnt und erwartet, dass ein echter SMTP-Server einige Zeit später eine erneute Zustellung versucht. Dadurch werden Versuche, die Adresse zu überprüfen, durcheinander gebracht.

Um ehrlich zu sein, wenn Sie versuchen, eine Adresse zu validieren, verwenden Sie am besten einen einfachen regulären Ausdruck, um offensichtlich ungültige Adressen zu blockieren, und senden Sie dann eine tatsächliche E-Mail mit einem Link zurück zu Ihrem System, der den Empfang der E-Mail validiert. Dies stellt auch sicher, dass der Benutzer seine tatsächliche E-Mail-Adresse eingegeben hat, kein Tippfehler, der zufällig jemand anderem gehört.

88
Joseph Tary

Andere Antworten hier erörtern die verschiedenen Probleme, die damit verbunden sind. Ich dachte, ich würde zeigen, wie Sie dies versuchen könnten, falls Sie lernen möchten, indem Sie es selbst tun.

Sie können über Telnet eine Verbindung zu einem Mailserver herstellen, um zu erfahren, ob eine E-Mail-Adresse vorhanden ist. Hier ist ein Beispiel für das Testen einer E-Mail-Adresse für stackoverflow.com:

 C: \> nslookup -q = mx stackoverflow.com 
 Nicht autorisierende Antwort: 
 Stackoverflow.com MX-Einstellung = 40, Mail Exchanger = STACKOVERFLOW.COM.S9B2.PSMTP .com 
 stackoverflow.com MX-Einstellung = 10, Mail Exchanger = STACKOVERFLOW.COM.S9A1.PSMTP.com 
 stackoverflow.com MX-Einstellung = 20, Mail Exchanger = STACKOVERFLOW.COM.S9A2.PSMTP .com 
 stackoverflow.com MX-Einstellung = 30, Mail Exchanger = STACKOVERFLOW.COM.S9B1.PSMTP.com 
 
 C: \> telnet STACKOVERFLOW.COM.S9A1.PSMTP. com 25 
 220 Postini ESMTP 213 y6_35_0c4 fertig. CA Business and Professions Code Section 17538.45 verbietet die Verwendung dieses Systems für unerwünschte E-Mail-Werbung. 
 
 Helo hi 
 250 Postini sagt Hallo zurück 
 
 mail from: <[email protected]> 
 250 Ok 
 
 rcpt zu: <[email protected]> 
 550-5.1.1 Das E-Mail-Konto das du versucht hast zu erreichen existiert nicht. Bitte versuchen Sie 
 550-5.1.1, die E-Mail-Adresse des Empfängers auf Tippfehler zu überprüfen, oder 
 550-5.1.1, unnötige Leerzeichen. Weitere Informationen erhalten Sie unter 
 550 5.1.1 http://mail.google.com/support/bin/answer.py?answer=6596 w41si3198459wfd.71 

Zeilen, denen numerische Codes vorangestellt sind, sind Antworten vom SMTP-Server. Ich habe einige leere Zeilen hinzugefügt, um die Lesbarkeit zu verbessern.

Viele Mail-Server geben diese Informationen nicht zurück, um das Sammeln von E-Mail-Adressen durch Spammer zu verhindern. Sie können sich also nicht auf diese Technik verlassen. Möglicherweise können Sie jedoch einige offensichtlich falsche E-Mail-Adressen bereinigen, indem Sie ungültige E-Mail-Server erkennen oder Empfängeradressen wie oben beschrieben ablehnen.

Beachten Sie auch, dass Mailserver Sie möglicherweise auf eine Blacklist setzen, wenn Sie zu viele Anfragen an sie richten.


In PHP Ich glaube, Sie können fsockopen, fwrite und fread verwenden, um die obigen Schritte programmgesteuert auszuführen:

$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

Die allgemeine Antwort ist, dass Sie nicht überprüfen können, ob eine E-Mail-Adresse existiert, wenn Sie eine E-Mail an sie senden: Sie könnte einfach in ein Schwarzes Loch gehen.

Davon abgesehen ist die dort beschriebene Methode recht effektiv. Es wird im Produktionscode in ZoneCheck verwendet, außer dass RSET anstelle von QUIT verwendet wird.

Wenn die Interaktion des Benutzers mit seiner Mailbox nicht zu kostspielig ist, testen viele Sites tatsächlich, ob die Mail irgendwo ankommt, indem sie eine geheime Nummer senden, die an den Absender zurückgesendet werden muss (entweder über eine geheime URL oder per E-Mail). Die meisten Mailinglisten funktionieren so.

8
kmkaplan

Dies schlägt (unter anderem) fehl, wenn der Ziel-Mailserver Greylisting verwendet.

Greylisting: Der SMTP-Server verweigert die Zustellung, wenn ein zuvor unbekannter Client zum ersten Mal eine Verbindung herstellt, und lässt das nächste Mal zu. Dadurch wird ein gewisser Prozentsatz der Spambots ferngehalten, während eine legitime Verwendung zugelassen wird - , da erwartet wird, dass ein legitimer E-Mail-Absender erneut versucht , was bei normalen E-Mail-Transfer-Agents der Fall ist Wird besorgt.

Wenn Ihr Code den Server jedoch nur einmal überprüft , verweigert ein Server mit Greylisting die Zustellung (da Ihr Client zum ersten Mal eine Verbindung herstellt). Wenn Sie es nicht in Kürze erneut versuchen, lehnen Sie möglicherweise gültige E-Mail-Adressen fälschlicherweise ab.

6
Piskvor

Nicht wirklich ..... Einige Server überprüfen möglicherweise nicht "rcpt to:"

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

Dies ist ein Sicherheitsrisiko .....

Wenn der Server dies tut, können Sie einen Bot schreiben, um jede Adresse auf dem Server zu ermitteln.

6
l_39217_l

Einige Fragen:

  1. Ich bin sicher, dass einige SMTP-Server Sie sofort informieren werden, wenn eine von Ihnen angegebene Adresse nicht existiert, andere jedoch aus Datenschutzgründen nicht. Sie akzeptieren einfach alle Adressen, die Sie ihnen geben, und ignorieren stillschweigend diejenigen, die nicht existieren.
  2. Wenn Sie dies bei einigen Servern zu oft tun, werden Sie auf die schwarze Liste gesetzt.
  3. Für einige SMTP-Server (wie Google Mail) müssen Sie SSL verwenden, um etwas zu tun.  Dies gilt nur, wenn Sie den SMTP-Server von Google Mail für Senden E-Mails verwenden.
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

"Können Sie feststellen, ob ein eingegebener E-Mail-Kunde/Benutzer korrekt ist und existiert?"

Eigentlich sind das zwei getrennte Dinge. Möglicherweise vorhanden, aber möglicherweise nicht korrekt.

Manchmal müssen Sie die Benutzereingaben zum Nennwert übernehmen. Es gibt viele Möglichkeiten, das System anderweitig zu besiegen.

2
Learning

Obwohl diese Frage etwas alt ist, kann dieser Service-Tipp Benutzern bei der Suche nach einer ähnlichen Lösung helfen, die vor dem Senden E-Mail-Adressen überprüft, die über die Syntaxüberprüfung hinausgehen.

Ich habe diesen Open-Sourcing-Dienst für eine eingehendere Überprüfung von E-Mails (Überprüfung auf MX-Einträge in der E-Mail-Adressdomäne usw.) für einige Projekte mit guten Ergebnissen verwendet. Es wird auch nach häufigen Tippfehlern gesucht, was sehr nützlich ist. Demo hier .

2
Henkealg

Sie können lediglich DNS durchsuchen und sicherstellen, dass die Domain in der E-Mail-Adresse einen MX-Eintrag enthält. Es gibt jedoch keine verlässliche Möglichkeit, damit umzugehen.

Einige Server arbeiten möglicherweise mit der Methode rcpt-to, bei der Sie mit dem SMTP-Server kommunizieren. Dies hängt jedoch vollständig von der Konfiguration des Servers ab. Ein weiteres Problem kann sein, dass ein überlasteter Server einen 550-Code zurückgibt, der besagt, dass der Benutzer unbekannt ist. Dies ist jedoch ein vorübergehender Fehler. Es liegt ein permanenter Fehler vor (451, denke ich?), Der zurückgegeben werden kann. Dies hängt ganz von der Konfiguration des Servers ab.

Ich persönlich würde nach dem DNS-MX-Eintrag suchen und dann eine E-Mail-Bestätigung senden, wenn der MX-Eintrag vorhanden ist.

2
Bryan Rehbein

Vorausgesetzt, es ist der Benutzer Bei einigen Mailservern kann der Befehl SMTP VRFY die E-Mail-Adresse anhand der Postfächer überprüfen. Die meisten wichtigen Websites geben Ihnen nicht viele Informationen. Die Google Mail-Antwort lautet "Wenn Sie versuchen, eine E-Mail zu versenden, werden wir versuchen, sie zuzustellen" oder so etwas Schlaues.

1
Austin Salonen

Ich denke, Sie können nicht, es gibt so viele Szenarien, in denen sogar das Senden einer E-Mail fehlschlagen kann. Z.B. Der Mailserver auf der Benutzerseite ist vorübergehend ausgefallen, die Mailbox ist zwar vorhanden, aber voll, sodass die Nachricht nicht zugestellt werden kann usw.

Das ist wahrscheinlich der Grund, warum so viele Websites eine Registrierung validieren, nachdem der Benutzer bestätigt hat, dass sie die Bestätigungs-E-Mail erhalten haben.

1
PhiLho