Home > Artikel > Ausgabe 5/2013 > E-Mails mit Outlook versenden

E-Mails mit Outlook versenden

  PDF ansehen

  Download PDF und Beispieldatenbank

Microsoft Outlook ist für viele Access-Nutzer das Mittel der Wahl, um E-Mails zu versenden. Kein Wunder: Dank VBA-Schnittstelle lässt es sich ganz einfach von Access aus ansprechen. So können Sie im einfachsten Fall per Mausklick eine leere E-Mail öffnen, um diese auszufüllen und zu versenden. Oder Sie erstellen gleich die komplette E-Mail inklusive Empfänger, Betreff, Inhalt und gegebenenfalls auch den Anhang und versenden diese, ohne dass sie überhaupt angezeigt wird. Dieser Artikel zeigt die grundlegenden Techniken für die Programmierung von Outlook.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1305_MailMit­Outlook.mdb.

Vorbereitungen

Access stellt im VBA-Editor standardmäßig die Objekte, Methoden, Eigenschaften und Ereignisse der vier Bibliotheken Visual Basic for Applications, Microsoft Access x.0 Object Library, OLE Automation und Microsoft DAO 3.6 Object Library (ab Access 2007 Microsoft x.0 Access Database Engine Object) bereit. Diese enthalten die wesentlichen für die Arbeit mit Access notwendigen Elemente. Wenn Sie Ihre Arbeit auf andere Office-Anwendungen wie beispielsweise Outlook, Word oder Excel ausdehnen möchten, benötigen Sie entweder einen entsprechenden Verweis auf die jeweilige Bibliothek oder Sie binden das gewünschte Objekt erst zur Laufzeit ein.

Weitere Informationen zu diesen beiden Techniken, die Early Binding und Late Binding genannt werden, finden Sie im Artikel Early Binding und Late Binding.

In diesem Artikel verwenden wir Early Binding für den Zugriff auf das Objektmodell von Outlook. Das bedeutet, dass Sie im VBA-Editor mit dem Menüeintrag Extras|Verweise den Eintrag Microsoft Outlook x.0 Object Library hinzufügen (siehe Bild 1).

Verweise eines VBA-Projekts

Bild 1: Verweise eines VBA-Projekts

Wenn Sie nun mit der Taste F2 den Objektkatalog öffnen und dort im Kombinationsfeld oben links den Eintrag Outlook auswählen, finden Sie unten eine Liste aller Objekte der Outlook-Bibliothek vor – eines davon ist das Mail­Item-Objekt, mit dem wir gleich zu tun haben werden (siehe Bild 2).

Die Outlook-Bibliothek im Objektkatalog

Bild 2: Die Outlook-Bibliothek im Objektkatalog

Formular zum Steuern der Beispiele

Die Beispiele dieses Artikels steuern wir von einem Formular aus. Das Formular heißt frmMails und erhält zunächst eine Schaltfläche namens cmdMailErzeugen.

Hinterlegen Sie für die Ereigniseigenschaft Beim Klicken dieser Schaltfläche den Wert [Ereignisprozedur] und klicken Sie dann auf die Schaltfläche rechts neben dem Eigenschaftswert.

Es öffnet sich der VBA-Editor mit der leeren Prozedur. Dort ergänzen Sie zunächst die Zeilen aus Listing 1.

Private Sub cmdMailErzeugen_Click()

     Dim objOutlook As Outlook.Application

     Set objOutlook = New Outlook.Application

     MsgBox objOutlook.Name

     ‚...

End Sub

Listing 1: Outlook starten

Diese Anweisungen tun nichts anderes, als eine Outlook-Instanz zu erstellen beziehungsweise eine bestehende Instanz mit der Objektvariablen objOutlook zu referenzieren und den Wert der Eigenschaft Name der mit der Objektvariablen referenzierten Outlook-Instanz auszugeben.

Um dies zu reproduzieren, rufen Sie die Prozedur mit den folgenden Voraussetzungen auf und betrachten, was geschieht:

  • Wenn Outlook bereits geöffnet ist: In diesem Fall referenziert die Prozedur die Outlook-Instanz mit der Objektvariablen objOutlook und gibt deren Namen aus. Das Schlüsselwort New ist hier eigentlich irreführend, aber Sie wissen ja nun, was es bewirkt, wenn Outlook bereits geöffnet ist. Da die Objektvariable objOutlook innerhalb der Ereignisprozedur deklariert ist, wird diese anschließend automatisch wieder geleert.
  • Wenn Outlook noch nicht geöffnet ist: Dann erzeugt die Anweisung mit dem New-Schlüsselwort eine neue Instanz von Outlook und referenziert diese mit objOutlook. Nach der Ausgabe von objOutlook.Name wird die Prozedur wieder beendet. Da objOutlook die Outlook-Instanz somit nicht mehr referenziert, wird auch die Outlook-Instanz wieder beendet. Sie können dies im Windows Tast-Manager reproduzieren. Vor dem Aufruf sollte dort kein Eintrag namens OUTLOOK.EXE vorhanden sein. Während das Meldungsfenster angezeigt wird, finden Sie diesen Eintrag jedoch im Task-Manager vor. Nach dem Schließen des Meldungsfensters und dem Beenden der Prozedur verschwindet OUTLOOK.EXE wieder aus der Liste der Tasks.

Eine wichtige Information ist an dieser Stelle, dass Outlook durch das einfache Instanzieren nicht angezeigt wird – dies ist auch nur mit einem anderen Befehl möglich. Allerdings ist dies auch nicht das Ziel dieses Artikels – wir möchten schließlich eine E-Mail verschicken.

Leere E-Mail erstellen

Um eine neue, leere E-Mail zu erstellen, sind nur noch wenige Ergänzungen nötig. Die erste ist die Deklaration eines Objekts vom Typ Outlook.MailItem. Dieses referenziert die nachfolgend erstellte E-Mail. Die CreateItem-Methode mit dem Wert olMailItem für den ersten Parameter erzeugt ein neues E-Mail-Objekt, dass wir gleich mit der Objektvariablen objMail referenzieren.

Statt olMailItem könnten Sie auch eine andere Variable verwenden – beispielsweise um einen Termin oder einen Kontakt zu erzeugen. Dies besprechen wir jedoch in einem späteren Artikel.

Das MailItem-Objekt bietet einige Methoden an, zum Beispiel Display (siehe Listing 2). Damit zeigen Sie die frisch erstellt E-Mail nun auch noch an (siehe Bild 3). Die E-Mail wird mit dem standardmäßig gewählten Absender und gegebenenfalls mit einer Signatur angezeigt.

Eine per VBA erzeugte E-Mail

Bild 3: Eine per VBA erzeugte E-Mail

Sie können die E-Mail nun ausfüllen und durch Anklicken der Senden-Schaltfläche abschicken.

Die Display-Methode bietet noch einen Parameter namens Modal an, der standardmäßig mit dem Wert False belegt ist. Stellen Sie diesen auf den Wert True ein, wird der aufrufende Programmcode solange an der Display-Anweisung angehalten, bis der Benutzer die E-Mail versendet oder anderweitig schließt.

Sobald die E-Mail versendet wurde, können Sie jedoch nicht mehr über die Objektvariable objMail auf die Eigenschaften der E-Mail zugreifen – Sie können also nicht ohne Weiteres etwa auf den Betreff oder den Inhalt zugreifen, um diesen auszulesen und in der Datenbank zu archivieren.

Mail nach dem Versand speichern

Dabei wäre gerade dies interessant: Wenn Sie etwa von einer Kundendatenbank aus eine E-Mail an den aktuell im Kundenformular angezeigten Kunden senden, wäre es doch praktisch, die Korrespondenz anschließend direkt in Zusammenhang mit dem Kundendatensatz zu speichern. Dazu sind jedoch fortgeschrittene Techniken nötig, die wir in einem weiteren Artikel besprechen.

E-Mail vollautomatisch füllen und senden

In vielen Fällen möchten Sie aber vermutlich direkt die komplette E-Mail per VBA-Code fertigstellen und versenden. Dazu finden Sie nachfolgend die grundlengenden Techniken.

Die wichtigsten Einstellungen sind dabei der Empfänger, der Betreff und der Inhalt der E-Mail. Diese Informationen wollen wir per Formular eingeben und direkt in einer Tabelle namens tblMails speichern, die zunächst wie in Bild 4 aussieht (später kommen noch weitere Felder hinzu).

Tabelle zum Speichern von E-Mails

Bild 4: Tabelle zum Speichern von E-Mails

Die Tabelle brauchen wir hier eigentlich nicht, aber der Autor ist zu faul, die Testwerte immer wieder neu in das Formular einzutippen ...

Die Tabelle enthält zunächst vier Felder namens MailID (Primärschlüsselfeld), Empfaenger (E-Mail-Adresse des Empfängers), Betreff und Inhalt (als Memofeld, da gelegentlich länger als 255 Zeichen).

Das Formular frmMail binden wir über die Eigenschaft Datenherkunft an die Tabelle tblMails und ziehen die vorhandenen Felder in den Detailbereich des Formularentwurfs. Fügen Sie außerdem eine Schaltfläche namens cmdMailSenden hinzu (siehe Bild 5).

Schaltfläche zum Absenden einer E-Mail

Bild 5: Schaltfläche zum Absenden einer E-Mail

Damit die in die drei Felder eingetragenen Daten nun direkt in einer zu erstellenden E-Mail landen, hinterlegen Sie für die Schaltfläche cmdMailSenden etwa die Ereignisprozedur aus Listing 3.

Private Sub cmdMailSenden_Click()

     Dim objOutlook As Outlook.Application

     Dim objMail As Outlook.MailItem

     Set objOutlook = New Outlook.Application

     Set objMail = objOutlook.CreateItem(olMailItem)

     With objMail

         .Recipients.Add Me!Empfaenger

         .Subject = Me!Betreff

         .Body = Me.Inhalt

         .Display

         ‚.Send

     End With

End Sub

Listing 3: Anzeigen einer E-Mail, die mit Daten aus einer Tabelle gefüllt wurde

Die Prozedur erstellt wiederum eine Referenz auf eine bestehende oder neue Outlook-Instanz, erzeugt ein neues MailItem-Objekt und füllt dann die Eigenschaften mit den entsprechenden Werten.

Für Subject (Betreff) und Body (Inhalt) ist dies direkt über die Zuweisung der jeweiligen Feldinhalt möglich.

Um einen Empfänger hinzuzufügen, verwenden Sie die Add-Methode der Recipients-Auflistung.

Auf diese Weise können Sie einen oder mehrere Empfänger angeben.

Schließlich wollen wir die E-Mail zunächst betrachten – dazu verwenden wir die Display-Methode. Nachdem Sie sich von der korrekten Funktion beim Füllen der E-Mail-Inhalte überzeugt haben, können Sie im nächsten Versuch die Display-Methode entfernen und die Send-Methode durch Auskommentieren aktivieren.

Nun öffnen Sie das Formular in der Formularansicht und tragen einige Beispielinhalte wie in Bild 6 ein.

Eingabe der E-Mail-Inhalte per Access-Formular

Bild 6: Eingabe der E-Mail-Inhalte per Access-Formular

Ein Klick auf die Schaltfläche cmdMailSenden erzeugt die E-Mail und füllt die betroffenen Felder. Das Ergebnis sieht wie in Bild 7 aus.

Alle Informationen wurden wie gewünscht in die neue E-Mail übertragen.

Bild 7: Alle Informationen wurden wie gewünscht in die neue E-Mail übertragen.

Nach dem Ersetzen der Display-Methode durch die Send-Methode bewirkt ein Klick auf die Schaltfläche cmdMailSenden das Erstellen und direkte Versenden der E-Mail.

Weitere Empfänger

Wenn Sie der E-Mail mehrere Empfänger zuweisen möchten, verwenden Sie die Add-Methode der Recipients-Auflistung entsprechend oft. Außerdem gibt es ja noch die Empfänger, die eine E-Mails nur als Kopie erhalten sollen. Bei der Kopie können Sie festlegen, ob die übrigen Empfänger erfahren, wer die Kopie erhält, oder nicht. Öffentliche Empfänger einer Kopie fügen Sie über die Eigenschaft CC hinzu, nicht öffentliche Empfänger mit BCC. Im Kontext der zuvor verwendeten Prozedur fügen Sie etwa die folgenden Zeilen hinzu:

With objMail

     ...

     .CC = "info@ribbon-admin.de"

     .BCC = "info@amvshop.de"

     ...

End With

Diese Felder können Sie natürlich ebenfalls per Tabelle/Formular pflegen, das Ergebnis sieht in der E-Mail wie in Bild 8 aus.

E-Mail mit CC- und BCC-Empfängern

Bild 8: E-Mail mit CC- und BCC-Empfängern

Im Gegensatz zur Add-Methode der Recipients-Auflistung, mit der Sie jeweils einen weiteren Empfänger zu einer E-Mail hinzufügen, müssen Sie die Empfänger einer CC- oder BCC-Kopie direkt als Liste angeben – also etwa so:

andre@minhorst.com;info@access-basics.de

Anhänge hinzufügen

Wenn Sie mit Outlook einen Anhang hinzufügen, wählen Sie diesen aus dem Dateisystem aus und Outlook übernimmt den Rest der Arbeit. Unter VBA müssen Sie zumindest den Auswahldialog selbst bereitstellen.

Das ist aber kein Problem – im Artikel Dialog zur Auswahl von Dateien anzeigen haben Sie diesen bereits kennengelernt.

In diesem Fall verwenden wir eine Abwandlung der dortigen Funktion, die auch die Auswahl mehrerer Dateien erlaubt. Die Funktion heißt OpenFileNameMultiple (siehe Modul mdlTools der Beispieldatenbank).

Im Formular fügen wir ein an das entsprechende Feld Anhang der Tabelle tblMails gebundenes Textfeld hinzu und legen rechts daneben eine Schaltfläche an, welche die Ereignisprozedur aus Listing 4 auslöst (siehe Bild 9).

Festlegen der Attachments im Formular

Bild 9: Festlegen der Attachments im Formular

Mit dieser Prozedur wählen Sie eine oder mehrere Dateien aus, die in das Feld Anhang eingetragen werden.

Im Code berücksichtigen Sie ein einzelnes Attachment wie folgt:

With objMail

     ...

     .Attachments.Add CStr(Me!Anhang)

     ...

End With

Beachten Sie, dass die Methode einen Fehler auslöst, wenn Sie die übergebene Zeichenkette nicht mit der CStr-Funktion behandeln. Hier gilt wie bei manch anderem Phänomen: Einfach nicht nach dem Grund fragen. Das spart viel Zeit und Energie.

Das Attachment wird dann wie gewünscht an die E-Mail angehängt.

Wenn Sie mehrere Anhänge hinzufügen möchten, haben Sie mit der Funktion OpenFileNameMultiple bereits die Voraussetzungen erfüllt. Bei Auswahl mehrerer Dateien liefert diese Funktion eine durch das Tab-Zeichen getrennte Liste der gewählten Dateien. Nun müssen Sie nur noch dafür sorgen, dass alle Einträge nacheinander mit der Add-Methode zur Auflistung Attachments hinzugefügt werden.

Dazu deklarieren Sie zwei Variablen namens i und strAnhaenge().

Letztere wird als Array deklariert und soll mit den durch vbTab getrennten Dateinamen gefüllt werden.

Später erzeugen Sie mit der Split-Anweisung ein Array aus der Dateiliste. Dieses Array durchlaufen Sie in einer For...Next-Schleife über die Indexwerte des Arrays (LBound liefert den kleinsten Indexwert, UBound den größten - bei drei Dateien etwa 0 und 2).

Innerhalb der For...Next-Schleife hängen Sie die einzelnen Dateinamen mit der Add-Methode an die Attachments-Auflistung an (siehe Listing 5).

...

Dim i As Integer

Dim strAnhaenge() As String

...

With objMail

     ...

     strAnhaenge = Split(Me.Anhang, vbTab)

     For i = LBound(strAnhaenge) To UBound(strAnhaenge)

         .Attachments.Add CStr(strAnhaenge(i))

     Next i

...

Listing 5: Anhängen mehrerer Attachments

Das Ergebnis sieht dann bei drei Dateien etwa wie in Bild 10 aus.

Mail mit Anhang

Bild 10: Mail mit Anhang

Priorität und Empfangs­bestätigung

Sie können einer E-Mail auch eine Priorität zuweisen und vom Empfänger eine Empfangsbestätigung anfordern.

Für die Priorität stellen Sie die Eigenschaft Priority auf einen der folgenden Werte ein:

  • olImportanceHigh
  • olImportanceLow
  • olImportanceNormal

Wenn der Benutzer eine Meldung zum Bestätigen des Empfangs der E-Mail erhalten soll, stellen Sie die Eigenschaft ReadReceiptRequested auf den Wert True ein.

Zusammenfassung und Ausblick

In diesem Artikel haben Sie die grundlegenden Techniken zum Erstellen und Versenden von Outlook-E-Mails mit VBA kennengelernt.

Dies ist die Grundlage, um beispielsweise automatisiert E-Mails mit im PDF-Format gespeicherten Rechnungen an Kunden zu senden.

Wie dies gelingt, erfahren Sie im Artikel Berichte per E-Mail verschicken, Teil II.