Outlook-Mails nach Empfang archivieren

In der Beitragsreihe “Outlook-Mails in Access archivieren” haben wir gezeigt, wie Sie die E-Mails aus kompletten und auch untergeordneten Outlook-Ordnern in eine Access-Datenbank importieren. Das ist die Lösung für den Start der Archivierung. Interessant wird es erst, wenn Sie diese Daten direkt nach dem Eingang in Outlook archivieren. Der vorliegende Beitrag zeigt, wie Sie Outlook so erweitern, dass jede in vorgegebenen Ordnern eingehenende E-Mail direkt in unsere Access-Mail-Archiv weitergeleitet wird.

Um das vorgegebene Ziel zu erreichen, sind einige änderungen am VBA-Projekt von Outlook erforderlich. Sprich: Wir verwenden in diesem Beitrag Access nur zur Bereitstellung der Datenbank, in die wir die Outlook-Mails exportieren möchten. Diese Datenbank haben wir in der Beitragsreihe Outlook-Mails in Access archivieren (www.access-im-unternehmen.de/985, 990 und 997) ausführlich vorgestellt.

Von dort benötigen wir drei Tabellen (siehe auch Bild 1):

Tabellen der Access-Seite der Lösung

Bild 1: Tabellen der Access-Seite der Lösung

  • tblOptionen: Enthält die vom Benutzer definierten Outlook-Ordner, die beim Archivieren von E-Mails berücksichtigt werden sollen, und gibt beispielsweise den Ordnerpfad und die Einbeziehung von Unterordnern an.
  • tblMailItems: Ziel des Exports. Hier werden die Metadaten der E-Mails gespeichert. Die eigentlichen Mails, also die .msg-Dateien, landen dort in einem eigenen Anlagefeld oder aber im Dateisystem.
  • tblAnlagen: Speichert, sofern so konfiguriert, die Anlagen der E-Mails. Alternativ landen diese in der Verzeichnisstruktur.

Outlook vorbereiten

Damit Sie von Outlook aus auf die Elemente der Access-Objektbibliothek sowie auf die DAO-Bibliothek zugreifen können (in diesem Fall die neuere Version der DAO-Bibliothek, nämlich die Microsoft Office x.0 Access Database Engine Object Library), legen Sie im VBA-Projekt von Outlook zunächst zwei Verweise an. Der Verweise-Dialog (VBA-Editor, Extras|Verweise) sollte danach etwa wie in Bild 2 aussehen.

Verweise für den Export nach Access

Bild 2: Verweise für den Export nach Access

Den VBA-Editor öffnen Sie unter Outlook übrigens über die Tastenkombination Alt + F11. Die Kombination Strg + G funktioniert im Gegensatz zu Access nicht.

Der VBA-Editor präsentiert, sofern der Projekt-Explorer sichtbar ist, unter dem Ordner Microsoft Outlook Objekte die Klasse ThisOutlookSession. In dieser Klasse landen die ersten Codezeilen dieser Lösung. Die erste lautet wie folgt und deklariert die Konstante zum Speichern des Verzeichnisses für die Ziel-Datenbank. Dazu ermitteln Sie zunäcsht den Speicherort der Datenbank, in der Sie die eingehenden E-Mails speichern wollen – zum Beispiel c:\Outlook\Outlook_III.accdb. Legen Sie dann die folgende Zeile im Kopf der Klasse an:

Const cStrExportdatenbank As String =  "C:\Outlook\Outlook_III.accdb"

Außerdem deklarieren wir hier noch eine Collection, deren Sinn wir weiter unten erläutern werden:

Dim colFolders As Collection

Neue Mails abfangen

Bevor wir weitermachen, benötigen wir ein paar theoretische Grundlagen. Wenn eine Mail abgerufen wird, landet diese in einem der Mail-Ordner in Outlook. Welcher das ist, hängt von den festgelegten Regeln ab. Normalerweise ist der Ordner Posteingang das Ziel einer neu eingetroffenen E-Mail.

Sie können jedoch festlegen, dass E-Mails mit bestimmten Eigenschaften direkt in einem anderen Ordner landen – beispielsweise solche mit bestimmten E-Mail-Adressen oder solche, die einen bestimmten Text im Betreff enthalten.

Um dies festzulegen, benötigen Sie eine sogenannte Regel. Zum Definieren dieser Regel suchen Sie sich am besten eine E-Mail, welche die betroffene Eigenschaft aufweist. Klicken Sie mit der rechten Maustaste auf die E-Mail und wählen Sie den Kontextmenü-Eintrag Regeln|Regel erstellen aus. Nun erscheint der Dialog aus Bild 3. Dieser zeigt bereits einige möglichen Ausdrücke zum Formulieren der Regel an. In diesem Fall wollen wir, dass alle E-Mails, die wie die aktuelle das Schlüsselwort Outlooktest im Betreff enthalten, von der Regel betroffen sind.

Anlegen einer neuen Regel für den Posteingang

Bild 3: Anlegen einer neuen Regel für den Posteingang

Diese Mails sollen in einen bestimmten Outlook-Ordner verschoben werden, daher aktivieren Sie unten die Optioni Element in Ordner verschieben. Nach einem Klick auf Ordner auswählen erscheint nun der Dialog aus Bild 4, wo Sie den Zielordner festlegen. Ist diese Aufgabe erledigt, können Sie sich bereits eine Test-E-Mail mit genau diesem Betreff zusenden. Sie wird dann beim Abrufen wie erwartet in den angegebenen Ordner verschoben.

Auswählen des Zielordners

Bild 4: Auswählen des Zielordners

Maileingang erkennen

Nun landet eine Mail also in einem von mehreren Ordnern, die wir in der Datenbank in der Tabelle tblOptionen festgelegt haben. All diese Ordner wollen wir nun ständig auf den Eingang von E-Mails überprüfen.

Dies gelingt nur, wenn wir herausfinden, welches Ereignis beim Maileingang ausgelöst wird, und dieses für die entsprechenden Elemente implementieren. Das Ganze muss natürlich dynamisch ausgelegt werden, da ja zuvor noch nicht feststeht, welche Ordner der Benutzer überhaupt für die überprüfung vorgesehen hat.

Um es vorwegzunehmen: Es ist nicht das Folder-Objekt, das beim Maileingang ein Ereignis auslöst, sondern das Items-Objekt, also das Objekt, das die in einem Folder enthaltenen Objekte auflistet.

Andererseits können Sie Ereignisprozeduren für Objekte wie etwa einen Mailordner oder eine Liste wie Items nur innerhalb von Klassenprozeduren implementieren. Also wollen wir zu einer Technik greifen, die wir bereits in einigen anderen Beiträgen umgesetzt haben. Wir werden eine Klasse erstellen, welche einen Verweis auf ein Items-Objekt aufnehmen kann. Diese implementiert genau für dieses Items-Objekt, nennen wir es obj-Items, das Ereignis ItemAdd. Dieses Ereignis liefert ein Item-Objekt, das in unserem Fall in der Regel den Typ MailItem aufweisen sollte. Dies ist schon der Verweis auf die E-Mail, der wir nun die für das Archivieren in der Datenbank benötigten Daten entnehmen können.

Nun müssen wir nur noch ein oder mehrere dieser Klassen instanzieren, und zwar eine für jeden Ordner, der in der Tabelle tblOptionen der Archivdatenbank für die E-Mails enthalten ist. Diese sollen nach dem Erstellen nicht im Nirvana verschwinden, daher verwenden wir ein Collection-Objekt, um diese Objekte zu speichern – eben jenes, das wir weiter oben bereits deklariert haben.

Ordner-Klassen instanzieren

Die Klassen mit den zu überwachenden Ordnern sollen direkt beim Start von Outlook erstellt werden. Dazu legen Sie eine Prozedur namens Application_Startup in der Klasse ThisOutlookSession an (s. Listing 1). Diese wird gleich beim öffnen von Outlook ausgeführt – vorausgesetzt, Sie haben die Ausführung von Makros nicht aus Sicherheitsgründen deaktiviert.

Public Sub Application_Startup()
     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Dim objFolder As Outlook.Folder
     Dim objFolderArchiv As clsFolderArchiv
     Set db = DBEngine.OpenDatabase(cStrExportdatenbank)
     Set rst = db.OpenRecordset("SELECT * FROM tblOptionen", dbOpenDynaset)
     Set colFolders = New Collection
     Do While Not rst.EOF
         Set objFolderArchiv = New clsFolderArchiv
         With objFolderArchiv
             Set objFolder = GetFolderByPath(rst!Verzeichnis)
             If objFolder Is Nothing Then
                 MsgBox "Der in der Export-Datenbank ''" & cStrExportdatenbank & "'' angegebene Outlook-Ordner ''" _
                     & rst!Verzeichnis & "'' ist nicht in Outlook vorhanden."
                 Exit Sub
             End If
             Set .Folder = objFolder
             .AnlagenSpeichern = rst!AnlagenSpeichern
             Set .Database = db
             .NeuEinlesen = rst!NeuEinlesen
             .Groesse = Nz(rst!Groesse)
         End With
         colFolders.Add objFolderArchiv
         If rst!Rekursiv Then
             UnterordnerInstanzieren objFolder, db, Nz(rst!Groesse), rst!NeuEinlesen, rst!AnlagenSpeichern, colFolders
         End If
         rst.MoveNext
     Loop
End Sub

Listing 1: Diese Prozedur wird beim Start von Outlook automatisch ausgelöst.

Die Prozedur erstellt zunächst eine Referenz auf das Database-Objekt der Zieldatenbank zum Exportieren der E-Mails. Wir benötigen zwei besondere Variablen: objFolderArchiv hat den Typ clsFolderArchiv. Dies ist die Klasse, die wir gleich im Anschluss für jeden zu beobachtenden Mailordner erstellen und die das mit der anderen Variablen objFolder referenzierte Folder-Objekt entgegennehmen wird.

Um in Access auf die aktuell geöffnete Datenbank zuzugreifen, würden wir die Funktion CurrentDb verwenden, aber von Outlook aus ist ein anderer Befehl nötig, nämlich die OpenDatabase-Methode des DBEngine-Objekts. Dieser übergeben Sie den Namen der gewünschten Datenbankdatei, den wir ja bereits für die Konstante cStrExportdatenbank definiert haben.

Im Anschluss öffnet die Prozedur ein Recordset auf Basis der Tabelle tblOptionen, die ja die Outlook-Ordner enthält, deren E-Mails archiviert werden sollen. Die Collection colFolders müssen wir vor dem Hinzufügen des ersten Objekts instanzieren, was wir mit der New-Anweisung erledigen.

Dann durchläuft die Prozedur in einer Do While-Schleife alle Datensätze der Tabelle tblOptionen. In der Schleife erstellt sie jeweils ein neues Objekt auf Basis der Klasse clsFolderArchiv. Diese stellt, wie weiter unten beschrieben, einige Eigenschaften bereit.

Diese füllt die Prozedur mit den folgenden Anweisungen. Zuvor ermittelt sie jedoch noch das Outlook-Folder-Objekt für den Outlook-Ordner aus dem Feld Verzeichnis des aktuellen Datensatzes. Dazu verwendet sie die Hilfsfunktion GetFolderByPath, die Sie im Modul mdl-Outlook finden.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar