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.

[

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

Schreibe einen Kommentar