Outlook-E-Mails importieren

über die Automationsschnittstelle von Outlook erhalten Sie Zugriff erhalten Sie Zugriff auf fast alle Aspekte der Anwendung. Das Versenden von E-Mails über das Outlook-Objektmodell aus Access heraus etwa wurde bereits in früheren Beiträgen dargestellt. Hier geht es nun um das Auslesen von E-Mails und deren Import in die Tabellen einer Datenbank. Ein einfaches Formular, welches die Mails zur Anzeige bringt, fehlt ebenfalls nicht.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1611_OutlookMails.accdb

Die Schnittstelle zu Outlook

Für den Zugriff auf Outlook benötigen Sie einen zusätzlichen Verweis im VBA-Projekt Ihrer Datenbank. Sie markieren im Verweise-Dialog des Menüs Extras den folgenden Eintrag: Microsoft Outlook xx.0 Object Library. Das xx ist die Versionsnummer Ihres Office-Pakets, welche bei Office 2010 etwa 14 lautet. Im Objektkatalog finden Sie anschließend das Objektmodell unter der Rubrik Outlook, in dem die Klasse Application den Ausgangspunkt für alle weiteren Aktionen darstellt.

Vor die Automation, also die Fernsteuerung, von Outlook hat Microsoft allerdings einen Riegel geschoben, da es hier um sicherheitsrelevante Daten gehen kann. In früheren Office-Versionen erschien beim automatisierten Zugriff grundsätzlich der sogenannte Security Guard. Das ist ein kleiner Dialog, der anzeigt, wenn offenbar Zugriff auf die Elemente von Outlook erhalten werden soll. Dies ist zu bestätigen, weil sonst die Schnittstelle erst gar nicht freigeschaltet wird. Außerdem ist dieser Zugriff zeitlich eingeschränkt.

In den neueren Versionen wurde dieses Verhalten geändert. Der Dialog erscheint nur dann, wenn kein funktionstüchtiges Antiviren-Programm installiert ist. Die Existenz eines solchen scheint ausreichend zu sein.

Wie die Seite für den Programmgesteuerten Zugriff im Sicherheitscenter der Optionen von Outlook zeigt (Bild 1), sind sämtliche Auswahlmöglichkeiten deaktiviert, wenn Windows ein akzeptiertes Antiviren-Programm vorfindet. In diesem Fall, von dem wir auch ausgehen, brauchen Sie sich um weiter nicht zu kümmern.

Die Sicherheitseinstellungen von Outlook beim Zugriff über Automation

Bild 1: Die Sicherheitseinstellungen von Outlook beim Zugriff über Automation

Outlook-Application

Alle Elemente von Outlook erreichen Sie über dessen Application-Objekt. Sie erzeugen eine neue Instanz des Objekts, das die Outlook-Anwendung wiederspiegelt, am besten über diese Funktion:

Dim objOL As Outlook.Application
Set objOL = CreateObject( _
              "Outlook.Application")

Dabei spielt es keine Rolle, ob Outlook bereits geöffnet ist. Denn Outlook lässt ja auch manuell keine mehrfachen Anwendungsinstanzen zu. CreateObject führt damit bei bereits geöffnetem Outlook zum gleichen Resultat, wie GetObject.

über die Variable objOL können Sie sich nun daran machen, alle Aspekte der Anwendung zu inspizieren. Möglicherweise benötigen SIe die Variable auch in anderen Prozeduren, und dann macht es Sinn, für sie eine Hilfsfunktion zu erstellen, wie in Listing 1. Auf erneute Instanziierungen der Objektvariablen in Ihren Routinen können Sie nun verzichten, indem Sie einfach die Funktion OLApp abrufen, die ihrerseits auf die im Modulkopf definierte Variable m_OL zugreift.

Public m_OL As Outlook.Application
Function OLApp() As Outlook.Application
     If m_OL Is Nothing Then Set m_OL = CreateObject("Outlook.Application")
     Set OLApp = m_OL
End Function

Listing 1: Genereller Zugriff auf eine Outlook-Instanz über die Hilfsfunktion OLApp

War Outlook noch nicht offen, so startet die Routine eine neue Instanz der Anwendung. Davon bekommen Sie zunächst allerdings nichts mit, denn die Visible-Eigenschaft von Application steht auf False. Lediglich das Outlook-Symbol im Infobereich der Taskleiste weist Sie auf den Start hin.

Nun möchten Sie im Prinzip nicht die Anwendung fernsteuern, sondern E-Mails auslesen. Dazu begeben Sie sich eine Ebene tiefer auf die MAPI-Umgebung, welche für den E-Mail-Verkehr zuständig ist:

Dim objNS As Outlook.NameSpace
Set objNS = OLApp.GetNamespace("MAPI")

Dieser Namespace erlaubt nun die Navigation durch die Ordner und deren Inhalte von Outlook.

Ordner und Unterordner

Wie der Windows-Explorer auch, gestattet Outlook die Einrichtung von beliebig verschachtelten Ordnern und Unterordnern. Um die Analogie weiter zu treiben: Gibt es unter Windows verschiedene Laufwerke, so kann es unter Outlook auch mehrere PST-Dateien geben, die in die Anwendung eingeklinkt wurden und die dann jeweils die oberste Ebene der Ordnerstruktur einnehmen. Unterhalb dieser finden die eigentlichen Verzeichnisse ihren Platz.

Der Zugriff auf die Ordner geschieht über die Folders-Auflistung des Namespace MAPI. Sie kann komfortabel in einer For-Each-Schleife enumeriert werden:

Dim objFolder As Outlook.Folder
For Each objFolder in objNS.Folders
     Debug.Print objFolder.Name
Next objFolder

Als Ergebnis erhalten Sie hier einen Liste der verwendeten PST-Dateien über deren Ordnernamen.

Jeder Folder enthält seinerseits eine Folders-Auflistung für die möglichen Unterordner:

For Each objFolder in objNS.Folders
    Debug.Print objFolder.Name, _
                objFolder.Folders.Count
Next objFolder

Hier wir zusätzlich zum Namen auch die Anzahl an Unterordnern ausgegeben, die die PST-Dateien aufweisen.

Datenmodell

Bevor es an den weiteren programmatischen Zugriff auf die Outlook-Objekte geht, machen wir uns Gedanken über die Tabellenstruktur, in welche die Outlook-Ordner und die E-Mails importiert werden sollen. Am einfachsten ist das anhand des Beziehungsfensters der Beispieldatenbank (siehe Bild 3) erklärt.

Das Datenmodell der Beispieldatenbank enthält nur drei verknüpfte Tabellen

Bild 2: Das Datenmodell der Beispieldatenbank enthält nur drei verknüpfte Tabellen

Die Tabelle tblStores nimmt Informationen zu den PST-Dateien auf. Es macht Sinn, die Hauptordner dieser Dateien in eine eigene Tabelle zu speichern, um diese von den eigentlichen Verzeichnisstrukturen abzugrenzen. Neben dem Primärschlüssel ID (Autowert) steht in FolderName der Name der PST-Datei, der häufig etwa Standard lautet. File speichert den physischen Dateipfad zur PST-Datei, während Path den logischen Verzeichnispfad innerhalb Outlook wiederspiegelt. Bild 2 zeigt einige Beispiele. EntryID ist ein Zeichenausdruck, der den Store, ähnlich wie ein Schlüssel, eindeutig in Outlook kennzeichnet. Auf den ersten Blick sieht diese ID ähnlich aus, wie eine GUID, ist jedoch 48 Zeichen lang. Anhand dieser EntryIDs kann ein bestimmtes Element in Outlook später immer wieder gefunden werden, auch wenn es verschoben wird. Die überschaubare Routine GetStorageFolders in Listing 2 zeigt, wie die Tabelle gefüllt wird.

Die Tabelle tblStores speichert diverse Informationen zu den PST-Dateien, die Outlook verwendet

Bild 3: Die Tabelle tblStores speichert diverse Informationen zu den PST-Dateien, die Outlook verwendet

Zunächst werden über die Execute-Anweisung alle Datensätze aus der Tabelle gelöscht. Da im Datenmodell für die verknüpfte Tabelle tblMailFolders, die die zu den PST-Dateien gehörigen Ordner enthält, referenziell Löschweitergabe eingestellt ist, werden automatisch auch aus dieser alle Daten entfernt. Dasselbe gilt übrigens auch für den Inhalt der weiter verknüpften Tabelle tblMails, die die E-Mail-Informationen speichert.

Dann werden alle Hauptordner das Namespace MAPI in einer For-Each-Schleife durchlaufen. Der Schleifenzähler oFld ist ein Objekt des Typs Outlook.Folder.

Da er im Folgenden mehrmals benötigt wird, ist auf ihn ein With-Block gesetzt. Wichtig ist die If-Bedingung, welche abfragt, ob es sich beim Ordnertyp um einen E-Mail-Container handelt.

Das ist in der Regel dann der Fall, wenn seine Eigenschaft DefaultItemType den Wert olMailItem aufweist. Allerdings garantiert das noch nicht, dass nicht auch andere Elemente in ihm landen könnten – die Ordner sind im Prinzip recht unspezifisch. Trifft die Bedingung zu, so wird ein neuer Datensatz über das Recordset rs in der Tabelle tblStores angelegt.

Der Outlook-Pfad ergibt sich aus der Eigenschaft FolderPath. Auf den Dateipfad kann indessen nur indirekt zugegriffen werden. Das Eigenschaftsobjekt Store des Folders hat die Methode FilePath, die erst die PST-Datei hergibt. Die Tabelle speichert also im Wesentlichen direkt Eigenschaften des Folder-Objekts. Die zweite Tabelle im Modell, tblMailFolders, verweist über das Fremdschlüsselfeld IDStore auf einen Datensatz in der PST-Tabelle tblStores. In der Tabelle werden in flacher Hierarchie sämtliche vorkommenden Outlook-Ordner aufgelistet. Bild 4 zeigt, die das funktioniert.

Die Tabelle tblMailFolders speichert alle Outlook-Ordner aller verwendeten PST-Dateien in rekursiver Anordnung

Bild 4: Die Tabelle tblMailFolders speichert alle Outlook-Ordner aller verwendeten PST-Dateien in rekursiver Anordnung

Im Feld Folder steht jeweils der Name des Ordners, in Path dessen Outlook-Pfad. Darin gleichen diese Informationen denen der Tabelle tblStores. Auch die EntryID zur eindeutigen Identifizierung des Ordners fehlt hier nicht. Zusätzlich gibt es nun aber eine Spalte ParentID, die die Datensätze rekursive voneinander abhängig macht.

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

Schreibe einen Kommentar