Outlook-Mails in Access archivieren

“Eine neue .pst-Datei ist wie ein neues Leben …” – so fühlt es sich an, wenn man sich von einer Outlook-Installation voller Termine, Mails, Kontakte et cetera trennt und einfach einmal neu beginnt. Allerdings wird man einen Teil der Daten ohnehin übernehmen (die Kontakte), und zumindest die Mails sollte man sicherheitshalber noch eine Weile aufbewahren. Nur wo Wenn Sie die Inhalte von Mails archivieren und für den gelegentlichen Zugriff bereithalten wollen, bietet sich natürlich der Einsatz einer Access-Datenbank an. Dieser Beitrag beleuchtet, wie Sie die Mails archivieren, ein weiterer beschäftigt sich mit der Suche nach und der Wiederherstellung von archivierten E-Mails.

Bevor man seine Outlook.pst in die ewigen Jagdgründe verabschiedet oder die enthaltenen E-Mails löscht, sollte man die Inhalte gegebenenfalls sichern. Was bietet sich da mehr an als eine Access-Datenbank – plus gegebenenfalls eines Ordners, in dem Sie alle Anlagen der E-Mails speichern

Für den Access-Entwickler ist das eine gute Idee, denn damit kann er, ein entsprechendes Datenmodell vo-rausgesetzt, später auch die E-Mails bestimmter Kunden herausfiltern und etwa mit der Kundendatenbank verknüpfen. Voraussetzung hierfür ist allein, dass die Absender und die Empfänger in der Tabelle mit den E-Mail-Daten gespeichert werden.

Neben den Metadaten einer E-Mail wie Absender, Empfänger, Empfangsdatum, Betreff oder Inhalt wollen wir die Anlagen speichern. Außerdem soll vorsichtshalber auch die komplette Mail im Format .msg in einem Attachment-Feld des Datensatzes mit der E-Mail gespeichert werden. Dies stellt sicher, dass wir die E-Mail mit wenigen Zeilen Code erstens öffnen und zweitens in Outlook wiederherstellen können.

Platzproblemen vorbeugen

Wenn Sie neben den E-Mail-Metadaten auch noch die E-Mail selbst im .msg-Format in der Datenbank speichern wollen, ist diese vermutlich schnell genauso groß wie die .pst-Datei. Meine ist aktuell rund drei Gigabyte groß – so viel passt leider nicht in eine Access-Datenbank. Also bauen wir eine Option ein, die es erlaubt, eine Größenbegrenzung für die in der Datenbank zu speichernden Mails anzugeben. Dann werden alle Mails, deren Größe diesen Wert nicht übersteigt, in der Datenbank gespeichert, die übrigen landen in Dateiform in einem Verzeichnis, das sich im gleichen Ordner wie die Datenbank selbst befindet.

Anlagen speichern

Gegebenenfalls möchten Sie auch die Anlagen schnell zugreifbar machen. In diesem Fall speichern Sie auch diese in einem separaten Verzeichnis und tragen nur den Pfad zur jeweiligen Datei in eine weitere Tabelle der Datenbank ein.

Datenmodell

Damit steht das Datenmodell auch schon fest: Wir benötigen zunächst eine Tabelle namens tblMailItems, welche die Metadaten der eingelesenen E-Mails und gegebenenfalls die .msg-Dateien in einem Anlagefeld speichert.

Die zweite Tabelle heißt tblAnlagen. Da jede E-Mail keine, eine oder mehrere Anlagen enthalten kann, können wir deren Speicherort nicht einfach in einem Feld der Tabelle tblMailItems speichern, sondern müssen dafür eine per 1:n-Beziehung verknüpfte Tabelle anlegen. Diese soll tblAnlagen heißen und ist über das Fremdschlüsselfeld MailItemID mit der Tabelle tblMailItems verknüpft.

Schließlich benötigen wir noch eine dritte Tabelle namens tblOptionen, mit der wir die Einstellungen für den Import sichern.

Die Tabelle tblMailItems sieht im Entwurf wie in Bild 1 aus. Die Tabelle nimmt die wesentlichen Informationen der jeweiligen E-Mail auf. Da wir die E-Mail ja entweder in der Tabelle oder aber im Dateisystem noch als .msg-Datei speichern, die wir jederzeit wiederherstellen oder öffnen können, brauchen wir in der Tabelle nur die Daten zu speichern, nach denen wir die E-Mails durchsuchen wollen.

Die Tabelle tblMailItems in der Entwurfsansicht

Bild 1: Die Tabelle tblMailItems in der Entwurfsansicht

Die zweite Tabelle namens tblAnlagen speichert zu jeder E-Mail die Speicherorte für die Anlagen. Die Datensätze werden dabei über das Feld MailItemID mit der Tabelle tblMailItems verknüpft (s. Bild 2).

Die Tabelle tblAnlagen in der Entwurfsansicht

Bild 2: Die Tabelle tblAnlagen in der Entwurfsansicht

Fehlt noch die Tabelle tblOptionen. Diese sieht wie in Bild 3 aus. Die Bedeutung der einzelnen Felder wird gleich im Anschluss bei der Erläuterung des Einlesevorgangs deutlich werden.

Die Tabelle tblOptionen in der Entwurfsansicht

Bild 3: Die Tabelle tblOptionen in der Entwurfsansicht

Formular zur Steuerung des Einlesevorgangs

Das Formular frmMailimport steuert den Einlesevorgang. Das heißt, dass Sie damit die Optionen einstellen und den Vorgang starten können.

Das Formular sieht im Entwurf wie in Bild 4 aus.

Das Formular frmMailImport in der Entwurfsansicht

Bild 4: Das Formular frmMailImport in der Entwurfsansicht

Das Formular ist an die Tabelle tblOptionen gebunden. Das Textfeld txtVerzeichnis liefert den Wert des Feldes Verzeichnis. Diesen Wert können Sie manuell einstellen oder aber Sie verwenden die Schaltfläche mit den drei Punkten, um den dafür vorgesehenen Outlook-Dialog zu öffnen und den Mail-Ordner auszuwählen, dessen E-Mails eingelesen werden sollen.

Die Schaltfläche heißt cmdVerzeichnisWaehlen und ruft die folgende Prozedur auf:

Private Sub cmdVerzeichnisWaehlen_Click()
     Dim objOutlook As Outlook.Application
     Dim objMAPI As Outlook.NameSpace
     Dim objFolder As Outlook.Folder
     Set objOutlook = New Outlook.Application
     Set objMAPI = objOutlook.GetNamespace("MAPI")
     Set objFolder = objMAPI.PickFolder
     If Not objFolder Is Nothing Then
         Me!txtVerzeichnis = objFolder.FolderPath
     End If
End Sub

Dies zeigt den Dialog aus Bild 5 an. Damit wählt der Benutzer den Mail-Ordner aus, der als Basis für den Einlesevorgang dient. Den Pfad zu diesem Ordner ermittelt die Prozedur mit der Eigenschaft FolderPath des Folder-Objekts.

Dialog zum Auswählen des einzulesenden Mail-Ordners

Bild 5: Dialog zum Auswählen des einzulesenden Mail-Ordners

Für das Formular haben wir die Eigenschaften Datensatzmarkierer, Navigationsschaltflächen, Trennlinien und Bildlaufleisten auf den Wert Nein eingestellt.

Außerdem legen Sie für die Eigenschaft Zyklus den Wert Aktueller Datensatz fest. Der Benutzer kann dann nur den ersten Datensatz der Tabelle tblOptionen bearbeiten und nicht zu einem neuen Datensatz wechseln – mehr benötigt er ja auch nicht.

Damit erscheint das ausgewählte Outlook-Mail-Verzeichnis nun wie in Bild 6.

Das Formular frmMailImport in der Formularansicht

Bild 6: Das Formular frmMailImport in der Formularansicht

Die übrigen Einstellungen der Tabelle tblOptionen bildet das Formular wie in der Abbildung ab – also mit lauter Kontrollkästchen sowie einem Textfeld namens txtGroesse für die Eingabe der maximalen Größe, mit der eine E-Mail direkt in der Tabelle gespeichert werden soll.

Einlesevorgang starten

Ein Klick auf die Schaltfläche cmdImportStarten initialisiert den Einlesevorgang. Dies löst die folgende Prozedur aus:

Private Sub cmdImportStarten_Click()
     Dim lngAnzahl As Long
     SysCmd acSysCmdSetStatus, _
         "Einzulesende Mails werden gezählt"
     lngAnzahl = MailsZaehlen(Me!txtVerzeichnis, _
         Me!chkRekursiv)
     Import Me!txtVerzeichnis, lngAnzahl, _
         Me!txtGroesse, Me!chkNeuEinlesen, _
         Me!chkRekursiv, Me!chkVorhandeneLoeschen, _
         Me!chkAnlagenSpeichern
End Sub

Die Prozedur blendet zunächst einen Text in der Statusleiste von Access ein, der darauf hinweist, dass die Anwendung nun die Anzahl der einzulesenden E-Mails liest. Diesen Wert benötigen wir, um in der Statusleiste den Fortschritt abbilden zu können.

Dann startet die Prozedur den Zählvorgang durch den Aufruf der Funktion MailsZaehlen, der sie lediglich den Verweis auf den Outlook-Pfad sowie den Inhalt des Kon-trollkästchens chkRekursiv übergibt.

Einzulesende Mails zählen

Die Prozedur MailsZaehlen ermittelt zunächst mit der Funktion GetFolderByPath das Folder-Objekt von Outlook für den übergebenen Pfad, also beispielsweise \\Outlook\Posteingang. GetFolderByPath ist eine benutzerdefinierte Funktion, die das Folder-Objekt für den angegebenen Pfad zurückliefert (s. Modul mdlImport).

Die Count-Eigenschaft der Items-Auflistung dieses Folder-Objekts liefert die Anzahl der enthaltenen Elemente. Gegebenenfalls befinden sich dort auch Elemente mit einem anderen Typ als MailItem, aber dies sollte die Ausnahme sein und wir zählen diese einfach mit – sonst müssten wir hier noch eine weitere Prüfung einbauen, die Performance kostet.

Sollte der Benutzer im Formular frmMailimport die Option chkRekursiv gesetzt haben, ruft die Funktion eine weitere Funktion namens MailsZaehlenRek auf und übergibt dieser das Folder-Objekt sowie den Long-Wert lngAnzahl als Parameter. Letzterer ist bereits mit der aktuellen Anzahl gefüllt und soll um die Anzahl der Mails in den untergeordneten Verzeichnissen erhöht werden:

Private Function MailsZaehlen(strVerzeichnis As String, _
         bolRekursiv As Boolean) As Long
     Dim objFolder As Outlook.Folder
     Dim lngAnzahl As Long
     Set objFolder = GetFolderByPath(strVerzeichnis)
     lngAnzahl = objFolder.Items.Count
     If bolRekursiv Then
         MailsZaehlenRek objFolder, lngAnzahl
     End If
     MailsZaehlen = lngAnzahl
End Function

Die Funktion MailsZaehlenRek ist eine rekursiv definierte Funktion, die sich selbst aufruft. Dies geschieht so lange, bis keine untergeordneten Verzeichnisse mehr gefunden werden. Die Variable lngAnzahl wird durch alle Aufrufe geschleppt und jeweils um die Anzahl der E-Mails des aktuell in der For Each-Schleife durchlaufenen Folder-Objekts erhöht:

Private Function MailsZaehlenRek(objParent As _
         Outlook.Folder, lngAnzahl As Long)
     Dim objFolder As Outlook.Folder
     For Each objFolder In objParent.Folders
         lngAnzahl = lngAnzahl + objFolder.Items.Count
         MailsZaehlenRek objFolder, lngAnzahl
     Next objFolder
End Function

Auf diese Weise ermittelt die Funktion MailsZaehlen die Gesamtzahl der E-Mails und liefert diese als Funktionswert an die aufrufende Prozedur cmdImportStarten zurück.

Die Import-Routine

Die Prozedur ruft dann die Routine Import auf und übergibt dieser die Werte aller gebundenen Felder des Formulars frmMailimport (s. Listing 1).

Public Sub Import(strVerzeichnis As String, lngAnzahl As Long, lngSize As Long, bolNeuEinlesen As Boolean, _
         bolRekursiv As Boolean, bolVorhandeneLoeschen As Boolean, bolAnlagenSpeichern As Boolean)
     Dim objFolder As Outlook.Folder
     Dim db As DAO.Database
     Dim lngAnzahlEingelesen As Long
     Set objFolder = GetFolderByPath(strVerzeichnis)
     If Not objFolder Is Nothing Then
         Set db = CurrentDb
         If bolVorhandeneLoeschen Then
             SysCmd acSysCmdSetStatus, "Vorhandene Daten werden gelöscht"
             db.Execute "DELETE FROM tblMailItems", dbFailOnError
             SysCmd acSysCmdSetStatus, "Anlagenverzeichnis wird gelöscht"
             VerzeichnisLoeschen CurrentProject.Path & "\Anlagen"
         End If
         lngAnzahlEingelesen = objFolder.Items.Count
         MailsEinlesen objFolder, db, lngSize, bolNeuEinlesen, bolAnlagenSpeichern
         SysCmd acSysCmdSetStatus, lngAnzahlEingelesen & "/" & lngAnzahl
         If bolRekursiv Then
             UnterordnerEinlesen objFolder, db, lngAnzahl, lngAnzahlEingelesen, lngSize, bolNeuEinlesen, _
                 bolAnlagenSpeichern
         End If
         SysCmd acSysCmdClearStatus
     End If
End Sub

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