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

123

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

Hat jemand etwas ähnliches versucht oder funktioniert es für Sie? Können Sie feststellen, ob eine E-Mail, die ein Kunde / Benutzer eingibt, korrekt ist und existiert?

PHP-Typ
quelle
2
Ich frage mich nur, warum dies das Telnet-Tag hat.
Piccolo
2
Es gibt eine PHP-Bibliothek, die genau das tut: github.com/kickboxio/kickbox-php
Dan
Kickbox ist nicht kostenlos. Diese API ist nur ein Wrapper, um eine Verbindung zu ihrem Dienst herzustellen.
Ashit Vora

Antworten:

92

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

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

    VRFY user
  2. Sie können a ausgeben RCPTund prüfen, ob die E-Mail abgelehnt wurde.

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

Wenn der Benutzer nicht existiert, erhalten Sie einen 5.1.1-DSN. Nur weil die E-Mail nicht abgelehnt wird, bedeutet dies 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 überprüfen und müssen die Nachricht trotzdem akzeptieren.

Es gibt auch eine Antispam-Technik namens Greylisting, bei der der Server die Adresse zunächst ablehnt und erwartet, dass ein echter SMTP-Server einige Zeit später eine erneute Zustellung versucht. Dies wird Versuche, die Adresse zu validieren, durcheinander bringen.

Wenn Sie versuchen, eine Adresse zu validieren, ist es am besten, einen einfachen regulären Ausdruck zu verwenden, um offensichtlich ungültige Adressen zu blockieren, und dann eine tatsächliche E-Mail mit einem Link an Ihr System zu senden, der den Empfang der empfangenen E-Mail bestätigt. Dies stellt auch sicher, dass der Benutzer seine eigentliche E-Mail-Adresse eingegeben hat und kein Tippfehler, der zufällig jemand anderem gehört.

Joseph Tary
quelle
10
Einige Server akzeptieren die Nachricht sogar, senden aber später eine Fehlermeldung an den Absender des Umschlags zurück, insbesondere wenn es sich um eine große Organisation mit vielen internen Abteilungen mit eigenen Mailservern handelt. Der Grenzserver kennt möglicherweise nicht einmal alle darin enthaltenen Konten.
David Mårtensson
3
Warum verwenden Spammer diese Methode dann nicht, um E-Mail-Addies zu überprüfen? Ich meine abgesehen von der Tatsache, dass diese Methoden von sehr wenigen Servern unterstützt werden. Oder doch?
Shahriyar Imanov
7
@Shehi: Eigentlich Spammer kann diese Methode verwenden, die zu sagen , ist schwer. Da Spammer es jedoch möglicherweise verwenden, deaktivieren fast alle Mailserver VRFY, sodass VRFY in der Praxis wahrscheinlich nutzlos ist.
Sleske
2
Können Sie ein Codebeispiel für die Verwendung eines RCPT TO geben: <user @ domain>? Vielen Dank
Papa De Beau
4
Auf VRFY antwortet Google Mail "Sende eine Mail, ich werde mein Bestes geben" ;-)
Armel Larcier
46

Andere Antworten hier diskutieren die verschiedenen Probleme bei dem Versuch, dies zu tun. 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 fragen, ob eine E-Mail-Adresse vorhanden ist. Hier ist ein Beispiel zum Testen einer E-Mail-Adresse für stackoverflow.com:

C: \> nslookup -q = mx stackoverflow.com
Nicht maßgebliche Antwort:
stackoverflow.com MX-Voreinstellung = 40, Mail-Austauscher = STACKOVERFLOW.COM.S9B2.PSMTP.com
stackoverflow.com MX-Voreinstellung = 10, Mail-Austauscher = STACKOVERFLOW.COM.S9A1.PSMTP.com
stackoverflow.com MX-Voreinstellung = 20, Mail-Austauscher = STACKOVERFLOW.COM.S9A2.PSMTP.com
stackoverflow.com MX-Voreinstellung = 30, Mail-Austauscher = STACKOVERFLOW.COM.S9B1.PSMTP.com

C: \> telnet STACKOVERFLOW.COM.S9A1.PSMTP.com 25
220 Postini ESMTP 213 y6_35_0c4 bereit. CA Business and Professions Code Abschnitt 17538.45 verbietet die Verwendung dieses Systems für unerwünschte E-Mail-Werbung.

helo hi
250 Postini sagt Hallo zurück

Mail von: <[email protected]>
250 Ok

rcpt an: <[email protected]>
550-5.1.1 Das E-Mail-Konto, das Sie erreichen wollten, ist nicht vorhanden. Bitte versuche
550-5.1.1 Überprüfen der E-Mail-Adresse des Empfängers auf Tippfehler oder
550-5.1.1 unnötige Leerzeichen. Erfahren Sie mehr unter
550 5.1.1 http://mail.google.com/support/bin/answer.py?answer=6596 w41si3198459wfd.71

Mit numerischen Codes vorangestellte Zeilen sind Antworten vom SMTP-Server. Ich habe einige Leerzeilen hinzugefügt, um die Lesbarkeit zu verbessern.

Viele Mailserver geben diese Informationen nicht zurück, um das Sammeln von E-Mail-Adressen durch Spammer zu verhindern. Sie können sich daher nicht auf diese Technik verlassen. Es kann jedoch sein, dass Sie einige offensichtlich schlechte E-Mail-Adressen erfolgreich bereinigen, indem Sie ungültige Mailserver erkennen oder Empfängeradressen wie oben abgelehnt haben.

Beachten Sie auch, dass Mailserver Sie möglicherweise auf die schwarze Liste setzen, wenn Sie zu viele Anfragen an sie stellen.


In PHP glaube ich , die Sie verwenden können fsockopen, fwriteund freaddie obigen Schritte programmatisch 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");
Drew Noakes
quelle
Hut ab! Ein Problem, das ich gefunden habe, ist, funktioniert Port 25 immer mit MX-Datensätzen mit niedriger Priorität?
Dhruvenkumar Shah
@DhruvenkumarShah, sorry ich weiß es nicht. Wenn Sie es herausfinden, kommentieren Sie bitte erneut.
Drew Noakes
Hallo, ich habe nur versucht, für mein eigenes Universitätskonto alles über MX-Datensätze herauszufinden, aber es hat 25 Jahre lang nicht funktioniert. Aber die Online-Website verify-email.org hat funktioniert. Wie sie es machen. Ich Ich werde Sie darüber informieren, wenn ich es herausfinde
Dhruvenkumar Shah
1
@DhruvenkumarShah gibt es nur wenige Mail-Exchange-Servernamen. Siehe die Antwort für Mail-Austauscher. Wenn einer fehlschlägt, sollte der andere aus der Liste funktionieren.
Janaka R Rajapaksha
wirklich sehr Hilfe voll zu mir .. danke Sir .. ich habe es in Kitt versucht und funktioniert wie Zauber .. danke ..
Mohammed Sufian
8

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

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 Benutzerinteraktion mit seiner Mailbox nicht zu kostspielig ist, testen viele Websites tatsächlich, ob die Mail irgendwo ankommt, indem sie eine Geheimnummer senden, die an den E-Mail-Sender zurückgesendet werden muss (entweder indem sie zu einer geheimen URL gehen oder diese Geheimnummer per E-Mail zurücksenden). Die meisten Mailinglisten funktionieren so.

kmkaplan
quelle
6

Nicht wirklich ..... Einige Server überprüfen möglicherweise nicht das "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.

l_39217_l
quelle
Ich habe auch darüber nachgedacht :)
Janaka R Rajapaksha
6

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

Greylisting : SMTP-Server verweigert die Zustellung beim ersten Herstellen einer Verbindung mit einem zuvor unbekannten Client und ermöglicht das nächste Mal. Dadurch wird ein gewisser Prozentsatz der Spambots ferngehalten und gleichzeitig eine legitime Verwendung ermöglicht. Es wird erwartet, dass ein legitimer E-Mail-Absender es erneut versucht, wie dies bei normalen E-Mail-Übertragungsagenten der Fall ist.

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 nicht kurz nachsehen, lehnen Sie möglicherweise fälschlicherweise gültige E-Mail-Adressen ab.

Piskvor verließ das Gebäude
quelle
(persönliche Erfahrung: Ich musste mit meinem E-Mail-Anbieter hin und her streiten, dass ja , ich weiß, was ich tue, und ja , ich muss das Greylisting deaktivieren - weil diese Überprüfungen durch einen Drittanbieter fehlgeschlagen sind )
Piskvor verließ das Gebäude
4

Einige Fragen:

  1. Ich bin sicher, dass einige SMTP-Server Sie sofort informieren werden, wenn eine von Ihnen angegebene Adresse nicht vorhanden ist, andere jedoch nicht als Datenschutzmaßnahme. Sie akzeptieren einfach alle Adressen, die Sie ihnen geben, und ignorieren stillschweigend diejenigen, die nicht existieren.
  2. Wie der Artikel sagt, werden Sie von einigen Servern auf die schwarze Liste gesetzt, wenn Sie dies zu oft tun.
  3. Bei einigen SMTP-Servern (wie Google Mail) müssen Sie SSL verwenden, um etwas zu tun. Dies gilt nur, wenn Sie den SMTP-Server von Google Mail zum Senden von E-Mails verwenden.
Graeme Perrow
quelle
In Bezug auf den dritten Punkt geschieht dies nur, wenn Sie es als Relais verwenden möchten. Ich kenne keinen Mail-Austauscher, der SSL benötigt. In diesem Fall würden sie keine E-Mails mehr von vielen Benutzern erhalten.
kmkaplan
Entschuldigung, mein Fehler. Wenn Sie E-Mails über den SMTP-Server von Google Mail senden möchten, müssen Sie SSL verwenden.
Graeme Perrow
3

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

Ich habe diesen Open-Source-Service für eine eingehendere Validierung 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, die sehr nützlich sind. Demo hier .

Henkealg
quelle
Sie behaupten, dieser Service sei Open Source. Könnten Sie einen Link zur Quelle bereitstellen?
Amaurymartiny
Es tut mir leid @amaurymartiny kann ich nicht. Zum Zeitpunkt des Schreibens war das Mailgun-Projekt Open Source, wenn ich mich richtig erinnere, aber ich kann nach dieser Zeit keinen Link zu einem Repo finden, das die Quelle bereitstellt.
Henkealg
2

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

Eigentlich sind das zwei getrennte Dinge. Es könnte existieren, aber möglicherweise nicht korrekt sein.

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

Lernen
quelle
2
+1 Sie können niemals sicher sein, dass es korrekt ist, ohne eine E-Mail zu senden und tatsächlich eine menschliche Antwort darauf zu erhalten, z. B. durch Klicken auf einen Link.
Daniel Daranas
Sie können einen Link (für ein Bild usw.) im E-Mail-Text behalten und jede Ladung für diesen Link zählen. Keine Notwendigkeit, auf Klicks zu warten
Janaka R Rajapaksha
2

Sie können lediglich DNS durchsuchen und sicherstellen, dass die Domain in der E-Mail-Adresse über einen MX-Eintrag verfügt. Ansonsten gibt es keine zuverlässige Möglichkeit, damit umzugehen.

Einige Server arbeiten möglicherweise mit der Methode rcpt-to, mit 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 möglicherweise einen 550-Code zurückgibt, der besagt, dass der Benutzer unbekannt ist. Dies ist jedoch ein vorübergehender Fehler. Es gibt einen dauerhaften Fehler (451, glaube ich?), Der zurückgegeben werden kann. Dies hängt vollständig 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.

Bryan Rehbein
quelle
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
quelle
1
Port 80 macht keinen Sinn
Jrosell
5
Ich denke, das ist nur die Überprüfung des Domainnamens, anstatt die E-Mail selbst zu überprüfen.
The Angry Saxon
Dies könnte nützlicher sein:getmxrr
Jchook
1

Angenommen, es handelt sich um die Adresse des Benutzers , erlauben einige Mailserver dem SMTP VRFY-Befehl, die E-Mail-Adresse tatsächlich anhand seiner Postfächer zu überprüfen. Die meisten wichtigen Websites bieten Ihnen nicht viele Informationen. Die Google Mail-Antwort lautet "Wenn Sie versuchen, es zu versenden, werden wir versuchen, es zuzustellen" oder so etwas Kluges.

Austin Salonen
quelle
1

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, das Postfach ist vorhanden, aber voll, sodass keine Nachricht zugestellt werden kann.

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

PhiLho
quelle
0

Ich kann die Antworten von Joseph und Drew bestätigen RCTP TO: <address_to_check>. Ich möchte zusätzlich zu diesen Antworten einige kleine Ergänzungen hinzufügen.

Catch-All-Anbieter

Einige Mail-Anbieter implementieren eine Catch-All-Richtlinie, dh, *@mydomain.comder RCTP TO:Befehl wird positiv an den Befehl zurückgegeben. Dies bedeutet aber nicht unbedingt, dass das Postfach "existiert", wie in "gehört einem Menschen". Hier kann nicht viel getan werden, sei dir nur bewusst.

IP Greylisting / Blacklisting

Greylisting: 1. Verbindung von unbekannter IP ist blockiert. Lösung: Versuchen Sie es mindestens zweimal.

Blacklisting: Wenn Sie zu viele Anfragen von derselben IP senden, wird diese IP blockiert. Lösung: Verwenden Sie die IP-Rotation. Reacher benutzt Tor.

HTTP-Anforderungen in Anmeldeformularen

Dies ist sehr anbieterspezifisch, aber manchmal können Sie gut gestaltete HTTP-Anforderungen verwenden und die Antworten dieser Anforderungen analysieren, um festzustellen, ob ein Benutzername bereits bei diesem Anbieter angemeldet ist oder nicht.

Hier ist die relevante Funktion aus einer Open-Source-Bibliothek, die ich geschrieben habe, um *@yahoo.comAdressen mithilfe von HTTP-Anforderungen zu überprüfen : Überprüfen, ob E-Mail vorhanden ist . Ich weiß, dass mein Code Rust ist und dieser Thread mit PHP markiert ist, aber die gleichen Ideen gelten.

Voller Posteingang

Dies kann ein Randfall sein, aber wenn der Benutzer einen vollen Posteingang hat, RCTP TO:wird eine 5.1.1 DSNFehlermeldung zurückgegeben, die besagt, dass er voll ist. Dies bedeutet, dass das Konto tatsächlich existiert!

Offenlegung

Ich führe Reacher aus , eine Echtzeit-API zur E-Mail-Überprüfung. Mein Code ist in Rust geschrieben und zu 100% Open Source. Probieren Sie es aus, wenn Sie eine robustere Lösung wünschen:

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

Mit einer Kombination verschiedener Techniken zum Durchspringen von Reifen schaffe ich es, rund 80% der von meinen Kunden überprüften E-Mails zu überprüfen.

Amaurymartiny
quelle
-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
quelle
Der Benutzer fragt nach einer .Net-Lösung, nicht nach PHP.