Home > Artikel > Ausgabe 6/2013 > E-Mails sicher versenden

E-Mails sicher versenden

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Wenn Sie eine E-Mail über Outlook mit VBA versenden, können Sie dies auf zwei Arten erledigen – durch direktes Versenden oder durch Anzeigen der Mail und anschließendes Anklicken der Senden-Schaltfläche. In beiden Fällen gibt es keine von VBA auswertbare Eigenschaft, die Informationen über den Versandstatus der E-Mail liefert. Und wenn Sie die per VBA gefüllte E-Mail vor dem Versand noch zur Kontrolle anzeigen, kann der Benutzer noch Änderungen am Inhalt vornehmen, die nicht in der Datenbank gespeichert werden. Dieser Artikel zeigt, wie Sie sich den Versand bestätigen lassen und gleichzeitig den versendeten Inhalt erfassen können.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1306_MailSicherVersenden.mdb.

Voraussetzungen

Die hier vorgestellten Techniken funktionieren nur mit neueren Outlook-Versionen (ab Outlook 2007).

Ausgangssituation

Im Artikel Berichte per E-Mail versenden aus Ausgabe 5/2013 haben Sie erfahren, wie Sie Outlook-Mails per VBA erstellen und anzeigen, bevor Sie diese verschicken (siehe Bild 1).

Erstellen einer E-Mail per VBA und Anzeige in der Outlook-Vorschau

Bild 1: Erstellen einer E-Mail per VBA und Anzeige in der Outlook-Vorschau

Betreff und Inhalt der E-Mail sowie weitere Eigenschaften wurden bereits in einem Access-Formular eingegeben, die Anzeige der Outlook-Mail vor dem Versenden soll lediglich der Kontrolle dienen.

Es sind jedoch auch noch andere Szenarien denkbar: Beispielsweise könnten Sie aus einem Kundenformular heraus eine E-Mail an den aktuell angezeigten Kunden erstellen. Sie würden dann direkt die E-Mail mit Outlook anzeigen und nicht erst ein Access-Formular erstellen, dass prinzipiell die gleichen Felder wie Outlook anzeigt. Der Benutzer trägt dann Betreff und Inhalt der E-Mail ein und versendet diese.

Im Gegensatz zur vorherigen Variante, wo wir die E-Mail bereits in einem Access-Formular erstellt und dabei gleichzeitig die Inhalt in der an das Formular gebundenen Tabelle gespeichert haben, werden Betreff, Inhalt et cetera nun nicht in der Datenbank gespeichert.

Aber auch bei der Variante, bei der die Mail im Formular erstellt und in der Tabelle gespeichert wird, kann der Benutzer ja noch Änderungen an der E-Mail vornehmen, wenn diese vor dem Versenden noch in Outlook angezeigt wird. Das heißt, dass die Tabelle mit den E-Mails unter Umständen gar nicht den tatsächlich gesendeten Inhalt enthält.

Es wäre also für beide Fälle interessant, vor dem Versenden der E-Mail über die Senden-Schaltfläche der E-Mail in Outlook noch einmal den Inhalt einzulesen und in die Datenbank zu übertragen.

Wie aber können wir dies bewerkstelligen? Hilfe bietet das Objektmodell von Outlook ab der Version 2007. Genau wie die Access-Objekte wie Formulare, Steuerelemente oder Berichte bieten auch die Outlook-Objekte Ereignisse an, für die Sie Ereignisprozeduren implementieren können. Diese werden durch Ereignisse wie Open, Send et cetera ausgelöst. Eine Übersicht etwa aller Ereignisse des MailItem-Objekts liefert der Objektkatalog, den Sie mit F2 einblenden.

Dort wählen Sie die Bibliothek Outlook aus und selektieren in der Liste links das zu untersuchende Objekt. Auf der rechten Seite finden Sie dann alle Eigenschaften, Methoden und Ereignisse des jeweiligen Objekts (siehe Bild 2). Wenn Sie dort im Kontextmenü den Eintrag Elemente gruppieren aktivieren, gruppiert der Dialog die Einträge nach Eigenschaften, Methoden und Ereignissen.

Ereignisse des MailItem-Objekts in Outlook

Bild 2: Ereignisse des MailItem-Objekts in Outlook

Ereignis beim Senden einer E-Mail

Wenn wir, wie oben beschrieben, eine E-Mail vor dem Senden noch auslesen und Informationen wie den Betreff oder den Inhalt in einer Tabelle der Datenbank speichern möchten, müssen wir das Ereignis Send des MailItem-Objekts implementieren.

Die Beispiele zu den folgenden Abschnitten finden Sie übrigens im Formular frmMail und im dazugehörigen Klassenmodul Form_frmMail.

Grundlagen zum Implementieren von Ereignissen aus anderen Objekten wie Formularen, Steuerelementen oder auch externen Objekten wie hier von Outlook finden Sie im Artikel Ereignisse abgreifen in dieser Ausgabe von Access [basics].

Wir möchten das Send-Ereignis dazu nutzen, die gegebenenfalls vom Nutzer in der Outlook-Mail geänderten Daten wie den Betreff oder den Inhalt in die entsprechenden Textfelder des Formulars zu übertragen, in dem die Mailinhalte ursprünglich zusammengestellt wurden.

Dazu deklarieren Sie im Klassenmodul des Formulars zunächst eine Objektvariable für das Objekt, dessen Ereignisse wir implementieren möchten – also im Klassenmodul Form_frmMail.

Die Deklaration sieht wie folgt aus:

Dim WithEvents objMail As Outlook.MailItem

Wichtig ist hier das Schlüsselwort With­Events. Dieses gibt an, dass im aktuelllen Klassenmodul Ereignisprozeduren für das mit dieser Variablen referenzierte Objekt vorhanden sein könnten.

Da wir die Deklaration nun im Kopf des Klassenmoduls untergebracht haben, müssen wir die entsprechende Zeile aus der Prozedur cmdMailSenden_Click entfernen (siehe Listing 1). Anderenfalls deklariert und instanziert die Prozedur ihre eigene Objektvariable mit Verweis auf die E-Mail und verwendet diese auch.

Private Sub cmdMailSenden_Click()

     Dim objOutlook As Outlook.Application

     'nächste Zeile auskommentieren

     'Dim objMail As Outlook.MailItem

     Dim i As Integer

     Dim strAnhaenge() As String

     Set objOutlook = New Outlook.Application

     Set objMail = objOutlook.CreateItem(olMailItem)

     With objMail

         '...

         .Display

         '.Send

     End With

End Sub

Listing 1: Mail füllen und vor dem Versenden anzeigen

Wenn Sie jedoch eine Objektvariable erzeugen möchten, deren Ereignisse Sie implementieren können, muss diese modulweit verfügbar sein. Damit fehlt nun eigentlich nur noch eines : Die Implementierung des Ereignisses Send mit einer entsprechenden Ereignisprozedur.

Ereignisprozeduren weisen jeweils eine eigene Syntax auf, die sich kein Programmierer merken möchte. Zum Glück bietet der VBA-Editor eine einfache Möglichkeit, diese Prozeduren bereitzustellen. Wählen Sie einfach aus dem linken Kombinationsfeld oben im Codefenster des Klassenmoduls des Formulars den Namen des Objekts aus, dessen Ereignisse Sie implementieren möchten. Der VBA-Editor legt das Standardereignis an (beim MailItem-Objekt etwa Open), welches Sie aber gleich im Anschluss wieder entfernen können. Uns interessiert das Send-Ereignis, welches Sie durch Auswahl des entsprechenden Eintrags im rechten Kombinationsfeld anlegen (siehe Bild 3).

Anlegen des Send-Ereignisses für das MailItem-Objekt namens objMail

Bild 3: Anlegen des Send-Ereignisses für das MailItem-Objekt namens objMail

Zu Testzwecken füllen wir die Prozedur zunächst mit einer einfachen Anweisung, die den aktuellen Betreff der E-Mail per Meldungsfenster ausgibt:

Private Sub objMail_Send(Cancel _

         As Boolean)

     MsgBox objMail.Subject

End Sub

Dies führt beim Anklicken der Senden-Schaltfläche der Outlook-E-Mail zur Anzeige des Meldungsfensters aus Bild 4. Hier wird auch deutlich, warum die Methode Send und nicht Sent heißt: Sie wird nicht erst nach dem Senden ausgelöst, sondern unmittelbar davor. Dies erklärt außerdem die Funktion des Parameters Cancel der objMail_Send-Ereignisprozedur: Wenn Sie diesen Parameter innerhalb der Prozedur auf True einstellen, versendet Outlook die E-Mail nicht. Dies ist zum Beispiel für solche Fälle vorgesehen, in denen Sie programmgesteuert Voraussetzungen prüfen und gegebenenfalls den Versand der E-Mail verhindern möchten.

Vor dem Versenden zeigt die Meldung den aktuellen Betreff der E-Mail an.

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!