Für das Versenden von E-Mails von einer Access-Anwendung aus gibt es verschiedene Möglichkeiten. Die naheliegendste ist der Versand unter Verwendung von Outlook, da dieses üblicherweise auf Rechnern mit Microsoft Access installiert ist. Es gibt jedoch auch Fälle, bei denen kein Office-Paket vorliegt und wo eine alternative Lösung gefragt ist. Früher gab es die Bibliothek vbSendmail, die auch heute noch eingeschränkt funktioniert. Eingeschränkt deshalb, weil beispielsweise SSL nicht unterstützt wird. Also haben wir nach einer Alternative gesucht, die auch modernere, sichere Versender unterstützt und sind dabei auf eine eher betagte Lösung gestoßen: die Bibliothek CDO, die auf jedem Windows-System installiert ist.
CDO-Bibliothek einbinden
Um die Elemente der CDO-Bibliothek zu nutzen, haben Sie wie üblich zwei Möglichkeiten – Late Binding und Early Binding. Da wir immer gern mit IntelliSense arbeiten, nutzen wir auch in diesem Fall wieder Early Binding. Das zieht nach sich, dass wir einen Verweis auf die Bibliothek zum VBA-Projekt der Zielanwendung hinzufügen müssen.
Dazu öffnen Sie den VBA-Editor mit der Tastenkombination Alt + F11 und betätigen dann den Menübefehl Extras|Verweise. Im nun erscheinenden Verweise-Dialog für das aktuelle VBA-Projekt suchen Sie nach einem Eintrag namens Microsoft CDO for Windows 2000 Library und markieren diesen (siehe Bild 1). Dem Namen können Sie bereits entnehmen, warum wir die Bibliothek in der Einführung als „betagt“ bezeichnet haben.
Bild 1: Verweis auf die CDO-Bibliothek
Nach dem Hinzufügen der Bibliothek schauen wir zuerst einmal in den Objektkatalog und wählen dort ganz oben den Eintrag CDO aus.
Hier finden wir schnell eine interessante Klasse namens Message, die alle notwendigen Eigenschaften und Methoden zu bieten scheint – inklusive To, From, Subject, TextBody und Send (siehe Bild 2).
Bild 2: Eigenschaften und Methoden der Message-Klasse
Allerdings vermissen wir hier Eigenschaften, mit denen wir festlegen können, über welchen SMTP-Server wir die E-Mails versenden können und wie wir uns dort authentifizieren. Die Bibliothek bietet neben einigen Interface-Klassen nur noch zwei weitere Klassen – nämlich Configuration und DropDirectory.
Darüberhinaus bietet die Klasse Message auch noch eine Eigenschaft namens Configuration, sodass wir wohl die notwendigen Eigenschaften über die Configuration-Klasse vornehmen werden.
Schauen wir allerdings im Objektkatalog in die Elemente der Klasse Configuration, finden wir dort nicht viel, was uns direkt weiterbringt – hier sehen wir nämlich nur die drei Elemente Fields, GetInterface und Load.
Auf der Suche nach dem Schlüsselwort SMTP landen wir jedoch schnell bei der Klasse CdoConfiguration, die einige Elemenge bereitstellt, die hilfreich aussehen. Diese sehen sie in Bild 3.
Bild 3: Konstanten für die Fields-Eigenschaft
Eine weitere Recherche im Internet lieferte den Hinweis, dass wir Eigenschaften wie etwa den SMTP-Server über die Fields-Auflistung des Configuration-Objekts festlegen und dieses dann über die Eigenschaft Configuration dem Message-Objekt zuweisen.
Grundlegende Anwendung
Wie sich zeigen wird, benötigen wir für verschiedene Provider unterschiedliche Konfigurationen. Wir schauen uns erst einmal die einfachste Variante an, bei der wir von ein E-Mail-Provider mit einem einfachen SMTP-Server ausgehen, der keine zusätzlichen Funktionen wie SSL oder dergleichen bietet.
Um die zu verwendenden Parameter herauszufinden, starten wir erst einmal ohne Parameter mit der folgenden Prozedur.
Hier deklarieren wir zuerst einmal ein Message– und ein Configuration-Objekt:
Public Sub MailSenden() Dim objMessage As CDO.Message Dim objConfiguration As CDO.Configuration
Dann erstellen wir das Configuration-Objekt, mit dem wir erst einmal nichts konfigurieren, sowie ein Message-Objekt:
Set objConfiguration = New CDO.Configuration Set objMessage = New CDO.Message
Danach weisen wir dem Message-Objekt das leere Configuration-Objekt zu und legen einige andere, offensichtlich benötigte Informationen fest – nämlich den Adressat, den Absender, den Betreff und den Inhalt der E-Mail:
With objMessage Set .Configuration = objConfiguration .To = "andre@minhorst.com" .From = "info@amvshop.de" .Subject = "Beispielbetreff" .TextBody = "Dies ist ein Beispieltext."
Danach rufen wir bei deaktivierter eingebauter Fehlerbehandlung die Send-Methode auf und lassen uns im Falle eines Fehlers die Fehlernummer und den Fehlertext ausgeben:
On Error Resume Next .Send If Not Err.Number = 0 Then Debug.Print Err.Number, Err.Description End If End With Set objConfiguration = Nothing Set objMessage = Nothing End Sub
Erster Versuch des Mailsversands
Rufen wir die Prozedur so auf, erhalten wir den folgenden Fehler:
-2147220960 Der "SendUsing"-Konfigurationswert ist ungültig.
Mit SendUsing landen wir im Objektkatalog schnell bei der Klasse CdoSendUsing mit der Eigenschaften SendUsingPort.
Senden mit Port
Also fügen wir dem Configuration-Objekt ein Fields-Element mit dieser Eigenschaft hinzu:
With objConfiguration .Fields(cdoSendUsingMethod).Value = cdoSendUsingPort .Fields.Update End With
Dies liefert den folgenden Fehler:
-2147220982 Der erforderliche Name des SMTP-Servers wurde in der Konfigurationsquelle nicht gefunden.
[
Also geben wir auch noch einen SMTP-Server an:
... .Fields(cdoSMTPServer).Value = "smtp.minhorst.com" ...
Damit versenden wir tatsächlich schon die erste E-Mail mit einem einfachen SMTP-Server ohne besondere Absicherung. Das funktionierte in unserem Fall aber auch nur, weil die Absender- und die Empfängeradresse beide mit dem angegebenen SMTP-Server arbeiten.
E-Mail-Server mit Verschlüsselung nutzen
Je nachdem, welchen Server Sie verwenden, können die notwendigen Angaben variieren. In den folgenden Abschnitten schauen wir uns die notwendigen Einstellungen für das Configuration-Objekt an.
Dazu haben wir eine neue, parametrisierte Version der obigen Prozedur namens SendMail geschaffen, mit der Sie alle notwendigen Einstellungen inklusive der Informationen für die E-Mails übergeben können (siehe Listing 1).
Public Sub SendMail(strServername As String, strUsername As String, strPassword As String, strTo As String, _ strFrom As String, strSubject As String, strTextBody As String, Optional strPort As String) Dim objMessage As CDO.Message Dim objConfiguration As CDO.Configuration Set objConfiguration = New CDO.Configuration With objConfiguration .Fields(cdoSendUsingMethod).Value = cdoSendUsingPort .Fields(cdoSMTPServer).Value = strServername If Not Len(strPort) = 0 Then .Fields(cdoSMTPServerPort).Value = strPort End If .Fields(cdoSMTPUseSSL).Value = "true" .Fields(cdoSMTPAuthenticate).Value = cdoBasic .Fields(cdoSendUserName).Value = strUsername .Fields(cdoSendPassword).Value = strPassword .Fields.Update End With Set objMessage = New CDO.Message With objMessage Set .Configuration = objConfiguration .To = strTo .From = strFrom .Subject = strSubject .TextBody = strTextBody On Error Resume Next .Send If Not Err.Number = 0 Then Debug.Print Err.Number, Err.Description End If End With Set objConfiguration = Nothing Set objMessage = Nothing End Sub
Listing 1: Prozedur zum Senden von E-Mails
Die Prozedur erwartet die folgenden Parameter:
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