Outlook: E-Mails nach Eingang verarbeiten

Die verschiedenen Klassen von Outlook bieten eine ganze Reihe von Ereignissen an. Diese werden durch unterschiedliche Aktionen ausgelöst. Eine dieser Aktionen ist das Eintreffen einer oder mehrerer neuer E-Mails. Dieses Ereignis mit einer geeigneten Ereignisprozedur abzufangen ist ein sinnvolles Beispiel für die Beschreibung der Programmierung von Ereignissen unter Outlook. Mit E-Mails kann man nach dem Eingang eine Menge anstellen – diese löschen, in einen anderen Ordner verschieben, die Message-Datei im Dateisystem sichern oder auch die Inhalte auslesen, um diese etwa in eine Datenbank zu schreiben. In diesem Artikel erläutern wir erst einmal allgemein, wie wir überhaupt mit VBA-Code auf den Eingang einer E-Mail reagieren können.

Outlook bietet alles, was man braucht – E-Mails werden abgerufen und landen im Posteingangs-Ordner. Man kann verschiedene Regeln aufstellen, nach denen die eingehenden E-Mails automatisch nach den gewünschten Kriterien in verschiedene Ordner verschoben werden, und wenn es auch der Ordner Gelöschte Objekte oder der Spam-Ordner ist. Und natürlich können wir die E-Mails auch manuell in andere Ordner verschieben oder auch Aufgaben auf Basis einer E-Mail erstellen. Noch schöner wäre es allerdings, wenn wir die gewünschten Schritte individuell programmieren könnten.

Welches Objekt und welches Ereignis?

Dazu müssen wir erst einmal wissen, wie wir eine Ereignisprozedur programmieren, mit der wir auf den Eingang einer E-Mail reagieren können. Der erste Schritt ist dabei, herauszufinden, welches Ereignis welcher Klasse wir überhaupt nutzen können. In weiteren Artikeln zur Programmierung von Outlook per VBA haben wir bereits gesehen, dass es unterschiedliche Klassen gibt, mit denen wir die verschiedenen Elemente der Benutzeroberfläche referenzieren können. Mit dem Application-Objekt greifen wir auf die Anwendung selbst zu, mit dem Explorer-Objekt auf die verschiedenen Ansichten von Outlook und mit dem Inspector-Objekt auf von Outlook aus geöffnete Fenster beispielsweise zur Anzeige einer E-Mail. Außerdem gibt es noch Klassen, mit denen wir die einzelnen Ordner oder die darin enthaltenen Elemente wie E-Mails, Kontakte, Termine oder Aufgaben referenzieren können.

Wenn wir neu im Thema sind und nicht genau wissen, welche Klasse welche Ereignisse bietet, hilft uns ein Blick in den Objektkatalog. In unserem Beispiel, wo wir auf den Eingang einer E-Mail reagieren wollen, gibt es unterschiedliche Ideen, welche Klasse ein passendes Ereignis bietet. Vielleicht gibt es ein Ereignis, das ausgelöst wird, wenn einem Ordner ein neues Element hinzufügt wird? Oder wird ein solches Ereignis von einer anderen Klasse zur Verfügung gestellt?

Haben wir Outlook geöffnet, starten wir mit Alt + F11 den VBA-Editor. Hier zeigen wir mit F2 den Objektkatalog an. Oben im Fenster wählen wir statt dem Eintrag Alle Bibliotheken die Bibliothek Outlook aus, direkt darunter geben wir als Suchbegriff Mail ein.

In der Liste der Suchergebnisse suchen wir nun nach Elementen, die durch ein Blitz-Icon markiert werden und stoßen schnell auf die beiden Ereignisse NewMail und NewMailEx (siehe Bild 1). Klicken wir NewMail an, sehen wir die Beschreibung dieses Ereignisses im unteren Bereich. Außerdem sehen wir, dass es sich hierbei um ein Ereignis der Klasse Outlook.Application handelt.

Ermitteln von Ereignissen für E-Mails

Bild 1: Ermitteln von Ereignissen für E-Mails

Das Gleiche gilt für das Ereignis NewMailEx. Klicken wir dieses im Objektkatalog an, finden wir schnell heraus, dass es im Gegensatz zum Ereignis NewMail noch einen Parameter namens EntryIDCollection mit dem Datentyp String liefert (siehe Bild 2).

Das Ereignis NewMailEx im Objektkatalog

Bild 2: Das Ereignis NewMailEx im Objektkatalog

Neben diesen beiden offensichtlichen Möglichkeiten gibt es noch ein weiteres Ereignis, das durch das Empfangen einer E-Mail ausgelöst wird. Dabei handelt es sich um das Ereignis ItemAdd der Items-Auflistung eines Folder-Objekts, das ausgelöst wird, wenn einem Ordner ein Element hinzugefügt wird. Um dieses zu nutzen, um auf den Eingang neuer E-Mails zu reagieren, müssen wir den richtigen Ordner damit ausstatten, in der Regel den Ordner Posteingang. Wie das gelingt, zeigen wir gegen Ende des Artikels.

Ereignisse implementieren

Um ein Ereignis in Form einer Ereignisprozedur zu implementieren, benötigen wir zunächst ein Klassenmodul. Nur in einem solchen können wir die Klasse, welche das Ereignis bereitstellt, mit dem Schlüsselwort WithEvents deklarieren, und ohne dieses Schlüsselwort können wir die Ereignisprozedur nicht implementieren.

Zum Glück haben wir mit dem Klassenmodul ThisOutlookSession immer ein Klassenmodul zur Hand, welches wir noch nicht einmal initialisieren müssen, dass es standardmäßig bereits initialisiert ist. Noch besser: Die Klasse Application steht hier immer bereit, sodass wir diese noch nicht einmal deklarieren müssen. Um ein Ereignis für Outlook.Application zu implementieren, müssen wir nur zwei Schritte erledigen:

  • Wir wählen im linken Kombinationsfeld des Codefensters des Moduls ThisOutlookSession den Eintrag Application aus. Dies legt automatisch das Standardereignis für diese Klasse an, in diesem Fall Application_ItemSend.
  • Dann wählen wir im rechten Kombinationsfeld das Ereignis aus, das wir eigentlich implementieren wollen, nämlich zunächst einmal NewMail (siehe Bild 3)
  • Das Ereignis NewMail implementieren

    Bild 3: Das Ereignis NewMail implementieren

Anschließend entfernen wir zunächst die Prozedur Application_ItemSend wieder. Außerdem wählen wir im rechten Kombinationsfeld noch den Eintrag NewMailEx aus, um auch die zweite für uns interessante Ereignisprozedur hinzuzufügen.

Prüfen, ob die Ereignisse ausgelöst werden

Jetzt wollen wir herausfinden, ob die Ereignisprozeduren automatisch aufgerufen werden, wenn wir E-Mails mit Outlook abrufen. Dazu fügen wir den Prozeduren einfach jeweils eine Anweisung hinzu, sodass diese anschließend wie folgt aussehen:

Private Sub Application_NewMail()
     Debug.Print "NewMail"
End Sub
Private Sub Application_NewMailEx(_
         ByVal EntryIDCollection As String)
     Debug.Print "NewMailEx", EntryIDCollection
End Sub

Rufen wir nun E-Mails ab, erhalten wir im Direktbereich beispielsweise beim Abrufen von zwei E-Mails eine Ausgabe wie in Bild 4.

Ausgabe im Direktbereich bei Maileingang

Bild 4: Ausgabe im Direktbereich bei Maileingang

Das Ereignis NewMail liefert keinen Parameter, somit können wir damit nur herausfinden, ob eine E-Mail abgerufen wurde und nicht, welche.

Das Ereignis NewMailEx liefert immerhin einen Parameter namens EntryIDCollection. Dieser enthielt für frühere Versionen der Bibliothek Microsoft Outlook x.0 Object Library eine Komma-separierte Liste der EntryIDs aller eingegangenen E-Mails. In der aktuellen Version wird das Ereignis für jede E-Mail einmal ausgelesen und liefert dementsprechend immer nur eine EntryID. Eine EntryID ist ein eindeutiger Bezeichner für die Outlook-Elemente, mit dem wir auf das jeweilige Element zugreifen können.

Zugriff auf die eingegangenen E-Mails

Nun schauen wir uns an, wie wir die mit der NewMailEx-Ereignisprozedur eingelesenen EntryID-Werte nutzen können, um auf die eingegangenen E-Mails zuzugreifen. Wir programmieren die Lösung so, dass sie auch mit früheren Versionen der Outlook-VBA-Bibliothek kompatibel ist. Wir gehen also davon aus, dass der Parameter EntryIDCollection auch mehrere, durch Kommata getrennte Einträge enthalten kann.

Dazu erweitern wir die Prozedur wie in Listing 1. Wir deklarieren ein String-Array, um die mit EntryIDCollection gelieferten EntryIDs aufzunehmen. Außerdem nutzen wir zum Referenzieren der Objekte zunächst die Variable objItem, die wir als Object deklarieren, und nur wenn es sich bei dem eingegangenen Element um eine E-Mail handelt, weisen wir es der Variablen objMailItem des Typs MailItem zu.

Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
     Dim strEntryIDs() As String
     Dim objItem As Object
     Dim objMailItem As MailItem
     Dim i As Long
     strEntryIDs = Split(EntryIDCollection, ",")
     For i = LBound(strEntryIDs) To UBound(strEntryIDs)
         Set objItem = Application.Session.GetItemFromID(strEntryIDs(i))
         Select Case objItem.Class
             Case olMail
                 Set objMailItem = objItem
                 With objMailItem
                     Debug.Print .Subject, .ReceivedTime
                 End With
         End Select
     Next i
End Sub

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Visual Basic Entwickler:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 200 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar