Daten|teiler
Kopieren als Kulturtechnik

Wie kann man prüfen, ob eine E-Mail-Adresse nicht existiert, ohne eine E-Mail zum Testen zu verschicken?

13. August 2011 von Christian Imhorst

Vielleicht kennt ihr das Problem ja auch: Man hat vom Format her eine korrekte E-Mail-Adresse, trotzdem wird sie nicht zugestellt, weil das Ziel dem Mail-Server unbekannt ist. Eine formal richtige E-Mail-Adresse wäre zum Beispiel lpage@google.com. Sollte ich aber an diese Adresse eine E-Mail schicken, würde ich folgende Antwort erhalten:

Delivery to the following recipient failed permanently:
 
     lpage@google.com
 
Technical details of permanent failure: 
Google tried to deliver your message, but it was rejected by the recipient domain. We recommend contacting the other email provider for further information about the cause of this error. The error that the other server returned was: 550 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 c20si4840621fai.47 (state 14).

Wie kann ich also im Vorfeld prüfen, ob eine E-Mail-Adresse [nicht] existiert, ohne eine Test-Mail zu versenden? Zum Beispiel mit den beiden Kommandozeilen-Tools nslookup und telnet, die bei Gnu/Linux, MacOS X und Windows standardmäßig dabei sind. Allerdings muss man unter Windows 7 den Telnet-Client erst aktivieren, bevor man ihn nutzen kann.

Zuerst benötigen wir für dieses Beispiel den Mail-Exchanger von Google, den man in der Konsole mit nslookup ermittelt. Das Beispiel ist aus der Bash mit nslookup unter Ubuntu 10.04. In anderen Konsolen unter anderen Betriebssystemen kann die Ausgabe des Befehls leicht anders aussehen. Das Prinzip ist aber dasselbe:

nslookup -q=mx google.com
Server:		192.168.178.1
Address:	192.168.178.1#53
 
Non-authoritative answer:
google.com	mail exchanger = 50 alt4.aspmx.l.google.com.
google.com	mail exchanger = 10 aspmx.l.google.com.
google.com	mail exchanger = 20 alt1.aspmx.l.google.com.
google.com	mail exchanger = 30 alt2.aspmx.l.google.com.
google.com	mail exchanger = 40 alt3.aspmx.l.google.com.

Ich entscheide mich für den Mailserver mail exchanger = 10 aspmx.l.google.com und baue über telnet eine Verbindung zu ihm auf:

telnet aspmx.l.google.com 25
Trying 74.125.39.27...
Connected to aspmx.l.google.com.
Escape character is '^]'.
220 mx.google.com ESMTP 3si5028908fav.179

Nach dem Befehl telnet folgt die Adresse des Mailservers aspmx.l.google.com und zum Schluss noch der Port, über den kommuniziert werden soll, also Port 25 für SMTP. Da ich ein höflicher Mensch bin, sage ich dem Server erstmal “Hallo”.

helo hi
250 mx.google.com at your service

Und der Server antwortet mit 250, was bedeutet, dass meine Anfrage erfolgreich beantwortet wurde und sagt mir, dass er zu meinen Diensten steht. Sehr schön. Danach gebe ich ein, von wem die E-Mail kommen soll. In diesem Fall also von mir:

mail from: <christian.imhorst@mail.ru>
250 2.1.0 OK 3si5028908fav.179

Die spitzen Klammern vor und nach der E-Mail-Adresse sind wichtig. Ansonsten erhält man einen Syntax Error. Dann schaue ich nach, ob die E-Mail-Adresse existiert:

rcpt to: <lpage@google.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 recipients 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 3si5028908fav.179

Wie man sieht, existiert diese E-Mail-Adresse leider nicht. Der Server antwortet mit 550 und sagt mir damit, dass meine Anfrage nicht erfolgreich war. Aber da ich weiß, das mein Ansprechpartner Larry mit Vornamen heißt, probiere ich das folgende Muster:

rcpt to: <larry.page@google.com>
250 2.1.5 OK 3si5028908fav.179

Der Server meldet zurück, dass ihm diese E-Mail-Adresse bekannt ist. Ob das auch wirklich der Larry Page ist, den ich anschreiben möchte, ist eine andere Frage, zumindest aber existiert diese E-Mail-Adresse. Mit dem Befehl quit schließt man die Telnet-Sitzung wieder.

Manche Mail-Server haben übrigens ein Catch-All für E-Mails, dann laufen alle E-Mails mit einer formal richtigen E-Mail-Adresse der Domain in der gleichen Mailbox zusammen und der Mail-Server antwortet in diesem Fall bei jeder formal gültigen Adresse mit einem “OK”. [Update:] Wie man in den ersten beiden Kommentaren nachlesen kann, gibt es noch weitere Möglichkeiten, die dieses Verfahren hinfällig werden lassen, wie Graue Listen, Sender Policy Framework (SPF), Konformitätsprüfung oder ein rDNS lookup der Client-IP durch den MSA. Letztendlich lässt sich mit dem Verfahren nur ermitteln, ob zum Zeitpunkt der Abfrage der Mailserver bereit oder in der Lage ist, den Mailversand zu einer bestimmten E-Mail-Adresse durchzuführen.

Was kann man mit diesem Wissen, ob zum Zeitpunkt der Abfrage der Mailserver bereit oder in der Lage ist, den Mailversand zu einer bestimmten E-Mail-Adresse durchzuführen, nun anfangen? Zur Validierung von E-Mail-Adressen ist das Verfahren aus den oben genannten Gründen nur begrenzt geeignet. Abgesehen davon, kann die valide E-Mail-Adresse auch eine kurzfristige bzw. Wegwerf-E-Mail-Adresse z.B. von 10minutemail.com sein. Aber man kann mit diesem Verfahren seinen eigenen oder den Mailserver des Providers testen und dessen Funktionsweise überprüfen. So kann man eine Fehlerdiagnose durchführen, indem man mit dem Server direkt in einer seiner Protokollsprachen kommuniziert: SMTP, POP3 und IMAP.

Geschrieben in Gnu/Linux, MacOS X und iPhone, Windows

11 Antworten

  1. dmaus

    Mit diesem Verfahren lässt sich nicht prüfen, ob eine Emailadresse existiert, sondern nur, ob der zuständige Mailserver die Zustellung einer Email an die Zieladresse mit dem Absender MAIL FROM: vom Rechner über den du den SMTP Dialog initiierst zum Zeitpunkt der Abfrage durchzuführen bereit oder in der Lage ist. Wenn du Glück hast kommt da ein 550 No Such Mailbox raus.

    Der Catch-All ist dir ja selbst eingefallen. Mir fallen dazu noch diverse Verfahren zur Spambekämpfung (Graylisting, SPF, DNS-Lookups, Konformitätsprüfung) und temporäre Störungen des Mailservers ein.

    Richtig muss es heissen:

    Wie kann man prüfen, ob eine E-Mail-Adresse nicht existiert, ohne eine Test-Mail zu verschicken?

    1. Finden einen für die Domain der Zieladresse zuständingen MTA
    2. Initiiere einen Zustellversuch
    3. Antwortet der MTA, dass die Adresse nicht existiert, dann existiert die Adresse nicht.

  2. a326290

    Als Abwehr gegen Spammer prüft der MSA in der Regel die eingegebenen Daten, dazu zählt auch eine rDNS lookup der Client-IP. Mit dem Ergebnis, dass der MSA einem nicht mitteilt, ob der Empfänger existiert, sobald man das beschriebene Verfahren von seinem Heim-Rechner aus testet.

  3. Christian Imhorst

    @David: Guter Hinweis, ich habe den Titel angepasst.

  4. Aus der virtuellen Nachbarschaft [32] | HFs Jotter

    […] bei Daten|teiler […]

  5. Wie kann man prüfen, ob eine E-Mail-Adresse existiert, ohne eine …

    […] hier den Originalbeitrag weiterlesen: Wie kann man prüfen, ob eine E-Mail-Adresse existiert, ohne eine … […]

  6. Raptor 2101

    Ähm irgendwie erschließt sich mir der Sinn dieses Verfahrens nicht. Um eine Email nicht zu testzwecken versenden zu müssen, macht man ein DNS-Lookup auf die mx records. Baut dann vie Telnet eine SMTP – Verbindung auf um dann einen Zustellversuch zu initieren? Einziger Mehrwert ist meiner Meinung nach, dass man das Ergbeniss (wenn man es so nennen will) sofort hat und nicht auf den MTA warten muss.

    Das Verfahren hat noch weitere Nachteile. Einige MTAs (gmx zb.) lassen erst gar keinen Verbindungsaufbau zu, wenn der Request von einer Dynamischen IP oder einer IP ohne ReverseLookup kommt.

  7. Christian Imhorst

    @Raptor2101: Richtig, dass das Verfahren nicht pralle ist, habe ich ja schon zugegeben. Aber ich finde es besser, so zu prüfen, vorausgesetzt, der MTA lässt diese Form des Verbindungsaufbaus zu, als eine E-Mail abzuschicken und auf die evtl. Antwort des MTA zu warten.

  8. Raptor 2101

    Ich Formulier die Frage mal anders herum. Wofür braucht man eine Validierung der Mail-Addresse?

    Ich unterstelle jetzt mal, dass deine Arbeite über ein “ich wollte nur zeigen das so was geht” hinausgeht. wofür braucht man eine EMail-Validierung. Zur Validierung eine Registreriung, für einen Rückkannal (Antwort auf Blog-Posting) und zur spamabwehr (kennt jemand noch mehr Gründe?)

    Im ersten Fall kann ich mir die Validierung sparen, da mir der User im Zweifelsfall einen OneTimeHoster vor den Latz knallt. In den anderen beiden Fällen ist die Validierung unnötig. Spammer kommen meist mit Validen Adressen daher und die die eine FakeAdresse angeben werden ihre Gründe haben. Mir fehlt ein bisschen der Einsatzzweck. (Ausnahme man betreibt einen MTA und will prüfen ob man eine EMail zustellen kann)

  9. Christian Imhorst

    @Raptor 2101: Einen Einsatzzweck habe ich nicht. Ich habe auch nicht vor, E-Mails hier im Blog zu validieren o.ä. Hier kann jeder eine Fantasie-E-Mail-Adresse eingeben und anonym Kommentare schreiben, solange er nicht gegen die Netiquette verstößt. Für mich war es einfach nur ein Spaß zu schauen. Ich hätte auch http://verify-email.org/ benutzen können.

    Ich habe mir aber deine Kritik zu Herzen genommen und den Blog-Post um einen Abschnitt erweitert, der erläutert, was man mit diesem Wissen evtl. anfangen kann.

  10. Flyingmana

    In diesem Zusammenhang ist auch Webfinger interessant. Bei Providern die das unterstützen kann man so per http testen, ob eine Mailadresse vergeben ist.

  11. leser

    Wie in Kommentar 1 schon beschrieben, lässt sich “mit diesem Verfahren […] nicht prüfen, ob eine Emailadresse existiert”. Für die Prüfung gibt es das VRFY-Kommando, das aber wegen Missbrauch von Spammern heutzutage deaktiviert ist.