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.
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).
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!
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:
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.
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.
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.
Sie wird durch einen Klick auf die Schaltfläche cmdSuchen ausgelöst und ist in Listing 2 zu finden. Die Prozedur prüft in einer If…Then-Bedingung den Inhalt der einzelnen Textfelder, und zwar über die Länge der enthaltenen Zeichenketten. Beträgt die mit der Len-Funktion Länge mehr als 0 Zeichen, ist ein Vergleichswert vorhanden und die Prozedur fügt einen entsprechenden, mit dem AND-Schlüsselwort beginnenden Ausdruck zu der in der Variablen strFilter gespeicherten Zeichenkette hinzu.
Private Sub cmdSuchen_Click() Dim strFilter As String If Len(Me!txtAbsender) > 0 Then strFilter = strFilter & " AND Absender LIKE ''*" & Me!txtAbsender & "*''" End If If Len(Me!txtEmpfaenger) > 0 Then strFilter = strFilter & " AND Empfaenger LIKE ''*" & Me!txtEmpfaenger & "*''" End If If Len(Me!txtBetreff) > 0 Then strFilter = strFilter & " AND Betreff LIKE ''*" & Me!txtBetreff & "*''" End If If Len(Me!txtInhalt) > 0 Then strFilter = strFilter & " AND Body LIKE ''*" & Me!txtInhalt & "*''" End If If Len(Me!txtVon) > 0 Then If Len(Me!txtBis) > 0 Then strFilter = strFilter & "AND Erhalten >= " & ISODatum(Me!txtVon) & " AND Erhalten <= " & ISODatum(Me!txtBis) Else strFilter = strFilter & "AND Erhalten >= " & ISODatum(Me!txtVon) End If Else If Len(Me!txtBis) > 0 Then strFilter = strFilter & "AND Erhalten <= " & ISODatum(Me!txtBis) End If End If If Len(strFilter) > 0 Then strFilter = Mid(strFilter, 5) End If With Me!sfmMailItems.Form .Filter = strFilter .FilterOn = True End With End Sub
Listing 2: Suchfunktion
Wenn der Benutzer beispielsweise als Absender den Wert andre@minhorst.com eingibt, lautet der Ausdruck in strFilter für diesen Schritt wie folgt:
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