Wie kann man prüfen, ob eine E-Mail-Adresse nicht existiert, ohne eine E-Mail zum Testen zu verschicken?
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