Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs
ASP German Homepage Homepage
 

Liste

.NET 2.0 (1)
.NET Allgemein (16)
.NET Fu (5)
ADO.NET (11)
Aprilscherz (3)
ASP Grundlagen (44)
ASP Tricks (83)
ASP.NET (44)
ASPIntranet.de (5)
C# (28)
Datenbank (44)
Dokumentation (4)
IIS 6.0 (1)
Komponenten (29)
Optimierung (10)
Server (21)
Sicherheit (34)
Tee Off (6)
VB.NET (6)
WAP (8)
Web Services (11)
XML (9)

RSS 2.0 - Die neuesten fünf Artikel auf AspHeute.com


 

Suchen





 

English Articles
Chinese Articles
Unsere Autoren
 
Link zu AspHeute
Impressum
Werben
Anfragen

Mailadressen-überprüfen für Fortgeschrittene

Geschrieben von: Stephan Troxler
Kategorie: ASP Tricks

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.

  • AspExec von ServerObjects
  • W3Sockets von Dimac

Die Beispielsannahme

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:

  • mindestens 7 Zeichen lang
  • "@" muß einmal darin enthalten sein
  • keine Sonderzeichen
  • hinter dem @ muß mindestens ein "." vorkommen
  • nach dem letzen "." folgen mindestens 2 und höchstens 3 weitere Zeichen

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.

Suchen des Mailservers

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.

Ein kurzer Abriß über SMTP

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.

Die Account-Abfrage

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.

Schlußbemerkung

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.

Download des Codes

Klicken Sie hier, um den Download zu starten.

Verwandte Artikel

ACT MetaMailer - Mails verschicken leicht gemacht
Applikationen aus ASP.NET ausführen
Keine gefakten Bestellungen mehr!
Kommandozeilen-Programme aufrufen
Regex'en zu Assemblies kompilieren

Links zu anderen Sites

AspExec von ServerObjects
AspMX von ServerObjects
W3Sockets von Dimac

Wenn Sie jetzt Fragen haben...

Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten.

Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.

 

Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.

Bewerten Sie diesen Artikel
 Sehr gut   Nicht genügend  
   1  2  3  4  5  
 

  
   Für Ausdruck optimierte Seite

©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.