Wie man mit Outlook eine E-Mail erstellt, diese mit Betreff, Inhalt, Anlagen, Empfänger und so weiter füllt und diese dann verschickt, weiß mittlerweile jeder. Aber was, wenn man das Erstellen von E-Mails automatisieren möchte und dazu VBA nutzen will? Beispielsweise, um auf Knopfdruck eine Standardmail an einen Empfänger zu schicken oder auch eine Mail an eine Liste von Kunden zu senden? Der vorliegende Artikel zeigt, wie Sie per VBA neue E-Mails erstellen und diese dann entweder zum Betrachten, Nachbearbeiten und zum manuellen Senden anzeigen oder diese sofort auf den Weg zum Empfänger bringen.
Einfache E-Mails programmieren
Unabhängig von den vielen Anwendungsfällen, die wir uns für das VBA-gesteuerte Erstellen von E-Mails vorstellen können, schauen wir uns in diesem Artikel erst einmal die technische Seite an. Dabei wollen wir eine einfache E-Mail wie die aus Bild 1 erstellen – also den Empfänger festlegen und den Betreff und den Inhalt eintragen. Als Abschluss wollen wir noch ein Attachment hinzufügen.
Bild 1: Zu erstellende E-Mail
Beispielcode in neuem Modul
Den Beispielcode zum Erstellen einer solchen E-Mail bringen wir in einem neuen Modul im VBA-Projekt des VBA-Editors unter, wo wir diesen leicht ausführen können. In weiteren Artikeln schauen wir uns an, wie wir solche und andere Prozeduren über das Ribbon starten können – entweder durch manuelle, benutzerdefinierte Anpassungen oder auch durch das Bereitstellen von Code und Ribbon-Anpassungen mit COM-Add-Ins.
Dazu öffnest Du den VBA-Editor (am schnellsten mit der Tastenkombination Alt + F11) und wählst den Menübefehl Einfügen|Modul aus. Damit Du den gleich erstellten Code später schnell wiederfindest, ändern wir gleich den Namen des neuen Moduls. Dazu markieren wir das Modul im Projekt-Explorer (Strg + R) und passen dann den Namen im Eigenschaften-Bereich an (F4) und geben für die Eigenschaft (Name) den Wert mdlEMailsErstellen ein (siehe Bild 2).
Bild 2: Umbenennen des VBA-Moduls
Leere E-Mail erstellen
Danach beginnen wir mit dem Erstellen und Anzeigen einer neuen, leeren E-Mail. Dazu legen wir eine neue Prozedur namens LeereEMailErstellen an.
Hier kannst Du nun direkt mit dem Programmieren beginnen, und zwar mit der folgenden kleinen Prozedur. Diese deklariert eine Objektvariable des Typs MailItem und füllt diese durch den Aufruf der Methode Create-Item. Diese Methode können wir zum Erstellen aller in Outlook verwendeter Elemente wie E-Mails, Kontakte, Termine, Aufgaben, Notizen et cetera nutzen.
Dazu müssen wir lediglich den Typ des zu erstellenden Elements in Form einer Konstanten für den einzigen Parameter der Methode CreateItem übergeben. Im Falle einer E-Mail handelt es sich dabei um die Konstante olMailItem. Damit haben wir, auch wenn wir diese noch nicht sehen, bereits eine neue E-Mail erstellt. Um diese sichtbar zu machen, rufen wir noch die Methode Display der Objektvariablen mit der neuen E-Mail auf:
Public Sub LeereEMailErstellen() Dim objMailItem As MailItem Set objMailItem = Application.CreateItem(olMailItem) objMailItem.Display End Sub
Um diese Prozedur auszuführen, platzieren wir einfach die Einfügemarke innerhalb der Prozedur und betätigen die Taste F5. Das funktioniert wie gewünscht: Es erscheint eine neue, leere E-Mail (siehe Bild 3).
Bild 3: Eine per VBA erstellte E-Mail
Parameter der Display-Methode
Die Display-Methode bietet einen Parameter namens Modal an, der standardmäßig auf False eingestellt ist. Wenn Sie diesen auf True einstellen, wird die E-Mail als modales Fenster geöffnet. Das heißt, dass der Benutzer erst mit Outlook weiterarbeiten kann, wenn er die E-Mail auf irgendeine Art geschlossen hat – entweder durch Versenden oder durch anderweitiges Schließen:
objMailItem.Display True
Für Experimente mit den in diesem Artikel vorgestellten Beispielen ist die Einstellung des Parameters Modal auf den Wert True recht praktisch, da das VBA-Fenster immer den Fokus behält und gegebenenfalls geöffnete Inspector-Fenster mit E-Mails verdeckt.
Eigenschaften der E-Mail einstellen
Nun wollen wir die Eigenschaften wie den Empfänger, den Betreff und den Inhalt der E-Mail einstellen. Dazu deklarieren wir in einer neuen Prozedur namens EMailErstellen eine weitere Variable namens strBody (siehe Listing 1). In dieser stellen wir den Inhalt der E-Mail zusammen, bevor wir ihn zuweisen. Zuvor jedoch weisen wir der Eigenschaft To den Empfänger zu und der Eigenschaft Subject den Betreff der E-Mail.
Public Sub EMailErstellen() Dim objMailItem As MailItem Dim strBody As String Set objMailItem = Application.CreateItem(olMailItem) With objMailItem .To = "andre@minhorst.com" .Subject = "Beispielmail" strBody = "Hallo André, " & vbCrLf & vbCrLf strBody = strBody & "ich hoffe, es geht Dir gut! Anbei findest Du das gewünschte Bild." & vbCrLf & vbCrLf strBody = strBody & "Viele Grüße" & vbCrLf strBody = strBody & "Klaus" .Body = strBody .Display End With End Sub
Listing 1: Code zum Erstellen einer Mail mit Empfänger, Betreff und Inhalt
Danach weisen wir der Variablen strBody die erste Zeile des Inhalts zu und fügen dieser mit der Konstanten vbCrLf zwei Zeilenumbrüche hinzu. Die nächste Anweisung greift den Inhalt von strBody auf und fügt diesem eine weitere Zeile samt Zeilenumbrüchen hinzu – und so stellen wir den kompletten Inhalt der E-Mail zusammen. Ist der Inhalt in strBody zusammengestellt, weisen wir diesen der Eigenschaft Body des MailItem-Elements zu. Schließlich zeigen wir die vollständige E-Mail wieder mit der Display-Methode an.
Da wir in dieser Prozedur oft auf Eigenschaften und Methoden des Elements objMailItem zugreifen, haben wir diese mit dem With-Schlüsselwort referenziert. Zwischen dieser Zeile und der Zeile End With können wir dann über die Punkt-Syntax auf die Eigenschaften und Methoden zugreifen, ohne jedes Mal explizit das Element objMailItem angeben zu müssen.
Führen wir nun diese Prozedur mit F5 aus, erscheint schon fast die eingangs beschriebene E-Mail – es fehlt lediglich noch die Anlage. Wir wollen der E-Mail noch eine Datei namens pic001.png hinzufügen.
Anlagen zu einer E-Mail hinzufügen
Für das Hinzufügen von Anlagen bietet das MailItem-Element die Auflistung Attachments an. Um dieser eine Anlage hinzuzufügen, wählen wir dessen Methode Add mit IntelliSense aus (siehe Bild 4).
Bild 4: Methoden per IntelliSense auswählen
Nachdem wir das getan haben, können wir als Parameter den Namen der hinzuzufügenden Datei angeben. Diesen speichern wir in einer Variablen namens strAttachment:
Dim strAttachment As String
Die Zuweisung erfolgt beispielsweise wie folgt (den Pfad haben wir abgekürzt):
strAttachment = "c:\...\pic001.png"
Und schließlich weisen wir das Attachment der E-Mail zu. Diese zusätzliche Zeile fügen wir unmittelbar vor der Zeile mit der Display-Anweisung zum Anzeigen der E-Mail ein:
objMailitem.Attachments.Add strAttachment
Führen wir die neue Version der Prozedur aus, erhalten wir genau die eingangs beschriebene E-Mail
E-Mail direkt nach dem Erstellen versenden
Wenn wir die neue E-Mail mit der Display-Methode anzeigen, kann der Benutzer diese noch kontrollieren, gegebenenfalls anpassen und sie dann mit einem Klick auf die Senden-Schaltfläche auf den Weg bringen. Vielleicht möchtest Du dies gar nicht tun, sondern die E-Mail direkt verschicken. Dann brauchst Du nur den Aufruf der Display-Methode durch den der Send-Methode zu ersetzen:
Public Sub EMailErstellen() ... Set objMailItem = Application.CreateItem(olMailItem) With objMailItem ... .Send End With End Sub
Dies verschickt die E-Mail wie andere E-Mails auch, die Du über die Benutzeroberfläche versendest. Genau wie diese E-Mails landen auch per VBA versendete E-Mails im Ordner Gesendete Elemente.
Mehrere Empfänger hinzufügen
Wenn die E-Mail im Feld To mehrere Empfänger enthalten soll, gibt es zwei Möglichkeiten:
- Empfänger durch Semikola getrennt der Eigenschaft To zuweisen
- Empfänger zur Auflistung Recipients hinzufügen
Die erste Variante sieht wie folgt aus:
objMailitem.To = "andre@minhorst.com;info@amvshop.de"
Bei der zweiten Variante ist etwas mehr Aufwand erforderlich – dafür muss man die Empfänger nicht zu einer semikola-separierten Liste zusammenstellen:
objMailitem.Recipients.Add "andre@minhorst.com" objMailitem.Recipients.Add "info@amvshop.de"
Dies wiederholt man für alle Empfänger, welche die E-Mail erhalten sollen – das Ergebnis ist das Gleiche wie zuvor.
Empfänger mit CC und BCC
Möchtest Du der E-Mail weitere Empfänger hinzufügen, welche die E-Mail als CC oder BCC erhalten, kannst Du die gleichnamigen Eigenschaften dazu nutzen. Das sieht wie folgt aus:
objMailitem.CC = "andre@minhorst.com" objMailitem.BCC = "info@amvshop.de"
Das Ergebnis sehen wir in Bild 5.
Bild 5: Per CC und BCC hinzugefügte Empfänger
Weitere Eigenschaften einstellen
Eine weitere Eigenschaft, die der eine oder andere gern einstellt, um seinen E-Mails eine andere Priorität zu geben, finden wir rechts im Ribbon einer neuen E-Mail (siehe Bild 6). Die beiden markierten Schaltflächen stehen wir Wichtigkeit: hoch und Wichtigkeit: niedrig. Auch diese können wir beim Erstellen einer E-Mail per VBA einstellen. Dazu nutzen wir die Eigenschaft Importance, der wir einen der folgenden Werte zuweisen können:
Bild 6: Weitere Eigenschaften von E-Mails
- olImportanceHigh
- olImportanceLow
- olImportanceNormal
Dabei ist olImportanceNormal der Standardwert. Um eine E-Mail mit hoher Priorität zu verschicken, weisen wir dieser über die Eigenschaft Importance den Wert olImportanceHigh zu:
objMailitem.Importance = olImportanceHigh
Und auch das beliebte Anfordern einer Lesebestätigung (und auch einer Zustellbestätigung) können wir sowohl beim Erstellen einer E-Mail über die Benutzeroberfläche (siehe Bild 7) als auch per VBA realisieren.
Bild 7: Anforderung verschiedener Bestätigungen
Die für das Anfordern einer Lesebestätigung benötigte Eigenschaft heißt ReadReceiptRequested und nimmt die Werte True oder False entgegen. Eine Zustellungsbestätigung liefert OriginatorReportRequested:
objMailItem.ReadReceiptRequested = True objMailItem.OriginatorDeliveryReportRequested = True
Textformatierung einstellen
Während für die meisten E-Mails die Darstellung als reiner Text ausreichen dürfte, möchte man doch manchmal eine schicke Signatur mit Logo verwenden oder Bilder oder Screenshots in den Text einarbeiten. Gegebenenfalls ist auch die Formatierung des Textes erwünscht. Um das Format des Mailinhalts einzustellen, können wir die Eigenschaft BodyFormat verwenden. Diese bietet die folgenden Werte an:
- olFormatHTML (2): Standardeinstellung. Hier stehen alle Formatierungsmöglichkeiten zur Verfügung. Die HTML-Variante des E-Mail-Inhalts steht über die Eigenschaft HTMLBody zur Verfügung.
- olFormatPlain (1): Reines Textformat.
- olFormatRichText (3): Hier stehen alle Formatierungsmöglichkeiten zur Verfügung. Die HTML-Variante des E-Mail-Inhalts steht über die Eigenschaft HTMLBody zur Verfügung.
- olFormatUnspecified (0): Kein Format angegeben.
Der Unterschied zwischen olFormatHTML und olFormatRichText liegt in der Verwendung etwas unterschiedlicher HTML-Auszeichnungen.
HTML-Text angeben
Egal, welchen Wert wir für die Eigenschaft BodyFormat einstellen: Wenn wir nur einen Text für die Eigenschaft Body hinterlegen, generiert Outlook automatisch eine HTML-formatierte Version. Diese können wir über die Eigenschaft HTMLBody abrufen. Für unsere Beispielnachricht sieht dieser wie folgt aus:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <HTML> <HEAD> <META NAME="Generator" CONTENT="MS Exchange Server version 16.0.15511.20000"> <TITLE></TITLE> </HEAD> <BODY> <!-- Converted from text/plain format --> <P><FONT SIZE=2>Hallo André,<BR> <BR> ich hoffe, es geht Dir gut! Anbei findest Du das gewünschte Bild.<BR> <BR> Viele Grüße<BR> Klaus</FONT> </P> </BODY> </HTML>
Wenn wir den Text direkt beim Anlegen der E-Mail mit HTML-Auszeichnungen versehen wollen, können wir das ebenfalls per VBA erledigen. Dazu brauchen wir nur den entsprechenden HTML-Text zusammenzustellen und weisen diesen dann nicht der Eigenschaft Body zu, sondern HTMLBody. Im Beispiel aus Listing 2 haben wir einmal einige HTML-Tags zu unserem Beispielinhalt hinzugefügt, darunter auch eine fette Auszeichnung.
Public Sub HTMLEMailErstellen() Dim objMailItem As MailItem Dim strBody As String Dim strAttachment As String Set objMailItem = Application.CreateItem(olMailItem) Dim objRecipient As Outlook.Recipient With objMailItem .To = "andre@minhorst.com" .BodyFormat = olFormatHTML .Subject = "Beispielmail" strBody = "<p>Hallo André,</p>" & vbCrLf & vbCrLf strBody = strBody & "<p>ich hoffe, <b>es geht Dir gut</b>! Anbei findest Du das gewünschte Bild.</p>" & vbCrLf & vbCrLf strBody = strBody & "<p>Viele Grüße</p>" & vbCrLf strBody = strBody & "<p>Klaus</p>" .HTMLBody = strBody Debug.Print .HTMLBody .Display End With End Sub
Listing 2: Erstellen einer E-Mail mit HTML-Inhalt
Diese E-Mail sieht nach dem Erstellen wie in Bild 8 aus. Wenn Du eine solche E-Mail erstellst und versendest, wirst Du allerdings feststellen, dass Outlook hier noch einige Auszeichnungen hinzufügt.
Bild 8: E-Mail mit HTML-Body
Um sich davon zu überzeugen, braucht man nur die gesendete E-Mail im Postausgang zu öffnen und mit der rechten Maustaste auf den Inhalt zu klicken. Der Kontextmenü-Befehl Quelle anzeigen liefert dann den von Outlook erzeugten Quellcode, der nicht mehr viel mit dem von uns vorgesehenen Code zu tun hat …
Zusammenfassung und Ausblick
Dieser Artikel zeigt, wie Du E-Mails per VBA erstellen und versenden kannst. Dabei stellen wir die wichtigsten Eigenschaften vor.
Es gibt noch viel mehr, was wir in Zusammenhang mit dem Versenden von E-Mails besprechen könnten – zum Beispiel kann man auch die Absenderadresse per VBA einstellen. Das ist allerdings nicht mit einem einfachen Einstellen einer Eigenschaft wie From getan, daher kümmern wir uns in einem späteren Artikel darum.