Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 4/2006.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Zusammenfassung

Lernen Sie eine Anwendung zum Versenden von Serienmails mit Platzhaltern kennen.

Techniken

VBA, Formulare, SMTP

Voraussetzungen

Access 2000 und höher

Beispieldatenbank

Serienmail.mdb, SendMail2.dll

Serienmails mit Access

André Minhorst, Duisburg

Serienmails verschicken - das ist doch ganz einfach, oder? Einfach die Mail mit Outlook erstellen, Empfänger eintragen und ab die Post! Klar, wenn man keine besonderen Ansprüche hat, kann man das so machen. Wer allerdings den Inhalt der Serienmail personalisieren oder eine Historie der versendeten Mails inklusive Verteilerliste pflegen möchte, braucht ein spezielles Stück Software. Im vorliegenden Beitrag stellen wir Ihnen genau das richtige vor.

Funktion der Musterlösung

Das Serienmail-Tool bietet einige Funktionen zum Versenden personalisierter E-Mails:

  • Einbinden beliebiger Adresstabellen aus verschiedenen Anwendungen als Grundlage für den E-Mail-Verteiler
  • Speichern sämtlicher Inhalte und Header-Informationen in der Datenbank
  • Erstellen neuer E-Mails auf Basis älterer Schreiben
  • Versenden reiner Text-Mails
  • Versenden von HTML-Mails
  • Individuelles Festlegen des Sendeformats für jeden Empfänger
  • Darstellung von HTML-Mails
  • Personalisieren von E-Mails durch Platzhalter, die an beliebige Felder der Datenherkunft mit den E-Mail-Adressen gebunden werden können
  • Protokollieren des Postversands mitsamt Angaben zu Empfänger und Sendezeit
  • Die Benutzeroberfläche der Musterlösung besteht im Wesentlichen aus dem in Abb. 1 dargestellten Formular.

    Hinweis

    Achtung: Die Anwendung prüft vor dem Versand von E-Mails nicht, ob eine Verbindung zum Internet besteht. (

    Vorbereitungen

    Die E-Mail-Funktionen der Musterlösung sind in einer DLL gekapselt, die Sie zuvor auf Ihre Festplatte kopieren und registrieren müssen.

    Am besten kopieren Sie diese in das Verzeichnis c:\Windows\System32; dort befinden sich auch die meisten anderen DLLs. Um die Komponente zu registrieren, geben Sie im Ausführen-Dialog von Windows folgende Anweisung innerhalb einer Zeile ein:

    RegSvr32.exe c:\Windows\System32\SendMail2.dll

    Abb. 1: Das Hauptformular des Serienmail-Tools

    Versenden einer Serien-E-Mail

    Bevor man mit dem Serienmail-Tool eine E-Mail an mehrere Empfänger versenden kann, sind eine Reihe von Eingaben zu tätigen.

    Abb. 2: Absenderinformationen einer Serien-E-Mail

    Abb. 3: Eingabe des Servernamens und des Ports

    Absender-Informationen

    Jede E-Mail hat einen Absender. Dieser wird in einer Mail direkt mehrfach benötigt: einmal auf dem "Umschlag" (aufgrund dieser Informationen können die SMTP-Server die Mail vom Absender zum Adressaten transportieren) und einmal in der Mail selbst. So können Sie auch mit dem Serienmail-Tool verschiedene Absenderangaben machen: Die unter "Von:" angegebene Adresse ist der Absender auf dem Umschlag, und die beiden Absenderinformationen unter Absendername und Absender-E-Mail können Sie beispielsweise im E-Mail-Client lesen (s. Abb. 2).

    Das Sendedatum tragen Sie nur für statistische Zwecke ein, das Tool speichert ohnehin zu jedem Empfänger die exakte Sendezeit mit Datum und Uhrzeit.

    SMTP-Server

    Ähnlich wie bei einem herkömmlichen E-Mail-Client, zum Beispiel: Outlook, müssen Sie auch dem Serienmail-Tool die SMTP-Adresse des Servers mitteilen (bei web.de heißt diese beispielsweise smtp.web.de, bei GMX mail.gmx.de - die passende Adresse erfahren Sie vom jeweiligen Anbieter). SMTP verwendet üblicherweise Port 25 des Servers (s. Abb. 3).

    SMTP_AUTH und SMTP after POP

    Manche SMTP-Server sind durch die eine oder andere Art der Authentifizierung vor dem unbefugten Zugriff geschützt. Die gängigsten Varianten sind SMTP after POP und SMTP_AUTH.

    Bei SMTP after POP muss man sich vor dem Versenden von E-Mails via SMTP am POP3-Konto angemeldet haben, um eingegangene E-Mails abzurufen.

    Bei SMTP_AUTH meldet man sich mit einem eigens für das Versenden vorgesehenen Kennwort beim SMTP-Server an. Das Serienmail-Tool sieht beide Möglichkeiten vor. Die notwendigen Einstellungen nehmen Sie in dem in Abb. 4 gezeigten Bereich des Hauptformulars vor. Die Option Keine ist angemessen, wenn Ihr SMTP-Server keine Authentifizierung vornimmt, etwa, weil er ohnehin jedem Rechner im eigenen LAN zu Diensten ist. Die Auswahl von SMTP after POP3 aktiviert die beiden Textfelder Kennwort und POP3-Server - hier müssen Sie die notwendigen Daten eintragen. Welche dies sind, erfahren Sie vom jeweiligen E-Mail-Provider oder in den Einstellungen Ihres Mail-Client, wenn dieser schon konfiguriert ist. Die gesuchten Informationen finden Sie etwa bei Outlook, wenn Sie unter Extras/E-Mail-Konten... auf "Vorhandene E-Mail-Konten anzeigen oder bearbeiten" klicken.

    Abb. 4: Das Serienmail-Tool bietet verschiedene Authentifizierungsmöglichkeiten.

    Die Option SMTP_AUTH wiederum erfordert lediglich die Angabe eines Kennworts. Bei einigen Providern entspricht dieses Kennwort dem POP3-Kennwort.

    Abb. 5: Plaintext und HTML-Text für die Serienmail

    Abb. 6: HTML-Ansicht der Serienmail

    E-Mail-Inhalt

    Die meisten E-Mails enthalten entweder reinen Text oder HTML-Text. Mit reinem Text macht man nichts falsch, dieser wird von allen E-Mail-Clients ohne Probleme angezeigt. HTML-Mails können unter Umständen Probleme verursachen, wenn der Inhalt wegen der Formatierungen "zerschossen" wird oder die Anzeige von HTML im Mail-Client des Empfängers ausgeschaltet ist.

    Das Serienmail-Tool erlaubt die Verwendung beider Formate. Dabei können Sie entweder festlegen, dass alle Empfänger mit dem gleichen Format versorgt werden oder das Format für jeden Empfänger individuell festlegen.

    Der passende Bereich des Formulars frmSerienmail sieht wie in Abb. 5 aus. Mit der Option Standardformat legen Sie fest, ob normalerweise der Inhalt des Feldes Inhalt (Plaintext) oder der des Feldes Inhalt (HTML) als Inhalt der Mail verwendet wird. "Normalerweise" deshalb, weil Sie das verwendete Format auch individuell je Empfänger festlegen können - dazu später mehr.

    Wenn Sie auf die Schaltfläche HTML-Ansicht anzeigen klicken, erscheint ein separates Formular mit der passenden Darstellung (s. Abb. 6).

    Empfänger-Informationen
    festlegen

    Es fehlen noch die Informationen, welche Adressaten die Serienmail erreichen soll.

    Diese Daten müssen Sie in einer Tabelle bereitstellen, die in jeder Zeile zumindest die folgenden Felder enthält:

  • Primärschlüsselfeld
  • Feld mit der E-Mail-Adresse
  • Optional kann ein weiteres Feld festlegen, ob der jeweilige Empfänger die E-Mail im HTML- oder im Plaintext-Format erhalten soll.

    Für personalisierte Serienmails, in denen Sie etwa den Empfänger mit Vor- und Nachnamen anreden möchten, muss die Tabelle ebenfalls die passenden Daten liefern. Abb. 7 zeigt ein Beispiel für den Aufbau einer solchen Tabelle.

    Abb. 7: Beispiel einer geeigneten Datenherkunft für das Serienmail-Tool

    Die Ermittlung der zu verwendenden Informationen erfolgt in den folgenden Schritten:

  • Zunächst stellen Sie eine Tabelle oder Abfrage bereit, aus der das Tool die E-Mail-Adressen beziehen soll. Dabei kann es sich durchaus um eine verknüpfte Tabelle handeln.
  • Legen Sie die Tabelle oder Abfrage mit den E-Mail-Adressen im Kombinationsfeld Tabelle des Hauptformulars fest (s. Abb. 8).
  • Diese Auswahl aktualisiert den Inhalt der Kombinationsfelder mit der Beschriftung Primärschlüsselfeld und Feld der E-Mail-Adresse und füllt diese mit allen in der Tabelle enthaltenen Feldern. Wählen Sie hier die passenden Felder aus.
  • Wenn die Tabelle ein Feld enthält, das je Empfänger angibt, ob die E-Mail im HTML- oder im Plaintext-Format versendet werden soll, stellen Sie die Option HTML individuell auswählen auf Ja ein.
  • Haben Sie die Option im vorherigen Schritt auf Ja eingestellt, wählen Sie im Kombinationsfeld Feld HTML Ja/Nein noch das Feld aus, das einen passenden Booleschen Wert enthält. (
  • Fertig! Mit diesen Einstellungen können Sie bereits die erste Serienmail verschicken.

    Personalisierte Serienmails

    Vermutlich wollen Sie den Inhalt der Serienmail mit einigen dynamischen Elementen füllen - etwa, um den Empfänger mit "Sehr geehrter Herr Minhorst" persönlich anzusprechen.

    Dazu sieht das Serienmail-Tool den Einsatz von Platzhaltern vor, die es zusammen mit den Mails in der Datenbank speichert. Um die Platzhalter festzulegen, müssen Sie zwei Voraussetzungen erfüllen:

  • Die im Kombinationsfeld Tabelle ausgewählte Tabelle enthält für jeden Platzhalter eine Spalte mit den einzufügenden Inhalten.
  • Der Plaintext- und der HTML-Inhalt weisen in eckige Klammern gesetzte Platzhalter auf (diese müssen nicht unbedingt in beiden Formaten auftauchen).
  • Ist dies beides erfüllt, klicken Sie einfach auf die Schaltfläche Platzhalter aktualisieren. Das Unterformular mit der Überschrift Quellfelder der Platzhalter listet dann in der linken Spalte alle in den Mail-Inhalten gefundenen Platzhalter auf - also alle in eckigen Klammern eingefassten Zeichenketten. In der rechten Spalte können Sie eines dieser Felder auswählen. Dessen Inhalt wird dann vor dem Verschicken für den entsprechenden Platzhalter eingesetzt (s. Abb. 8).

    Wenn Sie den Inhalten nachträglich Platzhalter hinzugefügt haben, können Sie entweder erneut alle Platzhalter einlesen, wobei alle angegebenen Quellfelder gelöscht werden, oder den neuen Platzhalter manuell in die Liste eintragen.

    Abb. 8: Die Empfänger-Informationen enthalten auch die Einstellungen für die Platzhalter in personalisierten E-Mails.

    Abb. 9: Weitere Funktionen des Tools: Versenden der Mail, Kopieren eines Newsletters und Anzeigen der Empfängerliste

    Abb. 10: Anzeige der Empfänger einer Serien-E-Mail mit Angabe des Versandzeitpunkts

    Weitere Möglichkeiten

    Das Hauptformular bietet drei weitere Steuerelemente (s. Abb. 9):

  • Mit der Schaltfläche Mail versenden bringen Sie die Serienmail auf den Weg.
  • Die Schaltfläche E-Mail kopieren erstellt eine neue E-Mail auf Basis der aktuell angezeigten E-Mail. Auf diese Weise sparen Sie sich die Neueingabe konstanter Informationen wie SMTP-Server oder Absender-Angaben.
  • Die Schaltfläche Empfänger anzeigen öffnet ein weiteres Formular, das die Empfänger der aktuellen E-Mail auflistet (s. Abb. 10).
  • Das Formular aus Abb. 10 offenbart ein weiteres Feature, das auf den ersten Blick nicht offensichtlich ist: Das Tool merkt sich, welche Mail an welche Empfänger verschickt wurde. Hat der Versand einmal nicht geklappt, speichert es dennoch die Versandinformationen inklusive dem Hinweis, dass die Mail nicht erfolgreich versendet wurde, und dem Grund für das Fehlschlagen.

    Wenn man den Versand erneut startet, verschickt das Tool die E-Mail nur noch an Empfänger, die die Mail noch nicht erhalten haben.

    Datenmodell

    Das Datenmodell, auf dem das vorgestellte Werkzeug aufbaut, besteht aus fünf miteinander verknüpften Tabellen (s. Abb. 11). Die Haupttabelle heißt tblEMails. Sie enthält die meisten der im Formular frmSerienmail abgebildeten Informationen. Die Empfänger der Mail werden im Hauptformular nicht explizit angezeigt. Trotzdem speichert die Datenbank diese Angaben, und zwar inklusive Versanddatum.

    Dabei werden alle Versuche, eine E-Mail zu versenden, protokolliert - auch die gescheiterten. Diese Informationen hält das Tool in der Tabelle tblEMailsEmpfaenger fest. Die Empfänger schreibt es nicht direkt in diese, sondern in eine weitere Tabelle namens tblEmpfaenger. Dies hat den Grund, dass man vermutlich regelmäßig E-Mails an den gleichen Kreis von Empfängern versendet. Damit deren E-Mail-Adresse nicht mit jedem Versand neu gespeichert werden muss, wird jede E-Mail-Adresse einmalig in der Tabelle tblEmpfaenger gespeichert.

    Die Tabelle tblPlatzhalter speichert sowohl die Platzhalter als auch die Felder, aus denen die Platzhalter gespeist werden sollen. Die Tabelle ist über das Feld EMailID mit der Tabelle tblEMails verbunden.

    Technik

    Das technische Highlight der Anwendung ist die DLL SendMail2.dll, die Sascha Trowitzsch zusammengestellt hat. Die darin enthaltene Klasse vbSendMail2 bietet alle Möglichkeiten zum Senden von E-Mails über das SMTP-Protokoll.

    Dazu gehören Eigenschaften zum Festlegen aller Informationen, die in der Tabelle tblEMails enthalten sind und die der Anwender über das Formular frmSerienmail eingeben kann. Außerdem gibt es dort eine Methode namens Send zum Verschicken einer E-Mail. Besonders hilfreich sind die von der Klasse bereitgestellten Ereigniseigenschaften, mit denen man auf bestimmte Ereignisse wie das erfolgreiche Versenden oder das Scheitern eines Sendevorgangs reagieren kann - dazu später mehr.

    Abb. 11: Datenmodell des Serienmail-Tools

    Datenherkunft mit E-Mail-Empfängern auswählen

    Technisch interessant ist die Anzeige der Tabellen und Abfragen mitsamt darin enthaltenen Feldern, welche mit der in Abb. 12 gezeigten Abfrage ermittelt werden.

    Abb. 12: Diese Abfrage ermittelt alle Tabellen und Abfragen einer Datenbank.

    Das Kombinationsfeld cboSourceObject verwendet diese Abfrage, um die in der Datenbank enthaltenen Tabellen und Abfragen anzuzeigen. Dazu stellen Sie die Eigenschaft Datensatzherkunft auf diese Abfrage ein.

    Damit der Tabellenname in der dem Formular zugrunde liegenden Tabelle gespeichert wird, stellen Sie außerdem die Eigenschaft Steuerelementinhalt auf das Feld EMailTabelle ein.

    Diese basiert auf der Systemtabelle MSysObjects und zeigt die Namen der Objekte an, deren Feld Type den Wert 1 (Tabelle) oder 5 (Abfrage) und deren Feld Flag den Wert 0 aufweist.

    Nach Sie einen Eintrag dieser Tabelle ausgewählt haben, sollen die Kombinationsfelder cboPrimaerschluesselfeld, cboSourcefieldMail und cboSourceFieldHTML desselben Formulars sowie das Kombinationsfeld Quellfeld des Unterformulars frmPlatzhalter aktualisiert werden und anschließend die Felder der aktuell ausgewählten Datenherkunft anzeigen.

    Die passende Prozedur heißt cboSourceFieldMail_Aktualisieren. Sie wird unter anderem von der Ereignisprozedur aufgerufen, die nach dem Aktualisieren des Kombinationsfelds cboSourceObject, aber auch direkt beim Öffnen des Formulars ausgelöst wird.

    Quellcode 1 enthält die Ereignisprozedur Nach Aktualisierung des Kombinationsfeldes cboSourceObject und die dadurch aufgerufene Prozedur.

    Letztere prüft zunächst, ob im Kombinationsfeld cboSourceObject eine Tabelle oder eine Abfrage ausgewählt wurde. Abhängig davon erzeugt sie entweder ein TableDef-Objekt (bei einer Tabelle) oder ein QueryDef-Objekt (Abfrage).

    Anschließend durchläuft die Prozedur alle Elemente des jeweiligen Objekts und stellt diese durch Semikola getrennt zu einer String-Variablen zusammen.

    Quellcode 1: Aktualisieren der Kombinationsfelder zur Auswahl der Felder der Datenherkunft

    Private Sub cboSourceObject_AfterUpdate()

        cboSourceFields_Aktualisieren

    End Sub

    Private Sub cboSourceFields_Aktualisieren()

        '... Deklarationsteil (siehe Beispieldatenbank)

        Set db = CurrentDb

        Select Case Me!cboSourceObject.Column(1)

            Case 1

                Set Obj = db.TableDefs(Me!cboSourceObject)

            Case 5

                Set Obj = db.QueryDefs(Me!cboSourceObject)

            Case Else

                Exit Sub

        End Select

        For Each fld In Obj.Fields

            str = str & fld.name & ";"

        Next fld

        str = Left(str, Len(str) - 1)

        Me!cboSourcefieldMail.RowSource = str

        Me!cboSourceFieldHTML.RowSource = str

        Me!cboPrimaerschluesselfeld.RowSource = str

        Me!frmPlatzhalter.Form.cboQuellfeld.RowSource = str

    End Sub

    Quellcode 2: Öffnen eines Formulars zur Anzeige eines HTML-Dokuments

    Private Sub cmdHTMLAnzeigen_Click()

        DoCmd.OpenForm "frmHTML", WindowMode:=acDialog, _
            OpenArgs:=Me!InhaltHTML

    End Sub

    Quellcode 3: Erstellen einer neuen Textdatei

    Private Sub Form_Open(Cancel As Integer)

        Me!ctlWebbrowser.Navigate "about:blank"

        Me!ctlWebbrowser.Document.Write Me.OpenArgs

    End Sub

    Diese Zeichenkette weist sie schließlich der jeweiligen Datensatzherkunft zu und stellt gleichzeitig die Eigenschaft Herkunftsart auf Wertliste ein.

    Anzeigen der HTML-Ansicht

    Die Schaltfläche cmdHTMLAnzeigen rendert auf Mausklick den HTML-Text der bearbeiteten Mail.

    Dies geschieht auf einem kleinen Umweg: Die Routine, die beim Klicken der Schaltfläche ausgelöst wird, öffnet das Formular frmHTML und übergibt den aktuellen HTML-Code als Öffnungsargument (s. Quellcode 2).

    Das Formular frmHTML besteht lediglich aus einem Webbrowser-Steuerelement sowie einer Schaltfläche zum Schließen des Formulars.

    Das Öffnen dieses Formulars löst die Ereignisprozedur Form_Open mit zwei Anweisungen zum Anzeigen des
    übergebenen HTML-Dokuments aus (s. Quellcode 3).

    Platzhalter

    Platzhalter legt man im Quelltext der Text- und der HTML-Version der Serienmail durch in eckige Klammern eingefasste Wörter an - etwa [Vorname] oder [Nachname]. Deren Inhalte sollen mit den passenden Feldern der zugrunde liegenden Datenherkunft gefüttert werden. Dazu muss der Benutzer der Anwendung zunächst einmal mitteilen, welcher Platzhalter mit welchem Feld gefüllt werden soll. Das erfolgt im Unterformular frmPlatzhalter. Dieses enthält als Datenherkunft die Tabelle tblPlatzhalter und zeigt die darin enthaltenen Felder Platzhalter und Quellfeld in der Datenblattansicht an. Das Kombinationsfeld Quellfeld wird ja, wie bereits weiter oben erwähnt, mit den Feldern der verwendeten Datenherkunft für die Serienmail gefüllt.

    Das Unterformular ist über das Feld EMailID mit dem Hauptformular verknüpft, sodass es immer die Platzhalter zu der Serienmail anzeigt, die im Hauptformular zu sehen ist.

    Damit der Benutzer die Platzhalter nur in die Quelltexte der Serienmail schreiben und nicht auch noch in die Liste der Platzhalter eintragen muss, gibt es die Schaltfläche cmdPlatzhalterBearbeiten.

    Quellcode 4: Versenden der Serienmail (Teil 1)

    Private Sub cmdSenden_Click()

        DoCmd.Hourglass True

        '... Deklarationsteil (nicht abgedruckt)

        

        DoCmd.RunCommand acCmdSaveRecord '[1]

        

        Set objMail = New vbSendMail2.asSendMail

        

        Set db = CurrentDb

        Set rstKontakte = db.OpenRecordset("SELECT " & Me!cboPrimaerschluesselfeld & ", " _
            & Me!cboSourcefieldMail & " FROM " & Me!cboSourceObject, dbOpenDynaset) '[2]

        rstKontakte.MoveLast

        rstKontakte.MoveFirst

        intKontakte = rstKontakte.RecordCount '[3]

        Do While Not rstKontakte.EOF

            If Nz(DLookup("EMailID", "qryEmpfaenger", "EMailID = " & Me.EMailID & " AND EMail = '" _
                & rstKontakte!EMail & "' AND Gesendet = True"), 0) = 0 Then '[4]

                With objMail

                    .from = Me.Von

                    .Subject = Me.Betreff

                    .Recipient = rstKontakte!EMail

                    .SMTPHost = Me.SMTPServer

                    .SMTPPort = Me.Port

    Diese löst die Ereignisprozedur cmdPlatzhalterBearbeiten_Click aus (siehe Modul Form_frmSerienmail in der Beispieldatenbank), die nach Rückfrage alle Platzhalter der aktuellen Serienmail löscht und für jeden in der Serienmail enthaltenen Platzhalter einen neuen Eintrag anlegt.

    Für das Ermitteln der Platzhalter ist die Prozedur PlatzhalterSchreiben verantwortlich, die jeweils den übergebenen Text auf Zeichenketten in eckigen Klammern untersucht und diese unter Angabe der ID der aktuellen Serienmail in die Tabelle tblPlatzhalter einträgt.

    E-Mails versenden

    Die Schaltfläche cmdSenden ruft die Ereignisprozedur aus Quellcode 4 auf. Die Prozedur speichert zunächst den aktuellen Datensatz, damit die Mail mit den aktuellen Daten verschickt wird [1]. Anschließend erzeugt sie eine Datensatzgruppe (rstKontakte) auf Basis der als Datenherkunft für die Adressaten angegebene Tabelle oder Abfrage [2] und ermittelt die Anzahl der enthaltenen Datensätze als Grundlage für die Anzeige des Fortschritts in der Statusleiste [3].

    Nun startet das eigentliche Versenden: Dazu durchläuft die Routine in einer Schleife alle Datensätze in der Datensatzgruppe rstKontakte.

    Gleich die erste Zeile prüft, ob die Mail noch nicht an den aktuellen Empfänger gesendet wurde [4] - in dem Fall soll das nicht noch einmal geschehen.

    Die folgenden Zeilen füllen die Eigenschaften des Objekts objMail mit Daten aus zwei Quellen: Allgemeine Daten, die in jeder Mail vorkommen, stammen aus den entsprechenden Feldern des Formulars frmSerienmail, die übrigen sind empfängerspezifisch, werden aus dem aktuell in der Schleife durchlaufenen Datensatz eingelesen und den passenden Eigenschaften zugewiesen.

    Ist im Formular festgelegt, dass die Empfänger ihre E-Mail wahlweise im HTML- und im Plaintext-Format enthalten, ermittelt eine DLookup-Anweisung das für den aktuellen Empfänger gewünschte Format [5]; anderenfalls stellt sie das Standardformat ein [6].

    Quellcode 4: Versenden der Serienmail (Fortsetzung)

                    If Me.ogrHTMLIndividuell = True Then

                        bolHTML = DLookup(Me!cboSourceFieldHTML, Me!cboSourceObject, _
                            Me!cboPrimaerschluesselfeld & " = "  _
                            & rstKontakte(Me!cboPrimaerschluesselfeld)) '[5]

                    Else

                        bolHTML = Me!ogrStandardformat '[6]

                    End If

                    If bolHTML = True Then '[7]

                        .AsHTML = True

                        .Message = PlatzhalterErsetzen(Me!InhaltHTML, Me!EMailID)

                    Else

                        .AsHTML = False

                        .Message = PlatzhalterErsetzen(Me!Inhalt, Me!EMailID)

                    End If

                    Select Case Me.ogrAuthentifizierung '[8]

                        Case 1

                            .UsePopAuthentication = True

                            .Username = Me.txtFrom

                            .Password = Nz(Me.txtKennwort, "")

                            .POP3Host = Me.txtPOP3Server

                        Case 2

                            .UseAuthentication = True

                            .Username = Me.txtFrom

                            .Password = Nz(Me.txtKennwort, "")

                    End Select

                    .send

                    If bolGesendet = True Then

                        intGesendet = intGesendet + 1

                    End If

                    EmpfaengerdatenSpeichern rstKontakte(Me!cboSourcefieldMail), _
                        Me!EMailID, db, bolGesendet, strMeldung '[9]

                End With

            Else

                intNichtGesendet = intNichtGesendet + 1

            End If

            SysCmd acSysCmdSetStatus, rstKontakte.AbsolutePosition + 1 & " von " & intKontakte _

                 & " versendet."

            rstKontakte.MoveNext

            DoEvents

        Loop

        MsgBox "Statistik:" & vbCrLf & "Anzahl erfolgreich versendeter E-Mails: " _
            & intGesendet & vbCrLf & "Anzahl nicht versendeter E-Mails: " & intNichtGesendet

        Set objMail = Nothing

        DoCmd.Hourglass False

    End Sub

    Die folgenden Anweisungen legen die Eigenschaften AsHTML und Message des Objekts objMail anhand der zuvor ermittelten Werte fest [7].

    Fehlt noch die Art der Anmeldung an den SMTP-Server. Das folgende Select Case-Konstrukt teilt dem Objekt objMail die passenden Werte aus dem Formular mit.

    Die Send-Methode sorgt schließlich für das Versenden der E-Mail an den aktuellen Empfänger. Das Ergebnis dieses Vorgangs landet als neuer Datensatz in der Tabelle tblEMailsEmpfaenger. Das Speichern dieser Daten übernimmt die Routine EmpfaengerdatenSpeichern, die hier nicht abgedruckt ist; sie prüft zuvor, ob die E-Mail-Adresse des Empfängers schon in der Tabelle tblEmpfaenger steht, und trägt diese gegebenenfalls nach [9]. Die übrigen Anweisungen aktualisieren die Fortschrittsanzeige in der Statusleiste und die Ausgabe, wie viele E-Mails nach dem Durchlaufen sämtlicher Empfänger verschickt worden sind.

    Status ermitteln per
    Ereignisprozedur

    Das Objekt objMail stellt einige Ereignisse nach dem erfolgreichen oder fehlgeschlagenen Versenden einer E-Mail zur Verfügung. Um diese Ereignisse abzufangen und eigene Anweisungen bei deren Auftreten auszuführen, deklariert man das Objekt im Kopf des Moduls als "With Events":

    Dim WithEvents objMail As 
    vbSendMail2.asSendMail

    Die Auswahl des Objekts objMail im linken Kombinationsfeldes des Codefensters führt zur Anzeige der vorhandenen Ereignisse im rechten Kombinationsfeld (s. Abb. 13). Der Klick auf einen Eintrag im rechten Kombinationsfeld legt automatisch den Rumpf für Prozeduren an, die beim passenden Ereignis ausgelöst werden.

    Abb. 13: Diese Prozeduren werden durch Ereignisse des Objekts objMail ausgelöst.

    Die Ereignisse sind beispielsweise wichtig, um direkt ein Feedback über das Ergebnis eines Sendevorgangs zu erhalten und angemessen darauf reagieren zu können. Im vorliegenden Fall speichern die Ereignisprozeduren für Erfolg oder Misserfolg eines Sendevorgangs Informationen über das Ergebnis in modulweit deklarierten Variablen. Die oben vorgestellte Routine zum Versenden von E-Mails liest beispielsweise die Variablen bolGesendet und strMeldung aus, um die passenden Informationen in die Tabelle tblEMailsEmpfaenger zu schreiben.

    Platzhalter ersetzen

    Die Funktion PlatzhalterErsetzen trägt vor dem Versenden an Stelle der Platzhalter die vorgesehen Inhalte in die E-Mails ein. Dazu übergibt die aufrufende Prozedur den Text mit den Platzhaltern sowie die ID der Serienmail, damit auch die richtigen Platzhalter ersetzt werden.

    Die Funktion durchläuft eine Datensatzgruppe mit den der Serienmail zugeordneten Platzhaltern und ersetzt die angegebenen Ausdrücke durch die passenden Inhalte. Der Rückgabewert ist dann mit den gewünschten Daten versehene Fassung des Textes (siehe Routine PlatzhalterErsetzen im Modul Form_frmSerienmail der Beispieldatenbank).

    Tipps und Tricks

    Wenn Sie das Serienmail-Tool einsetzen, steht vor dem Versenden der Serienmail an die komplette Verteilerliste hoffentlich ein Test. Dazu legen Sie am besten eine Tabelle mit einigen Dummy-Adressen an - sicher haben Sie selbst den einen oder anderen E-Mail-Account, an den Sie sich die Serienmail zunächst selbst zusenden können.

    Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

    Sind Sie Abonnent?Jetzt einloggen ...
     

    Kompletten Artikel lesen?

    Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

    E-Mail:

    © 2003-2015 André Minhorst Alle Rechte vorbehalten.