Serienmails versenden mit CDO

Zum Verwenden von Serienmails nutzt man meist Outlook und schreibt eine Mail an sich selbst, während man die Empfänger dann möglichst dem Feld BCC hinzufügt. Auf diese Weise bleibt der Datenschutz gewahrt, denn Sie wollen ja nicht jedem Empfänger die E-Mail-Adressen aller anderen Empfänger der Serienmail mitteilen. Der Nachteil ist, dass Sie so noch nicht einmal einfache Individualisierungen realisieren können wie etwa eine persönliche Anrede. Wenn Sie das erledigen wollen, versenden Sie per Automation aus einer Datenbank Nachrichten über Outlook. Falls das nicht in Frage kommt, weil beispielsweise Outlook nicht auf dem Rechner installiert ist, können Sie noch eine Alternative nutzen, nämlich die Bibliothek CDO. Im Beitrag “E-Mails versenden mit CDO” haben wir bereits die grundlegenden Techniken zum E-Mail-Versand mit dieser Bibliothek vorgestellt. Nun gehen wir einen Schritt weiter und zeigen, wie das auch noch für Serienmails gelingt.

Vorbereitung für den Einsatz der CDO-Bibliothek

Damit Sie die CDO-Bibliothek mit den Objekten und Methoden zum Versenden von E-Mails nutzen können, benötigen Sie einen Verweis auf diese Bibliothek. Diesen fügen Sie über den Verweise-Dialog hinzu, den Sie vom VBA-Editor aus öffnen. Hier wählen Sie den Menüeintrag Extras|Verweise und wählen dann im erscheinenden Dialog Verweise den Eintrag Microsoft CDO for Windows 2000 Library aus (siehe Bild 1).

Verweis auf die CDO-Bibliothek

Bild 1: Verweis auf die CDO-Bibliothek

Vorbereiten der Datenbank

Um die hier vorgestellten Techniken nutzen zu können, benötigen Sie zumindest eine Tabelle mit den Daten der E-Mail-Empfänger. Diese sollte im besten Fall die Felder Anrede, Vorname, Nachname und E-Mail-Adresse enthalten.

Wir haben eine solche Tabelle wie in Bild 2 definiert. Das dortige Feld AnredeID ist ein Fremdschlüsselfeld, mit dem Sie die Datensätze der Tabelle tblAnreden auswählen können. Diese enthält neben dem Primärschlüsselfeld AnredeID noch das Feld Anrede mit der Bezeichnung der Anrede sowie ein weiteres Feld namens Mailanrede, das wir mit einer Anrede speziell für die E-Mails gefüllt haben.

Beispieltabelle für Kundendaten im Entwurf

Bild 2: Beispieltabelle für Kundendaten im Entwurf

Diese Tabelle sieht mit den Daten für die Anreden Herr und Frau wie in Bild 3 aus.

Tabelle mit den Anreden

Bild 3: Tabelle mit den Anreden

Die Tabelle tblKunden haben wir mit den Techniken aus dem Beitrag Beispieldaten generieren mit .NET und Bogus (www.access-im-unternehmen.de/1359) gefüllt. Die Tabelle sieht anschließend wie in Bild 4 aus. Wir werden später nur die ersten zwei, drei Datensätze, um testweise E-Mails zu versenden. Diesen fügen wir daher tatsächlich vorhandene E-Mail-Adressen hinzu, bei denen wir auch prüfen können, ob diese angekommen sind.

Tabelle mit den aufgefüllten Datensätzen

Bild 4: Tabelle mit den aufgefüllten Datensätzen

Speichern der SMTP-Konfiguration

Im Beitrag E-Mails versenden mit CDO (www.access-im-unternehmen.de/1363) haben wir die Daten für den Zugriff auf den SMTP-Server, der für den Mailversand verwendet werden soll, direkt in den Code geschrieben.

Das wollen wir in diesem Beitrag direkt ein wenig professioneller gestalten und die Daten in einer Tabelle unterbringen, deren Inhalte wir dann über ein Formular anpassen können.

Die Tabelle finden Sie in der Entwurfsansicht in Bild 5. Sie nimmt neben dem Primärschlüsselfeld zunächst ein Feld zum Speichern der Bezeichnung eines Satzes von SMTP-Server-Daten auf. Danach folgen die Felder für die Adresse des SMTP-Servers, für den Benutzernamen und das Kennwort, unter dem die Anmeldung erfolgen soll, sowie gegebenenfalls der Port.

Tabelle zum Speichern der SMTP-Konfiguration

Bild 5: Tabelle zum Speichern der SMTP-Konfiguration

Auslesen der Konfiguration und Erstellen eines Configuration-Objekts

Zusätzlich programmieren wir eine Funktion, der wir nur noch den Primärschlüsselwert der zu liefernden Konfiguration übergeben. Diese soll dann ein fertiges Configuration-Objekt auf Basis der Daten aus dem entsprechenden Datensatz der Tabelle zurückliefern.

Diese Funktion sieht wie in Listing 1 aus. Sie erwartet den Parameter lngConfigurationID und liefert ein Objekt des Typs Configuration zurück. Sie erzeugt ein Database-Objekt auf Basis der aktuellen Datenbank und ein Recordset mit dem Datensatz der Tabelle tblConfigurations, dessen Wert im Feld ConfigurationID dem mit lngConfiguration-ID übergebenen Parameter entspricht.

Public Function GetConfiguration(lngConfigurationID As Long) As CDO.Configuration
     Dim objConfiguration As CDO.Configuration
     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Dim strSMTPServer As String
     Dim strPort As String
     Dim strUsername As String
     Dim strPassword As String
     Set db = CurrentDb
     Set rst = db.OpenRecordset("SELECT * FROM tblConfigurations WHERE ConfigurationID = " & lngConfigurationID, _
         dbOpenDynaset)
     strSMTPServer = rst!SMTPServer
     strPort = Nz(rst!Port, "")
     strUsername = rst!UserName
     strPassword = rst!Password
     Set objConfiguration = New CDO.Configuration
     With objConfiguration
         .Fields(cdoSendUsingMethod).Value = cdoSendUsingPort
         .Fields(cdoSMTPServer).Value = strSMTPServer
         Debug.Print .Fields(cdoSMTPServerPort)
         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 GetConfiguration = objConfiguration
End Function

Listing 1: Funktion zum Ermitteln eines Configuration-Objekts

Aus diesem Recordset liest die Funktion die einzelnen Feldwerte aus und schreibt diese in die Variablen strSMTPServer, strPort, strUsername und strPassword. Dann erstellt sie ein neues Objekt des Typs CDO.Configuration und weist den Eigenschaften dieses Objekts die Werte aus den Textfeldern zu – neben einigen Werten für Eigenschaften, die immer gleich sind wie etwa für cboSendUsingMethode, cdoSMTPUserSSL oder cdoSMTP-Authenticate. Nachdem alle relevanten Eigenschaften gefüllt sind, gibt die Funktion das mit objConfiguration referenzierte Objekt als Ergebnis zurück.

Serien-E-Mails verschicken

In der Lösung aus dem Beitrag E-Mails senden mit CDO (www.access-im-unternehmen.de/1363) haben wir das Zusammenstellen des Configuration-Objekts und des Message-Objekts, das zum Versenden einer E-Mail dient, in einer Prozedur erstellt. Das ist beim Versand einer Serienmail nicht sinnvoll – wenn immer der gleiche SMTP-Server mit den gleichen Anmeldedaten zum Einsatz kommt, brauchen wir nicht für jede E-Mail erneut ein Configuration-Objekt zu erstellen. Wenn wir also gleich eine Prozedur programmieren, mit der wir die Empfänger der E-Mail durchlaufen, wird dies berücksichtigen werden.
Für das Versenden einer Serienmail benötigen wir noch einige Daten, die wir am Besten auch direkt in einer eigenen Tabelle speichern. Dabei handelt es sich um die Daten, die für jede Mail eines Mailings gleich sind, also:

  • E-Mail-Adresse des Absenders
  • Betreff der E-Mail
  • Inhalt der E-Mail, gegebenenfalls mit Platzhaltern
  • Anhänge für die E-Mail, gegebenenfalls mit Platzhaltern

Diese Daten speichern wir in der Tabelle tblMailings aus Bild 6. Neben den genannten Daten nimmt diese Tabelle nur noch ein Primärschlüsselfeld auf sowie ein Feld für die Bezeichnung des Mailings. Für das Feld Mailingname haben wir einen eindeutigen Index festgelegt, damit wir die Mailings danach unterscheiden können.

Tabelle zum Speichern der Daten eines Mailings

Bild 6: Tabelle zum Speichern der Daten eines Mailings

Sie können der Tabelle noch beliebige weitere Felder hinzufügen – beispielsweise für das Datum, an dem das Mailing verschickt werden soll oder Sie speichern darin Informationen darüber, welche Tabelle für das Zusammenstellen der Empfänger verwendet wurde und nach welchen Kriterien diese Zusammenstellung erfolgte.

Ein Beispiel für die allgemeinen Daten eines Mailing können Sie Bild 7 entnehmen.

Tabelle zum Speichern der Daten eines Mailings mit Beispieldaten

Bild 7: Tabelle zum Speichern der Daten eines Mailings mit Beispieldaten

Prozedur zum Steuern des Mailversands

Die Prozedur aus Listing 2 übernimmt die Steuerung des Mailversands. Sie 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