Geschrieben von: Stephan Troxler
Kategorie: ASP Tricks
This printed page brought to you by AlphaSierraPapa
Man kennt die Problematik - eine Mailadresse die via Webformular entgegengenommen wird, kann man von der Syntax her auf Richtigkeit prüfen wie man will, sie kann immer noch ungültig (nicht existent) sein. Ob sie funktioniert kommt dann erst beim effektiven Gebrauch auf.
Um solche Emailfehler zu vermeiden, kann man nebst den üblichen Prüfroutinen einen weiteren Check einführen, der die Existenz des Mailservers und der Adresse auf diesem Server kontrolliert. Um die im Artikel vorgestellten Techniken erfolgreich einzusetzen, werden nebst Kentnissen über SMTP und die Verwendung von nslookup noch zwei Serverkomponenten benötigt. Die angeführten Komponenten sind Freeware und natürlich lediglich eine Möglichkeit von vielen.
Gegeben sei ein Formular über welches (nebst beliebigen anderen Werten) eine Mailadresse angegeben wird. Nach dem Zuordnen des Wertes in eine Variable erfolgt nun zunächst die gewohnte Gültigkeitsprüfung, welche die folgenden Eigenschaften der E-Mailadresse überprüfen sollte:
So stellen wir sicher, daß wir einerseits den User nicht unnötig bei der Überprüfung warten lassen und andereseits sparen wir uns eine unnötige Abfrage gegen den Mailserver, wenn diese sowieso zum Scheitern verurteilt ist. Ich möchte an dieser Stelle nicht im Detail auf diesen Punkt eingehen. Ein bischen Stringzerlegung sollte noch jeder hinkriegen.
Nun haben wir eine Emailadresse in der Hand, die zumindest theoretisch gültig sein könnte. Für die folgenden Beispiele nennen wir die Variable email und geben Ihr den Wert "info@simmcomm.ch". Diese Variable müssen wir nun zuerst in die Teile vor und nach dem "@" zerlegen. (sofern wir nicht schon beides aus dem ersten Schritt haben):
<% adresse = split (email, "@") account = adresse(0) domain = adresse(1) %>
Mittels einem nslookup auf den Domain der Adresse gilt es nun den für die Adresse zuständigen Mailserver herauszufinden. In einem Command Prompt würde man nun folgendes Kommando absetzen (Achtung: nur NT und 2000):
nslookup - type = mx simmcomm.ch
Die Antwort sieht dann so ähnlich aus:
Der für uns relevante Part steht im hinteren Teil der 5.Zeile:
mail exchanger = mail.simmcomm.ch
Das ist der Server, der für die Mailweiterleitung dieser Domain zuständig ist. Bekommt man diesen Eintrag nicht, gibt es keinen Mailserver. Bekommt man keinerlei Informationen zur Domain, dann gibt es sie nicht. Nun gilt es das ganze Prozedere auf dem Server in ASP vorzunehmen und den ermittelten Mailserver in eine Variable zu bringen. Dazu verwende ich die Freeware-Komponente AspExec von ServerObjects. Der ganze Output wird als String in die Variable mxstring geschrieben.
Set Executor = Server.CreateObject("ASPExec.Execute") Executor.Application = "nslookup" Executor.Parameters = "-type=MX " & domain mxstring = Cstr(Executor.ExecuteDosApp)
Mittels einer Stringzerlegung komme ich nun an den String des Mailservers. Ist der String "mail exchanger " nicht im Output vorhanden, existiert die getestete Domain nicht, oder sie besitzt keinen gültigen MX-Eintrag. In diesem Fall kann das Script frühzeitig abgebrochen werden.
plinks = inStr(mxstring, "mail exchanger ") mxstring = right(mxstring, (len(mxstring) - plinks -16)) plinks = inStr(mxstring, vbCrLf) mailserver = CStr(left(mxstring, plinks -1))
Was übrig bleibt ist die Variable mailserver, welche wir zum nächsten Schritt mitnehmen.
Hinweis: Mit der Komponente AspMX von ServerObjects läßt sich der soeben beschriebene Schritt wesentlich leichter bewältigen. Allerdings ist die Komponente nicht Freeware.
Beim Senden eines Mails kommt das SMTP (Simple Mail Transfer Protocol)-Protokoll zum Zug. In dieser Sektion möchte ich Ihnen einen Kurzüberblick geben, wie eine Kommunikation zwischen einem Mailclient und einem Mailserver etwa aussieht:
Zunächst wird die Verbindung über den Port 25 aufgebaut.
User tippt: telnet mail.simmcomm.ch 25
Sobald diese steht, meldet sich der Mailserver mit einem ersten Statuscode und einer Begrüßung. Diese Meldung ist konfigurierbar und folglich je nach Software und Mailserver wieder anders.
MX antwortet: 220 Host mail.simmcomm.ch ready
Dannach werden die folgenden Kommandos abgesetzt und die entsprechenden Statusmeldungen vom Server empfangen (wieder je nach Server unterschiedlich).
Begrüßung (Handshake):
User tippt: HELO mail.simmcomm.ch MX antwortet: 250 Hello myhost.mydomain.com, pleased to meet you!
Angabe des Absenders/Überprüfung des Absenders
User tippt: MAIL FROM: meinabsender@irgendwas.com MX antwortet: 250 meinabsender@irgendwas.com... Sender ok
Angabe des Empfängers/Überprüfung des Empfängers:
User tippt: RCPT TO: derempfaenger@irgendwas.com MX antwortet: 250 derempfanger@irgenwas.com ... Recipient ok
Als nächstes würde nun der Befehl DATA und die Übergabe der Daten folgen. Für uns ist der interessante Teil jedoch nun durch. Wenn bis hierhin immer ein Ok des Servers zurückkam, wissen wir mit 100% Sicherheit, daß der entfernte Mailserver ein E-Mail an den angegebenen Account annehmen würde.
Zur Überprüfung eines Mailaccounts wurde an sich das VRFY Kommando geschaffen. Da sich ein Mailserver aber so konfigurieren läßt, daß er die Überprüfung ablehnt, ist der Befehl für unser Vorhaben nicht geeignet - und wir müssen den eben beschriebenen langen Weg gehen.
Achtung: Ein Mailserver läßt sich so konfigurieren, daß er gründsätzlich alles animmt, was ihm für eine seiner Domains "angeboten" wird. Bei Mailroutern in Großfirmen geht das zum Beispiel gar nicht anders. Dadurch wissen wir natürlich wiederum nicht 100%ig, ob der Account letzten Endes existiert oder nicht. Fest steht jedoch, daß das Mail angenommen wird und die zu sendende Instanz entlastet wird.
Um den vorher beschriebenen Protokollablauf in die Tat umzusetzen brauchen wir eine weitere Serverkomponente, welche die Funktion einer Telnetkonsole auf dem Server wahrnimmt. In meinem Beispiel verwende ich die Freeware-Komponente W3Sockets. Wichtig ist es, ein relativ hohes Timeout zu wählen, da der anzukickende Mailserver je nach dem schnell mal 30 Sekunden wartet bis er antwortet.
Set Socket = Server.CreateObject("Socket.TCP") Socket.Host = mailserver & ":25" Socket.TimeOut = "40000" Socket.Open()
Zuerst kommt der Handshake, anschließend lesen wir die ersten zwei Zeilen aus. Anmerkung: Ich sammle jeweils die Antworten in einem String, um ihn testhalber am Schluß auszugeben.
Socket.sendLine("HELO " & mailserver & vbCrlf) Socket.wait() test1 = Socket.GetLine() & "<br>" test1 = test1 & Socket.GetLine() & "<br>"
Das erste Zeichen im erhaltenen String gibt uns Auskunft über den Statuscode (2xx = ok; 5xx=Fehler). Anhand des Statuscodes speichern wir nun eine entsprechende Mitteilung in der Variablen mxserver.
mxserver = cstr(left(test1, 1)) select case mxserver case "2" mxserver = "existiert" case "5" mxserver = "Eintrag ungültig" case " " OR "" mxserver = "error..." end select
Als Pseudo-Absenderadresse wird eine fix eingetragene Adresse verwendet. Die Antwortzeile müssen wir auslesen, um den Antwortpuffer zu leeren.
Socket.sendLine("Mail From: webmaster@darkwolf.ch" & vbCrlf) test2 = test1 & Socket.GetLine() & "<br>"
Unsere Variable email wird jetzt als Empfänger eingesetzt und gesendet.
Socket.sendLine("RCPT to: " & email & vbCrlf) test3 = Socket.GetLine() verlauf = test2 & test3 & "<br>"
Wie schon beim allgemeinen Testen des Mailserver kann man anhand des ersten Zeichens des Antwortstrings erkennen (Statuscodes), ob der Account existiert oder nicht.
account = cstr(left(test3, 1)) select case account case "2" account = "existiert" case "5" account = "Eintrag ungültig" case " " OR "" account = "error..." end select
Da wir jetzt alle Informationen erhalten haben schließen wir die Verbindung wieder.
Socket.sendLine("QUIT") Socket.Close()
Was uns bleibt, ist der Protokollverlauf und zwei Variablen, die uns über die Existenz des Mailservers und des Accounts Auskunft geben. Am einfachsten verpackt man den ganzen Code in eine Funktion, der man die Adresse übergibt und sich ein True oder False zurückgeben läßt. Im Fehlerfall kann man nun den User auf das Formular zurückleiten und ihn bitten, eine gültige Adresse zu verwenden.
Die Prüfroutine hat einzig einen großen Haken. Sofern der entfernte Mailserver gerade nicht verfügbar ist, wird die Mailadresse zwangsläufig immer als "ungültig" klassiert. Ebenfalls ein offener Punkt sind die Antwortzeiten des Mailservers und dessen Rückmeldungen, die ja von Fall zu Fall etwas anders aussehen.
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20000822.zip
ACT MetaMailer - Mails verschicken leicht gemacht
http:/www.aspheute.com/artikel/20021028.htm
Applikationen aus ASP.NET ausführen
http:/www.aspheute.com/artikel/20010220.htm
Keine gefakten Bestellungen mehr!
http:/www.aspheute.com/artikel/20010531.htm
Kommandozeilen-Programme aufrufen
http:/www.aspheute.com/artikel/20010516.htm
Regex'en zu Assemblies kompilieren
http:/www.aspheute.com/artikel/20020902.htm
AspExec von ServerObjects
http://www.serverobjects.com/products.htm
AspMX von ServerObjects
http://www.serverobjects.com/products.htm
W3Sockets von Dimac
http://www.dimac.net/
©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.