Outlook-Mails in Access archivieren II

Wenn Sie ein Abonnement des Magazins 'Access im Unternehmen' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.

Outlook-Mails in Access archivieren II

Im ersten Teil dieser Beitragsreihe haben wir alle Outlook-Mails eines Ordners und gegebenenfalls auch die in den Unterordnern in Access archiviert. Im vorliegenden zweiten Teil der Reihe schauen wir uns an, welche Daten wir dort nun produziert haben und was wir mit diesen alles anfangen können. Dazu gehört unter anderem, dass wir die Daten, da wir diese nun in Tabellenform vorliegen haben, mit den gewohnten Mitteln durchsuchen können. Damit wollen wir nun nicht mehr benötigte Mails endgültig löschen oder Mails wiederherstellen, die wir in Outlook doch nochmal brauchen.

Mit den im ersten Teil vorgestellten Prozeduren im Formular frmMailimport haben wir die Tabellen der Datenbank mit den Daten der Outlook.pst-Datei gefüllt – und auch noch zwei Verzeichnisse, die sich auf der gleichen Ebene wie die Datenbankanwendung befinden.

Die Verzeichnisstruktur sieht nun wie in Bild 1 aus. Das Verzeichnis MSG enthält die im Dateisystem abgelegten .msg-Dateien. Die Lösung bietet die Möglichkeit, diese Dateien entweder mit dem Datensatz in einem Anlagefeld der Tabelle tblMailItems zu speichern oder aber diese im Dateisystem abzulegen. Letzteres legen Sie durch den Wert für die maximale Größe der in der Datenbank zu speichernden .msg-Dateien in den Optionen der Lösung fest. Alle Dateien, die größer sind, landen im Verzeichnis MSG.

Verzeichnisstruktur der Lösung

Bild 1: Verzeichnisstruktur der Lösung

Das Verzeichnis Anlagen enthält, soweit Anlagen nochmals in separate Dateien extrahiert werden sollen, alle Anlagen der archivierten E-Mails. Die Anlagen befinden sich auch in den jeweiligen .pst-Dateien, sodass ein separates Speichern grundsätzlich nicht erforderlich ist. Die Tabelle tblMailItems enthält nun einige Datensätze mit den Metadaten einer E-Mail sowie dem Inhalt. Außerdem enthält die Tabelle ein Anlagefeld, das die .msg-Datei aufnehmen kann, sofern diese die maximal zulässige Größe nicht überschreitet (s. Bild 2).

Die Tabelle tblMailItems mit einigen Datensätzen

Bild 2: Die Tabelle tblMailItems mit einigen Datensätzen

Die Tabelle tblAnlagen speichert zu jeder Anlage einer Mail einen Datensatz, der über das Feld MailItemID mit der Tabelle tblMailItems verknüpft ist (s. Bild 3). Die dortigen Felder geben an, in welchem Verzeichnis die Anlagen gespeichert sind und wie die entsprechenden Dateien heißen. Damit haben wir eigentlich alle Informationen, die wir benötigen, um unsere Such-Funktion zu implementieren!

Tabelle zum Speichern der Pfade zu den Anlagen

Bild 3: Tabelle zum Speichern der Pfade zu den Anlagen

Suchformular

Das Suchformular soll wie in Bild 4 aussehen. Dort finden wir im oberen Bereich zunächst die Felder zur Eingabe der Suchkriterien. Darunter befinden sich drei Schaltflächen:

Formular zum Durchsuchen der E-Mails

Bild 4: Formular zum Durchsuchen der E-Mails

  • Suchen: Startet die Suche auf Basis der angegebenen Suchkriterien
  • Alle anzeigen: Hebt den durch die Suche angewendeten Filter wieder auf.
  • In OL wiederherstellen: Legt eine Kopie der E-Mail in Outlook in dem Ordner an, aus dem sie ursprünglich kopiert wurde.

Der Entwurf des Formulars sieht wie in Bild 5 aus. Das Unterformular sfmMailItems verwendet die Tabelle tblMailItems als Datenherkunft.

Entwurf des Formulars frmMailItems

Bild 5: Entwurf des Formulars frmMailItems

Mails über das Unterformular anzeigen

Bevor wir auf die Suchfunktion eingehen, schauen wir uns an, wie Sie über das Unterformular eine einzelne Mail im Mailfenster von Outlook öffnen können. Dazu soll der Benutzer einfach doppelt auf den entsprechenden Datensatz im Unterformular klicken können. Da es dazu kein allgemeines Ereignis namens Beim Doppelklicken für den kompletten Formularbereich gibt, müssen wir dieses für die einzelnen Textfelder im Unterformular anlegen. Die folgenden Ereignisprozeduren legen wir also im Klassenmodul des Unterformulars an:

Private Sub Absender_DblClick(Cancel As Integer)
     MailOeffnen Me!MailitemID
End Sub
Private Sub Betreff_DblClick(Cancel As Integer)
     MailOeffnen Me!MailitemID
End Sub
Private Sub Empfaenger_DblClick(Cancel As Integer)
     MailOeffnen Me!MailitemID
End Sub
Private Sub Erhalten_DblClick(Cancel As Integer)
     MailOeffnen Me!MailitemID
End Sub
Private Sub Pfad_DblClick(Cancel As Integer)
     MailOeffnen Me!MailitemID
End Sub

Damit ist sichergestellt, dass die von diesen Ereignisprozeduren aufgerufene Prozedur MailOeffnen immer ausgelöst wird – egal, auf welches der Textfelder in der Datenblattansicht des Unterformulars der Benutzer klickt.

Die Prozedur MailOeffnen finden Sie in Listing 1. Die Prozedur nimmt als Parameter den Primärschlüsselwert des im Unterformular angeklickten Datensatzes der Tabelle tblMailItems entgegen. Sie öffnet dann ein Recordset auf Basis der Tabelle tblMailItems, wobei diese nach dem übergebenen Primärschlüsselwert gefiltert wird.

Private Sub MailOeffnen(lngMailItemID As Long)
     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Dim rstAttachment As DAO.Recordset2
     Dim fldAttachment As DAO.Field2
     Set db = CurrentDb
     Set rst = db.OpenRecordset("SELECT * FROM tblMailItems WHERE MailItemID = " & lngMailItemID, dbOpenDynaset)
     Set rstAttachment = rst.Fields("MailItem").Value
     If rstAttachment.RecordCount = 1 Then
         Set fldAttachment = rstAttachment.Fields("FileData")
         On Error Resume Next
         Kill CurrentProject.Path & "MailItemTemp_" & lngMailItemID & ".msg"
         On Error GoTo 0
         fldAttachment.SaveToFile CurrentProject.Path & "MailItemTemp_" & lngMailItemID & ".msg"
     Else
         FileCopy CurrentProject.Path & "MSG" & lngMailItemID & ".msg", CurrentProject.Path & "MailItemTemp_" _
             & lngMailItemID & ".msg"
     End If
     Call ShellExecute(Me.hWnd, "open", CurrentProject.Path & "MailItemTemp_" & lngMailItemID & ".msg", "", "", _
         SW_NORMAL)
End Sub

Listing 1: Die Prozedur zum Anzeigen einer E-Mail im Mail-Inspector

Nun ist es interessant, ob die Originalmail im .msg-Format im Anlagefeld MailItem der Tabelle tblMailItems gespeichert wurde oder ob sich diese im Unterverzeichnis MSG befindet.

Um dies herauszufinden, referenziert die Prozedur zunächst das im Anlagefeld MaiItem enthaltene und über die Value-Eigenschaft verfügbare Recordset mit der eigentlichen Anlage (hier bitte Anlage eines Anlagefeldes nicht mit Anlage einer E-Mail verwechseln) und speichert es in rstAttachment. Enthält rstAttachment nun genau einen Recordset (RecordCount = 1), dann liegt die Originalmail im .msg-Format im Anlagefeld der Tabelle vor.

Das Feld FileData des Recordsets rstAttachment füllt die Prozedur dann in die Variable fldAttachment. Das Field2-Objekt fldAttachment bietet dann mit der Methode SaveToFile die Möglichkeit, den Inhalt des Anlagefeldes als Datei zu speichern. Da es durchaus vorkommen kann, dass wir einmal mehrere Mail gleichzeitig anzeigen, müssen wir eine Konvention für die Dateinamen der .msg-Dateien festlegen, die ausschließt, dass Dateien doppelt vorhanden sind. Das ist aber kein Problem, denn wir haben ja zu jeder Mail einen Primärschlüsselwert, den wir in den Dateinamen integrieren können. Also fügen wir den Namen etwa nach folgendem Schema zusammen:

MailItemTemp_<ID>.msg

Eventuell vorhandene Dateien gleichen Namens löscht die Prozedur vor dem Anlegen mit der Kill-Anweisung. Dann speichert sie die Datei mit SaveToFile in das gleiche Verzeichnis wie die Datenbank.

Sollte das Anlagefeld keine Datei enthalten, haben wir beim Import eine Kopie der .msg-Datei im Verzeichnis MSG im Verzeichnis der Datenbank gespeichert. Diese kopieren wir nun mit der FileCopy-Anweisung ebenfalls in das Verzeichnis der Datenbank. Schließlich öffnen wir die .msg-Datei mit der ShellExecute-Methode, welche sich die passende Anwendung für die Anzeige der E-Mail, in diesem Fall Outlook, aussucht und die E-Mail schließlich öffnet. Das Ergebnis sieht etwa wie in Bild 6 aus.

Eine per Doppelklick geöffnete E-Mail

Bild 6: Eine per Doppelklick geöffnete E-Mail

Suchfunktion

Die Suchfunktion wertet die Eingaben in die Textfelder txtAbsender, txtEmpfaenger, txtBetreff, txtInhalt, txtVon und txtBis aus und stellt einen entsprechenden Filter zusammen.

Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.

Bitte geben Sie die Zeichenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Ich habe die Datenschutzbestimmungen zur Kenntnis genommen.