Outlook: E-Mail-Anlagen verarbeiten

Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!

E-Mails können unterschiedlichste Dateien als Anlagen enthalten. Von der Rechnung über Beispieldatenbanken, Word-Dokumente, PDFs oder Excel-Datenbanken. In manchen Fällen möchte man diese automatisiert weiterverarbeiten – beispielsweise, um Rechnungsdokumente einzulesen oder auch um die Dateien einfach nur an einer Stelle im Dateisystem zu speichern, die gesichert wird. In diesem Artikel zeigen wir, wie wir auf die Anlagen von Outlook-E-Mails zugreifen können. Dazu nutzen wir die Outlook-Bibliothek und greifen per VBA auf die Attachments-Auflistung des MailItem-Objekts zu.

E-Mails und Anlagen

Wie wir E-Mails erstellen und ihnen Anlagen hinzufügen, haben wir bereits in einem früheren Artikel beschrieben. Dieser heißt E-Mails per VBA erstellen mit CreateItem (www.vbentwickler.de/309). Im vorliegenden Artikel schauen wir uns nun an, wie wir den umgekehrten Weg gehen – also Anlagen aus E-Mails auslesen und weiterverarbeiten.

Um welche E-Mails geht es?

Die erste Frage, die man sich stellen muss, ist die der betroffenen E-Mails. Es gibt verschiedene Möglichkeiten, zum Beispiel:

  • nur eine bestimmte E-Mail
  • alle E-Mails eines Ordners
  • alle E-Mails eines bestimmten Empfängers
  • alle E-Mails aus allen Ordnern

Was soll mit den Anlagen geschehen?

Wenn wir Anlagen von E-Mails weiterverarbeiten wollen, geschieht das meist im Kontext einer bestimmten Anwendung. Also beispielsweise in einer Access-Anwendung wie etwa einer Kundenverwaltung.

In dieser will man vielleicht alle E-Mails, die in Zusammenhang mit der E-Mail-Adresse des Kunden stehen, in einer Tabelle der Datenbank speichern und im Detailformular zur Ansicht des Kunden anzeigen. Ein schönes Feature wäre, wenn man per Doppelklick auf eine solche E-Mail direkt die entsprechende E-Mail im Mailfenster öffnen könnte.

Vielleicht hat man auch einen Ordner, in den man alle E-Mails verschiebt, die eine Rechnung enthalten, die man für die Buchhaltung benötigt. Man könnte dann alle E-Mails dieses Ordners durchlaufen und die Rechnungen in Ordner verschieben, die nach dem Empfangsdatum der E-Mail benannt sind – zum Beispiel 2022/12 oder 2023/01.

Man könnte die Anlagen auch in Ordnern speichern, die als Name die E-Mail-Adresse des Absenders enthalten. So kann man schnell die Anlagen durchsuchen, die von einem bestimmten Absender geschickt wurden.

Wann sollen die Anlagen verarbeitet werden?

Auch hier gibt es verschiedene Möglichkeiten:

  • Manueller Abruf. Hier würde man eine Prozedur aufrufen, welche die gewünschten E-Mails oder auch vollständige Ordner durchläuft und alle enthaltenen Anlagen auf die gewünschte Art speichert. Dieser Aufruf würde vermutlich im VBA-Projekt der Anwendung untergebracht werden, mit der die Anlagen weiterverarbeitet werden.
  • Automatischer Abruf: Man könnte auch Ereignisprozeduren im Outlook-VBA-Projekt definieren, mit denen man auf das Eintreffen neuer E-Mails reagiert – oder auch auf das Verschieben von E-Mails in einen bestimmten, für das Verarbeiten von Anlagen vorgesehenen Ordner.

In diesem Artikel wollen wir jedoch erst einmal die grundlegenden Techniken für das Speichern von Anlagen betrachten. Dazu müssen wir wissen, wie wir die entsprechenden E-Mails referenzieren und dann die passenden Methoden der Attachments-Auflistung nutzen.

Alle Anlagen aus dem Posteingang speichern

Der Einfachheit halber beginnen wir mit den E-Mails, die sich aktuell im Posteingang befinden. Den Ordner für den Posteingang können wir, wie wir auch im Artikel Outlook: Ordner per VBA im Griff (www.vbentwickler.de/340) beschrieben haben, relativ einfach referenzieren. Wir verwenden nachfolgend die folgende Funktion, um den Ordner Posteingang zu referenzieren. Da diese das Application-Objekt von Outlook explizit deklariert und referenziert, können wir diesen Code auch außerhalb von Outlook nutzen – also beispielsweise in Access, Excel oder Word:

Public Function GetInbox() As Outlook.Folder
     Dim objOutlook As Outlook.Application
     Dim objMAPI As Outlook.NameSpace
     Set objOutlook = New Outlook.Application
     Set objMAPI = objOutlook.GetNamespace("MAPI")
     Set GetInbox = objMAPI.GetDefaultFolder(olFolderInbox)
End Function

Damit können wir leicht auf den Posteingangsordner zugreifen und beispielsweise seinen Namen ausgeben:

Debug.Print GetInbox.Name
Posteingang

E-Mails mit Anlagen im Posteingang durchlaufen

Die nächste Prozedur erlaubt uns, alle E-Mails im Posteingang zu durchlaufen und nur die Betreffzeile derjenigen E-Mails auszugeben, die mindestens eine Anlage enthalten. Dazu durchlaufen wir erst einmal alle Elemente der Items-Auflistung in einer For Each-Schleife und weisen das aktuelle Objekt der Variablen objItem zu. Diese hat den Datentyp Object. Warum das und nicht direkt MailItem? Wir wollen doch E-Mails untersuchen? Der Grund ist, dass der Posteingang durchaus auch einmal Termine oder andere Objekte enthalten kann. Wenn wir diese dann mit einer MailItem-Objektvariablen referenzieren, lösen wir einen Fehler aus. Also prüfen wir erst einmal anhand der Class-Eigenschaft von objItem, ob es sich um ein MailItem-Objekt handelt. Diese Eigenschaft liefert dann den Wert olMail. Ist das der Fall, weisen wir das Objekt aus objItem der Objektvariablen objMailItem zu. Warum überhaupt wechseln? Weil wir mit einem MailItem-Objekt besser IntelliSense nutzen können.

 

Schreibe einen Kommentar