André Minhorst, Duisburg
Die Möglichkeit, Mails ohne die Verwendung von Outlook zu versenden, würde vielen Access-Anwendungen gut zu Gesicht stehen. Wo auch immer der direkte Versand von Informationen interessant ist, tritt normalerweise Outlook auf den Plan. Das ist aber nicht immer gewünscht, denn warum sollte man denn einen Umweg gehen, wenn man auch direkt auf die entsprechenden Funktionen des Betriebssystems – in diesem Fall auf die Bibliothek Winsock.dll – zugreifen kann
Wer einmal von Access aus versucht hat, mit Hilfe von Microsoft Outlook automatisiert Mails zu verschicken, und sich ein wenig mit SMTP auskennt, der weiß, dass er dabei mit Kanonen auf Spatzen schießt. Dabei öffnet man nämlich eine Riesenanwendung, nur um ein paar Zeilen an einen Mailserver zu schicken. Wenn man Outlook nur zu diesem Zweck startet und anschließend wieder schließt, frißt dieser Vorgang durchaus einige Sekunden.
Warum also nicht einmal ein wenig in der Geheimniskiste kramen und E-Mails versenden, ohne den Umweg über Outlook in Kauf zu nehmen Wenn man auf den – zugegebenermaßen vorhandenen – Komfort von Outlook verzichten kann und einfach nur zu bestimmten Anlässen eine Mail direkt über die Datenbankanwendung versenden lassen möchte, ist das bestimmt eine gewisse Vorarbeit wert.
Anwendungsfälle dafür gibt es genug. Das Verschicken einer Rundmail an ein paar hundert Kunden aus der Kontakte-Tabelle geht damit sicher wesentlich schneller als mit Outlook, aber das ist noch nicht einmal der wichtigste Grund, Access in einen Mail- beziehungsweise SMTP-Client umzubauen. Viel interessanter ist beispielsweise das automatisierte Verschicken einer Mail, wenn zum Beispiel der Lagerbestand einer bestimmten Ware einen kritischen Wert erreicht oder wenn Fehlfunktionen auftreten.
Dazu bedarf es allerdings einiger grundlegender Kenntnisse über Winsock, SMTP sowie den Aufbau von Mails im Allgemeinen. Die nachfolgenden Kapitel behandeln diese Themen in der notwendigen Tiefe.
Schließlich folgen zum Schluss einige Beispiele für den Praxiseinsatz von SMTP innerhalb von Access-Datenbanken.
Auf Windows-Betriebssystemen verwendet man zum Versenden von E-Mails in der Regel Microsoft Outlook, Outlook Express oder einen ähnlichen Mail-Client.
Diese Anwendungen verfügen über eine Menge wichtige und weniger wichtige Funktionen, die dem Anwender den Großteil der Arbeit abnehmen. Der muss in der Regel nur noch den oder die Adressaten, die Betreffzeile und den Text eingeben und auf den Senden-Button klicken, um eine Mail zu versenden. In manchen Fällen gibt“s noch eine Beilage in Form eines so genannten Attachments, das aber ebenfalls bequem per Dialog zu ermitteln ist.
Bild 1: Der SMTP-Server ist zur Eingabe bereit.
Wenn man von Access aus eine Mail versenden möchte, kann man dies mit Microsoft Outlook ab der Version 2000 ohne Probleme per Automatisierung erledigen. Per VBA lassen sich dann leicht die Methoden, Ereignisse und Eigenschaften des Outlook-Objektmodells ansprechen und von Access aus fernsteuern.
Outlook selbst verwendet dann das zur Familie der TCP/IP-Protokolle gehörende SMTP (Simple Mail Transfer Protocol), um eine E-Mail an den entsprechenden SMTP-Server zu schicken. Dieser befördert diese E-Mail dann gegebenenfalls über weitere SMTP-Server zum Zielrechner, von wo der Adressat die E-Mail dann mit seiner eigenen E-Mail-Software per POP3 auf seinen Rechner holt. Diesen letzten Schritt behandelt der vorliegende Beitrag indes nicht, obwohl auch das automatisierte Abholen und Auswerten von E-Mails sicher seinen Reiz hätte.
Den SMTP-Server, auch MTA (Mail Transfer Agent) genannt, stellt in der Regel der Provider zur Verfügung, über den man auch die Verbindung zum Internet herstellt. Wer über eine eigene Internetseite oder über Webspace für andere Zwecke verfügt, kann möglicherweise auf eine eigene E-Mail-Adresse und damit auf einen alternativen SMTP-Server zugreifen. Und wer es auf die Spitze treibt, hat vielleicht sogar einen eigenen Server gemietet oder gekauft, auf dem er seinen persönlichen Mailserver mit entsprechendem SMTP-Dienst betreibt.
Wenn nun beispielsweise Microsoft Outlook eine Mail an einen SMTP-Server schicken soll, baut es zunächst eine Verbindung zum Zielrechner auf. Dafür ist die Winsock-Schnittstelle zuständig, deren Funktionen sich in der Datei Wsock32.dll befinden. Diese Schnittstelle ist nicht nur die Grundlage für das SMTP-Protokoll, sondern auch für weitere Dienste wie Telnet oder FTP.
Ist eine Verbindung via Winsock eingerichtet, können die verbundenen Rechner Nachrichten hin- und herschicken. Im vorliegenden Fall sind das SMTP-Befehle und die entsprechenden Antworten. Mit den SMTP-Befehlen übergibt der sendende Rechner alle Informationen über die zu versendende Mail – angefangen von den wichtigsten Daten, nämlich der Absender- und der Empfängeradresse bis hin zum eigentlichen Inhalt. Dieser wiederum kann sich äußerst vielfältig gestalten – von der einfachen Textmail über eine HTML-Mail bis hin zu Mails mit Anhängen oder mehreren unterschiedlichen Inhaltsarten, die der empfangende Client je nach seinen Möglichkeiten anzeigt.
Das Simple Mail Transfer Protocol ist recht einfach zu überschauen. Nachfolgend ist ein Beispiel skizziert, das dessen Anwendung in der Praxis erläutert und gleichzeitig die Einfachheit verdeutlicht.
Dabei verwendet man die Eingabeaufforderung von Windows, um per Tastatur eine komplette Mail an einen beliebigen Adressaten zu versenden.
Nach dem öffnen der Eingabeaufforderung startet man zunächst eine Verbindung zum Mailserver, und zwar über den Port 25. Die entsprechende Anweisung sieht folgendermaßen aus (im Beispiel für den Mailserver von Strato):
telnet post.strato.de 25
Die Angabe des Ports, also der 25, ist besonders wichtig. Lässt man diese Information weg, geht Telnet von Port 23 aus, was in der Regel nicht zum Erfolg führt. Daraufhin meldet sich der SMTP-Server des jeweils angegebenen Providers mit einer Ausgabe wie in Bild 1.
Anschließend kann man direkt mit der Eingabe der gewünschten SMTP-Befehle beginnen. Quellcode 1 enthält eine beispielhafte Kommunikation zwischen Client und SMTP-Server.
Zunächst begrüßt man den Server mit dem Befehl HELO <Rechnername>. Der SMTP-Server antwortet mit einem lockeren „…pleased to meet you“ – je nach Server kann man aber auch eine andere Floskel lesen.
Anschließend folgen die drei eigentlichen Elemente einer E-Mail:
Der Umschlag der Mail
Danach folgen die beiden wichtigsten Informationen: Die übermittlung des Adressaten sowie des Absenders der Mail. In beiden Fällen ist man mit der Großschreibung der Befehle, dem Einfassen der Adressen in spitzen Klammern und dem Verzicht auf Leerzeichen zwischen Doppelpunkt und Adresse auf der sicheren Seite. Soweit der SMTP-Server alle bisherigen Angaben akzeptiert, sendet er jeweils den Code 250 als Bestätigung der Ausführung der Kommandos zurück – unter Umständen ergänzt durch weitere, serverabhängige Floskeln.
Der Briefkopf
Anschließend leitet man durch die Anweisung DATA die Eingabe der Header-Informationen und des eigentlichen Inhalts der Mail ein.
Während die soeben genannten Daten quasi den Briefumschlag der Mail darstellen und für die eigentliche Versendung wichtig sind, folgen nun einige Daten, die bei einem normalen Brief auch innerhalb des Umschlags auf dem Brief selbst stehen würden. Dazu gehören folgende Informationen:
Hinweis
Es gibt noch eine Reihe weiterer Header, deren Beschreibung allerdings den Rahmen dieses Beitrags sprengen würde. Weitere Informationen findet man unter der folgenden Internetadresse (ohne Zeilenumbruch): http://sites.inka.de/ancalagon/faq/headerfaq.html
Der Inhalt
Nach den Headerzeilen folgt in der Regel der eigentliche Inhalt einer Mail. Diesen schreibt man einfach ohne weitere Angaben in die dem letzten Header folgende Zeile. Dabei kann man beliebige Zeichen und auch Leerzeilen verwenden.
Das Absenden der Mail initiiert man durch die Eingabe eines einzelnen Punktes in einer Zeile. Der Server akzeptiert die Mail dann entweder mit dem Code 250 oder „meckert“, wenn ein Header nicht den Konventionen entsprechen sollte.
In ersterem Fall ist die Mail damit verschickt und trifft in Kürze beim Empfänger ein – zumindest, sofern nicht vorher ein Viren- oder Spamprogramm auf den Plan tritt und die Mail aussortiert, ansonsten muss man die eingegebenen Daten überprüfen.
220 post.webmailer.de ESMTP Sendmail 8.12.10/8.12.10; Thu, 8 Jul 2004 09:44:57 +0200 (MEST) HELO Mein Rechnername 250 post.webmailer.de Hello pD9561037.dip.t-dialin.net [217.86.16.55], pleased to meet you MAIL FROM:<andre@minhorst.com> 250 2.1.0 <andre@minhorst.com>... Sender ok RCPT TO:<info@access-im-unternehmen.de> 250 2.1.5 <info@access-im-unternehmen.de>... Recipient ok DATA 354 Start mail input; end with <CRLF>.<CRLF> From:André Minhorst <andre@minhorst.com> To:Info <info@access-im-unternehmen.de> Subject:Beispielmail für Access im Unternehmen Date:Thu, 8 Jul 2004 09:44:57 +0200 Hallo Access im Unternehmen, dies ist eine Beispielmail. Viele Grüße André Minhorst . 250 2.0.0 i687ivHP001747 Message accepted for delivery
Quellcode 1
Damit sind die Grundlagen für das Versenden einer Mail per SMTP geklärt. Später kommen noch einige Informationen hinzu, wie man beispielsweise Dateien an eine Mail anhängen oder eine Mail gleichzeitig im Text- und HTML-Format verschicken kann.
Die Grundlage für das Versenden von Mails direkt von Access aus ist die Herstellung einer Verbindung zwischen dem verschickenden Rechner und dem Zielrechner, also dem SMTP-Server. Diese Verbindung realisiert man über die Winsock-Schnittstelle von Microsoft Windows.
Die Prozeduren und Funktionen in den nachfolgenden Beispielen basieren auf der Arbeit von John Rhoton. Er beschreibt in seinem Buch Programmer“s Guide to Internet Mail (Digital Press, 1999) unter anderem ausführlich die Funktionsweise von Winsock und SMTP. Die diesem Beitrag zugrunde liegenden Funktionen können dem Download für Visual Basic unter der folgenden Adresse entnommen werden (ohne Zeilenumbruch): http://www.winsite.com/bin/Info500000022279.
Die Verwendung der Winsock-Schnittstelle ist auf den ersten Blick eine sehr umfangreiche und unübersichtliche Geschichte. Dank der Arbeit von John Rhoton reduziert sich das Ganze aber auf einige wesentliche Punkte. In den Beispieldaten, die er eigentlich für die Verwendung in Visual Basic zusammengestellt hat, findet man unter anderem eine recht große Sammlung an API-Funktionen.
Wer den Umgang mit solchen Funktion nicht gewohnt ist, verstrickt sich dort leicht. Glücklicherweise hat John Rhoton eine Menge Wrapper-Funktionen hinzugefügt, die den eigentlichen Aufruf der API-Funktionen übernehmen und dabei nur die wirklich benötigten Informationen als Parameter erwarten. Die verwendeten API-Funktionen gehören bis auf wenige Ausnahmen der Windows-Bibliothek wsock32.dll an.
Die Beispieldatenbanken zu diesem Beitrag enthalten einige Module, deren Routinen nachfolgend kurz erläutert werden.
Das Modul mdlWinsock
Dieses Modul enthält die bereits weiter oben erwähnten Deklarationen der API-Funktionen für die Verwendung der Winsock-Schnittstelle.
Außerdem findet man hier die Wrapperfunktionen, die die Arbeit mit API-Funktionen vereinfachen.
Starten von Winsock
Die Funktion StartWinsock erwartet keine Parameter und startet Winsock. Wenn der Start erfolgreich verläuft, gibt die Funktion einige Statusmeldungen im Testfenster aus.
Aktuelle IP-Adresse ermitteln
Die Funktion GetIPAdress ermittelt die IP-Adresse des zu verwendenden SMTP-Servers.
Verbindung erstellen
Das Verbinden zum SMTP-Server erfolgt durch den Aufruf der beiden Funktionen CreateSocket und ConnectSocket. Die erste sorgt für die Voraussetzung auf dem Client, indem sie ein Handle auf ein Socket von Winsock ermittelt. Die zweite Funktion baut die Verbindung zum SMTP-Server auf, dessen IP-Adresse die Funktion GetIPadress zuvor ermittelt hat.
Daten senden und empfangen
Der eigentliche Verkehr erfolgt dann durch die beiden Funktionen SendSocket und ReceiveSocket. Die Funktion SendSocket schickt jeweils eine Anweisung an den SMTP-Server.
Die Funktion ReceiveSocket liest die Antwort des SMTP-Servers auf die gesendete Anweisung.
Socket verabschieden
Die Funktion ReleaseSocket beendet schließlich die Verbindung zwischen dem Client und dem SMTP-Server.
Das Modul mdlFileDialog
Eine der Beispielanwendungen bietet die Möglichkeit zum Anhängen einer Datei an eine Mail. Mit den Funktionen des Moduls mdlFileDialog kann man den Dialog zur Auswahl der anzuhängenden Datei aufrufen. Weitere Informationen zu diesen Funktionen finden Sie unter dem folgenden Link (ohne Zeilenumbruch): http://www.access-im-unternehmen.de:8080/192.0.html
Das Klassenmodul MIMEMessage
Diese Klasse enthält die Methoden zum Zusammensetzen des eigentlichen Inhalts der Mail, also der Header und des Body. Eine Beschreibung der notwendigen Funktionen folgt weiter unten in Kapitel 7.
Das KlassenmodulMIMEAttachment
In dieser Klasse findet man einige Funktionen, mit denen man Dateien in Mail-taugliche Datenpakete umwandelt. Eine Beschreibung dieser Funktionen würde den Rahmen des vorliegenden Beitrags sprengen.
Die nachfolgenden Abschnitte stellen vier unterschiedliche Variationen für den Einsatz von SMTP unter Access vor:
Private Sub Form_Open(Cancel As Integer) Me.txtSMTPServer = "smtp.beispielserver.de" Me.txtFrom = "info@beispielserver.de" Me.txtTo = "info@access-im-unternehmen.de" Me.txtSubject = "Testmail" Me.txtPlaintext = "Dies ist eine Testmail." Me.txtPort = 25 Me.txtSendername = "André Minhorst" Me.txtSenderEMail = "info@beispielserver.de" Debug.Print StartWinSock End Sub
Quellcode 1
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo