Outlook-Mails in Access archivieren III

Die Archivierungsdatenbank für Outlook-Mails kann nun schon Mails importieren und bietet eine Suchfunktion für die importierten Mails an. Außerdem können Sie die gefundenen E-Mails mit Outlook öffnen und darin wiederherstellen. Nun wollen wir die Lösung noch so erweitern, dass Sie beispielsweise mehrere Ordner in Outlook auswählen können, deren E-Mails importiert werden sollen. Außerdem soll der Import gleich beim Start der Anwendung gelingen.

Die neue Version des Formulars sieht nun wie in Bild 1 aus. Das Formular enthält im Gegensatz zur vorherigen Version nun eine Liste mit mehreren Verzeichnissen, deren Detaildaten Sie durch Anklicken der Einträge im unteren Bereich anzeigen können.

Neue Version des Formulars zum Einlesen der E-Mails

Bild 1: Neue Version des Formulars zum Einlesen der E-Mails

Oben finden Sie außerdem zwei Schaltflächen, mit denen Sie eine neue Konfiguration hinzufügen oder eine bestehende löschen können.

Der untere Bereich enthält die Detaildaten, die bereits die Version aus dem vorherigen Teil der Beitragsreihe angeboten hat. Diese Daten stammen aus der Tabelle tblOptionen. Unten finden Sie drei Schaltflächen:

  • Import starten: Startet den Import für alle angelegten Konfigurationen.
  • Alle importierten Mails und Dateien löschen: Löscht alle in der Tabelle tblMailItems und der verknüpften Tabelle tblAnlagen enthaltenen Daten sowie die Daten in den beiden Unterformularen MSG und Anlagen.
  • Mailmarkierungen entfernen: Beim Importieren der Mails erhält jede importierte Mail den Wert saved für die Eigenschaft BillingInformationen. Wenn Sie die Mails nochmals einlesen möchten, müssen Sie diese Eigenschaft wieder leeren.

Formular erstellen

Das Formular frmMailImport besteht nun zusätzlich noch aus einem Unterformular namens sfmMailImport. Dieses ist wie in Bild 2 aufgebaut und verwendet die Tabelle tblOptionen als Datenherkunft.

Das Unterformular sfmMailImport in der Entwurfsansicht

Bild 2: Das Unterformular sfmMailImport in der Entwurfsansicht

Das Hauptformular nimmt dieses Unterformular auf und verwendet zusätzlich die in Bild 3 zu erkennenden Steuerelemente. Besondere Bedeutung kommt natürlich dem Listenfeld lstVerzeichnisse zu. Es verwendet ebenfalls eine Datensatzherkunft auf Basis der Tabelle tblOptionen, allerdings hier in Form einer Abfrage, welche nur die beiden Felder OptionID und Verzeichnis berücksichtigt:

Das Formular frmMailImport in der Entwurfsansicht

Bild 3: Das Formular frmMailImport in der Entwurfsansicht

SELECT OptionID, Verzeichnis FROM tblOptionen;

Damit nur das Verzeichnis im Listenfeld erscheint, stellen Sie die Eigenschaft Spaltenanzahl auf den Wert 2 und die Eigenschaft Spaltenbreiten auf den Wert 0cm ein. Wenn der Benutzer auf einen der Einträge klickt, sollen dessen Details im unteren Bereich des Formulars eingeblendet werden.

Dies erreichen Sie mithilfe zweier Prozeduren. Die erste ist die Ereignisprozedur, die durch das Ereignis Nach Aktualisierung des Listenfeldes ausgelöst wird (s. Listing 1).

Private Sub lstVerzeichnisse_AfterUpdate()
     VerzeichnisAktualisieren
End Sub

Listing 1: Diese Prozedur wird nach der Auswahl eines Eintrags im Listenfeld ausgelöst.

Diese ruft eine weitere Prozedur namens VerzeichnisAktualisieren auf, die Sie in Listing 2 finden. Die Prozedur prüft, ob aktuell ein Eintrag im Listenfeld markiert ist (was beispielsweise nicht der Fall ist, wenn es leer ist und der Benutzer dennoch hineinklickt) und verschiebt den Datensatzzeiger im Unterformular auf den Datensatz, dessen OptionID dem aktuell im Listenfeld ausgewählten Eintrag entspricht.

Private Sub VerzeichnisAktualisieren()
     If Not IsNull(Me!lstVerzeichnisse) Then
         Me!sfmMailimport.Form.Recordset.FindFirst "OptionID = " & Me!lstVerzeichnisse
     End If
End Sub

Listing 2: Aktualisierung der Detaildaten zu einem Listenfeldeintrag

Beim Laden des Formulars soll das Listenfeld gleich den ersten Datensatz markieren, damit der Benutzer erkennen kann, zu welchem Listeneintrag die Daten aus dem Unterformular gehören. Dies erledigen wir mit der Ereignisprozedur, die durch das Ereignis Beim Laden ausgelöst wird und nur eine einzige Anweisung enthält:

Private Sub Form_Load()
     Me!lstVerzeichnisse = Me!lstVerzeichnisse.ItemData(0)
End Sub

Anlegen einer neuen Konfiguration

Ein Klick auf die Schaltfläche cmdNeu im oberen Bereich des Formulars soll einen neuen Datensatz in der Tabelle anlegen, der gleichzeitig im Listenfeld und im Unterformular erscheint. Dazu fragen wir das Outlook-Verzeichnis, für welches die Konfiguration bestimmt sein soll, gleich beim Anklicken der Neu-Schaltfläche ab. Die Prozedur cmdNeu_Click aus Listing 3, die durch das Anklicken ausgelöst wird, ermittelt zunächst den Titel des aktuell geöffneten Access-Fensters. Dies ist nötig, da beim nachfolgenden Aufrufen des Outlook-Dialogs zum Auswählen eines Outlook-Ordners gelegentlich das geöffnete Outlook-Fenster stehen bleibt und das aufrufende Access-Fenster verdeckt ist. Um das Access-Fenster anschließend wieder in den Vordergrund zu holen, benötigen wir den Fenstertitel. Diesen erhalten wir mithilfe der Funktion GetActiveWindowTitle, die Sie im Modul mdlAPI finden.

Private Sub cmdNeu_Click()
     Dim strVerzeichnis As String
     Dim db As DAO.Database
     Dim lngOptionID As Long
     Dim strFenster As String
     strFenster = GetActiveWindowTitle
     strVerzeichnis = VerzeichnisWaehlen
     If Len(strVerzeichnis) > 0 Then
         Set db = CurrentDb
         db.Execute "INSERT INTO tblOptionen(Verzeichnis) VALUES(''" & strVerzeichnis & "'')"
         lngOptionID = db.OpenRecordset("SELECT @@IDENTITY").Fields(0)
         Me!lstVerzeichnisse.Requery
         Me!sfmMailimport.Form.Requery
         Me!lstVerzeichnisse = lngOptionID
         VerzeichnisAktualisieren
         AppActivate strFenster
     End If
End Sub

Listing 3: Prozedur zum Anlegen einer neuen Konfiguration

Die Funktion VerzeichnisWaehlen haben Sie ja bereits in den vorhergehenden Teilen dieser Beitragsreihe kennen gelernt – es öffnet den Outlook-Dialog zum Auswählen eines Ordners (s. Bild 4). Danach prüft die Prozedur, ob der Benutzer einen Ordner ausgewählt hat. In diesem Fall erzeugt er eine Referenz auf das aktuelle Database-Objekt und führt eine INSERT INTO-Abfrage aus, welche einen neuen Datensatz in die Tabelle tblOptionen einfügt und dabei gleich das Verzeichnis in das entsprechende Feld einträgt. Die Abfrage SELECT @@IDENTITY ermittelt den Wert des Primärschlüsselfeldes des neu hinzugefügten Datensatzes, das Ergebnis landet in der Variablen lngOptionID.

Auswählen des Mail-Ordners

Bild 4: Auswählen des Mail-Ordners

Da nun ein neuer Datensatz vorliegt, müssen die Datenherkunft des Unterformulars sowie die Datensatzherkunft des Listenfeldes aktualisiert werden, was die Prozedur jeweils mit der Requery-Methode erledigt. Danach stellt die Prozedur das Listenfeld auf den neu hinzugefügten Eintrag ein und ruft die bereits weiter oben vorgestellte Prozedur VerzeichnisAktualisieren auf, die den aktuell im Listenfeld markierten Eintrag im Unterformular anzeigt.

Schließlich aktiviert die Prozedur AppActivate das Fenster mit dem weiter oben in der Variablen strFenster gespeicherten Titel der Access-Anwendung.

Eine Konfiguration löschen

Ein Klick auf die Schaltfläche cmdLoeschen im oberen Bereich des Formulars soll den aktuell markierten Eintrag im Listenfeld aus der Tabelle tblOptionen löschen und die übrigen Steuerelemente aktualisieren, sodass der gelöschte Datensatz nirgends mehr auftaucht.

Die durch die Schaltfläche ausgelöste Prozedur sieht wie in Listing 4 aus und prüft zunächst, ob überhaupt ein Eintrag im Listenfeld markiert ist. Ist dies der Fall, fragt die Prozedur den Benutzer per Meldungsfenster, ob die Konfiguration mit dem angegebenen Verzeichnis tatsächlich gelöscht werden soll.

Private Sub cmdLoeschen_Click()
     Dim db As DAO.Database
     If Not IsNull(Me!lstVerzeichnisse) Then
         If MsgBox("Verzeichnis ''" & Me!lstVerzeichnisse.Column(1) & "'' wirklich aus der Liste entfernen", _
                 vbYesNo) = vbYes Then
             Set db = CurrentDb
             db.Execute "DELETE FROM tblOptionen WHERE OptionID = " & Me!lstVerzeichnisse, dbFailOnError
             Me!lstVerzeichnisse.Requery
             Me!sfmMailimport.Form.Requery
             Me!lstVerzeichnisse = Me!lstVerzeichnisse.ItemData(0)
             VerzeichnisAktualisieren
         End If
     End If
End Sub

Listing 4: Löschen einer Konfiguration

Falls ja, entfernt die Prozedur zunächst den entsprechenden Datensatz per DELETE-Anweisung aus der Tabelle tblOptionen. Anschließend aktualisiert sie den Inhalt des Listenfelds sowie des Unterformulars. Außerdem markiert sie im Listenfeld den ersten Eintrag und sorgt durch den Aufruf der Prozedur VerzeichnisAktualisieren auch noch für die Anzeige der Details zu diesem Eintrag im Unterformular.

Importierte Elemente löschen

Die Schaltfläche cmdAlleLoeschen aus dem unteren Bereich soll sowohl die Einträge der Tabelle tblMail-Items und der verknüpften Tabelle tblAnlagen löschen als auch die Dateien aus den beiden Verzeichnissen MSG und Anlagen (s. Listing 5).

Private Sub cmdAlleLoeschen_Click()
     Dim db As DAO.Database
     Dim objFileSystemObject As Object
     If MsgBox("Klicken Sie auf OK, um alle gespeicherten Daten zu löschen.", vbOKCancel) = vbOK Then
         Set db = CurrentDb
         db.Execute "DELETE FROM tblMailItems", dbFailOnError
         Set objFileSystemObject = CreateObject("Scripting.FileSystemObject")
         If Dir(CurrentProject.Path & "\Anlagen", vbDirectory) = "Anlagen" Then
             objFileSystemObject.DeleteFolder CurrentProject.Path & "\Anlagen"
         End If
         If Dir(CurrentProject.Path & "\MSG", vbDirectory) = "Anlagen" Then
             objFileSystemObject.DeleteFolder CurrentProject.Path & "\MSG"
         End If
         Set objFileSystemObject = Nothing
         MsgBox "Die Tabellen und Unterverzeichnisse wurden geleert."
     End If
End Sub

Listing 5: Löschen aller Mails und Dateien

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