Mail verwenden ohne Outlook

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:

  • Envelope: enthält den Sender und Empfänger der Mail
  • Header: enthält Daten wie From, To, Subject, Date oder Message-ID
  • Body: enthält die eigentliche Nachricht
  • 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:

  • From: Senderadresse, eventuell mit vollem Namen und anschließender, in spitze Klammern gesetzter E-Mail-Adresse
  • To: Empfängeradresse, Syntax wie From
  • Subject: Betreff der E-Mail
  • Date: Datum der Mail, muss für eine korrekte übernahme in den Mail-Client ein bestimmtes Format haben, das später beschrieben wird
  • Reply-To: Wenn der Empfänger einer Mail Antworten nicht an den Absender, sondern eine andere Adresse senden soll, kann man diesen Header verwenden.
  • 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:

  • Versenden einer Textmail
  • Versenden einer Mail mit Text- und HTML-Inhalt, der je nach Client in dem einen oder anderen Format erscheint
  • Versenden einer Mail mit einer angehängten Datei
  • Versenden einer Mail an mehrere Empfänger
  • 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

    Schreibe einen Kommentar