E-Mails versenden mit CDO

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.

Verweis auf die CDO-Bibliothek

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

Eigenschaften und Methoden der Message-Klasse

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.

Konstanten für die Fields-Eigenschaft

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.

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

TestzugangOder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Die Zugangsdaten findest Du in Deinem aktuellen Heft.

Schreibe einen Kommentar