Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.
Im Beitrag „Outlook-Folder in Access anzeigen“ haben wir gezeigt, wie Sie das Outlook View Control in ein Formular integrieren, um damit die Ordner von Outlook anzuzeigen. Im vorliegenden Beitrag bauen wir auf den dort vorgestellten Techniken auf und gehen genauer auf den Umgang mit dem E-Mail-Ordnern ein. Dabei wollen wir Details wie den Betreff, den Inhalt oder den Empfänger oder Absender der aktuell markierten E-Mail in entsprechenden Steuerelementen anzeigen. Außerdem wollen wir die Anzeige der Outlook-Ordner in ein TreeView-Steuerelement verlagern.
Das Outlook View Control ist eine tolle Erweiterung, wenn Sie beispielsweise die Outlook-Ordner zur Anzeige von E-Mails wie Posteingang, Postausgang, Gesendete Elemente oder auch benutzerdefinierte Ordner in einer Access-Anwendung anzeigen wollen.
Das Outlook View Control können Sie jedoch nicht einfach zu einem Access-Formular hinzufügen, sondern Sie müssen es in ein Frame-Steuerelement einbetten. Wie das gelingt, zeigen wir im Beitrag Outlook-Folder in Access anzeigen (www.access-im-unternehmen.de/****).
In diesem Beitrag haben wir gezeigt, wie Sie die Outlook-Ordner in ein Listenfeld einlesen und ihre Inhalte durch Anklicken des jeweiligen Listeneintrags im Outlook View Control anzeigen.
Da die Anzeige in einem Listenfeld wenig professionell aussieht, haben wir in einem weiteren Beitrag namens TreeView für Outlook-Ordner ein TreeView-Steuerelement zum Formular hinzugefügt, das alle Ordner mit E-Mails anzeigt (www.access-im-unternehmen.de/****). Der Zwischenstand nach diesem Beitrag sieht wie in Bild 1 aus.
Bild 1: Outlook-Ordner und der Inhalt eines E-Mail-Ordners
Damit kommen wir zum Ziel des vorliegenden Beitrags. Hier wollen wir die übrigen Elemente, die für den Umgang mit E-Mails notwendig sind, hinzufügen. Dazu gehören die folgenden:
- Gewählten Ordner aus dem TreeView-Steuerelement im Outlook View Control anzeigen
- Zuletzt angezeigten Ordner speichern und wiederherstellen
- Inhalt der aktuell markierten E-Mail anzeigen (Absender, Empfänger, Betreff, Inhalt, Eingangsdatum)
- Empfangen von E-Mails
- Erstellen einer neuen E-Mail im Outlook-Inspektor
- Öffnen einer E-Mail mit dem dazugehörigen Outlook-Inspektor
- Löschen von E-Mails
Gewählten Ordner im Outlook View Control anzeigen
Das Formluar frmEMailDetails enthält das TreeView-Steuerelement namens ctlTreeView sowie ein Frame-Objekt und ein ViewCtl-Objekt. Das ViewCtl-Objekt ist in das Frame-Objekt eingebettet.
Das Frame– und das ViewCtl-Objekt deklarieren wir im Kopf des Klassenmoduls des Formulars wie folgt:
Private objFrame As Frame Private WithEvents objView As ViewCtl
In der beim Laden des Formulars ausgelösten Prozedur Form_Load ini-tialisieren wir das TreeView-Steuerelement (siehe Beitrag TreeView für Outlook-Ordner) und weisen den beiden Variablen die Elemente zu:
Private Sub Form_Load() InitializeTreeView Set objFrame = Me!ctlFrame.Object Set objView = objFrame.Controls(0) End Sub
Nun wollen wir dafür sorgen, dass der vom Benutzer im TreeView-Steuerelement angeklickte Ordner im Outlook View Control angezeigt wird. Dazu legen wir eine Ereignisprozedur an, die beim Anklicken eines der Elemente des TreeView-Steuerelements ausgelöst wird:
Private Sub ctlTreeView_NodeClick(ByVal Node As Object) Dim objNode As MSComctlLib.Node Set objNode = Node objView.Folder = objNode.Key End Sub
Das wir das mit dem Parameter Node übergebene Node-Objekt noch einer Variablen des Typs MSComctlLib.Node zuweisen, liegt daran, dass wir so die IntelliSense-Funktion für diese Variable nutzen können. So können wir den in der Key-Eigenschaft des Node-Elements gespeicherten Outlook-Pfad wie zum Beispiel \\Outlook\Posteingang nutzen und diesen der Folder-Eigenschaft des Outlook View Control-Steuerelements zuweisen.
Zuletzt gewählten Ordner speichern und beim Öffnen wiederherstellen
Nun, da das Outlook View Control den Outlook-Ordner anzeigt, den der Benutzer im TreeView-Steuerelement ausgewählt hat, wollen wir diesen auch speichern, damit dieser beim nächsten Öffnen auch wieder angezeigt werden kann. Dazu legen wir eine Optionen-Tabelle namens tblOptions an. Diese soll lediglich zwei Felder enthalten – ein Primärschlüsselfeld namens OptionID und ein Textfeld namens CurrentMailfolder. Den Entwurf dieser Tabelle zeigen wir in Bild 2.
Bild 2: Tabelle zum Speichern von Optionen
Wann speichern wir den zuletzt gewählten Outlook-Ordner in der Optionen-Tabelle Am sichersten ist es, diesen nach jeder Auswahl erneut zu speichern. Wir können den Speichervorgang also direkt in die oben vorgestellte Ereignisprozedur integrieren, die beim Anklicken eines der Node-Elemente im TreeView-Steuerelement ausgelöst wird. Diese erweitern wir um den Aufruf einer Prozedur namens SaveCurrentMailfolder, der wir den Pfad zum angeklickten Ordner als Parameter übergeben:
Private Sub ctlTreeView_NodeClick(ByVal Node As Object) ... SaveCurrentMailFolder objNode.Key End Sub
Die Prozedur SaveCurrentMailfolder finden Sie in Listing 1. Sie nimmt mit dem Parameter strFolder den zuletzt aufgerufenen Ordner entgegen. Dann führt sie eine UPDATE-Abfrage aus, die das Feld CurrentMailfolder der Tabelle tblOptions auf den übergebenen Wert einstellt. Es kann sein, dass die Tabelle leer ist, weil Sie diese beispielsweise vor dem Weitergeben an einen Benutzer geleert haben. In diesem Fall liefert die folgende Abfrage der von der UPDATE-Abfrage betroffenen Datensätze den Wert 0. In dem dann ausgelösten Zweig der If…Then-Bedingung legen wir diesen Datensatz dann einfach neu an und weisen dem Feld CurrentMailfolder den Wert aus strFolder zu.
Private Sub SaveCurrentMailfolder(strFolder As String) Dim db As DAO.Database Set db = CurrentDb db.Execute "UPDATE tblOptions SET CurrentMailfolder = ''" & strFolder & "''", dbFailOnError If db.RecordsAffected = 0 Then db.Execute "INSERT INTO tblOptions(CurrentMailfolder) VALUES(''" & strFolder & "'')", dbFailOnError End If End Sub
Listing 1: Prozedur zum Speichern des aktuell gewählten Mail-Ordners
Nach dem Speichern des Wertes sieht die Tabelle tblOptions beispielsweise wie in Bild 3 aus.
Bild 3: Zuletzt verwendeter Ordner in der Tabelle tblOptions
Zuletzt gewählten Ordner beim Öffnen markieren und anzeigen
Die so gespeicherte Information wollen wir natürlich beim nächsten Öffnen des Formulars nutzen, indem wir den entsprechenden Eintrag im TreeView-Steuerelement selektieren und im Outlook View Control den passenden Ordner anzeigen. Dazu legen wir eine neue Prozedur namens SetCurrentMailfolder an, den wir in der Prozedur Form_Load beim Laden des Formulars aufrufen:
Private Sub Form_Load() ... SetCurrentMailfolder End Sub
Diese Prozedur liefert Listing 2. Die Prozedur ermittelt zunächst den Wert des Feldes CurrentMailFolder aus der Tabelle tblOptions und schreibt diesen in die Variable strFolder. Wenn noch kein Eintrag in dieser Tabelle vorliegt oder das Feld leer ist, sorgt die Nz-Funktion dafür, dass strFolder mit einer leeren Zeichenkette gefüllt wird.
Private Sub SetCurrentMailfolder() Dim strFolder As String Dim objTreeView As MSComctlLib.TreeView strFolder = Nz(DLookup("CurrentMailfolder", "tblOptions"), "") If Len(strFolder) = 0 Then strFolder = GetDefaultFolder(olFolderInbox) End If objView.Folder = strFolder Set objTreeView = ctlTreeView.Object objTreeView.SelectedItem = objTreeView.Nodes(strFolder) Me!ctlTreeView.SetFocus End Sub
Listing 2: Prozedur zum Auswählen des zuletzt betrachteten E-Mail-Ordners
Die folgende If…Then-Bedingung prüft, ob strFolder eine leere Zeichenkette enthält und somit kein zuletzt geöffneter E-Mail-Ordner in der Tabelle tblOptions vorliegt. In diesem Fall füllt sie strFolder mit dem Ergebnis der Funktion GetDefaultFolder. Diese finden Sie in Listing 3.
Private Function GetDefaultFolder(intFolder As Outlook.OlDefaultFolders) As String Dim objOutlook As Outlook.Application Dim objNamespace As Outlook.Namespace Dim objFolder As Outlook.Folder Set objOutlook = New Outlook.Application Set objNamespace = objOutlook.GetNamespace("MAPI") Set objFolder = objNamespace.GetDefaultFolder(intFolder) GetDefaultFolder = objFolder.FolderPath End Function
Listing 3: Funktion zum Ermitteln eines Standardordners
GetDefaultFolder erwartet eine der Konstanten der Auflistung Outlook.OlDefaultFolders als Parameter. Es gibt bereits eine Methode namens GetDefaultFolder, die zum Namespace-Objekt gehört. Um dieses zu referenzieren, benötigen wir zuvor noch ein Outlook.Application-Objekt. Die von uns definierte Funktion GetDefaultFolder vereinfacht den Zugriff auf einen der Standardordner von Outlook, indem es das Erstellen einer Instanz von Outlook.Application und das Zuweisen des MAPI-Namespace an die Variable objNamespace kapselt und das Folder-Objekt ermittelt, das dem Parameter intFolder entspricht, also beispielsweise olFolderInbox für den Posteingang. Die Funktion GetDefaultFolder gibt schließlich den Pfad zu dem angegebenen Ordner zurück.
Dadurch, dass wir den Parameter mit dem Typ Outlook.OlDefaultFolders deklarieren, können wir beim Aufruf per IntelliSense aus der Liste der verfügbaren Werte auswählen (siehe Bild 4).
Bild 4: Auswahl des gewünschten Standardordners per IntelliSense
Diesen nimmt die Prozedur SetCurrentMailFolder entgegen und speichert ihn in der Variablen strFolder. Damit stellt sie nun zunächst die Folder-Eigenschaft des Outlook View Controls ein. Danach referenziert sie das TreeView-Steuerelement mit der Variablen objTreeView und stellt die Eigenschaft SelectedItem auf das Node-Element ein, dass die Nodes-Auflistung für den als Parameter verwenden Wert aus strFolder (zum Beispiel \\Outlook\Posteingang) liefert.
Schließlich wird der Fokus auf das TreeView-Steuerelement verschoben, damit der Benutzer direkt den selektierten Ordner erkennen kann.
Müssen wir die übergeordneten Ordner aufklappen, damit der markierte Eintrag sichtbar wird Es kann ja auch sein, dass der Benutzer einen Ordner auswählt und dann alle Ordner einklappt, sodass der gewählte Ordner nicht mehr im TreeView-Steuerelement sichtbar ist. Hier besteht kein Grund zur Sorge: Das TreeView-Steuerelement klappt automatisch alle Elemente bis zum aktuell selektierten Element auf.
Inhalt der aktuell markierten E-Mail anzeigen
Nun wollen wir die Inhalte der aktuell im Outlook View Control ausgewählten E-Mail in dafür vorgesehenen Steuerelementen anzeigen. In Outlook sieht der Bereich wie in Bild 5 aus. Die Ansicht im Outlook View Control liefert leider nur den oberen Teil mit der Liste der E-Mails, sodass wir den Rest selbst anlegen müssen.
Bild 5: Anzeige einer E-Mail in Outlook
Wir wollen uns dabei auf folgende Elemente beschränken:
- Absender
- Empfänger
- Betreff
- Inhalt
- Datum und Zeit des Eingangs
- Schaltflächen zum Antworten an einen Empfänger, an alle Empfänger und zum Weiterleiten
Um auch nur eine dieser Informationen anzuzeigen, benötigen wir nicht nur die entsprechenden Steuerelemente, sondern wir müssen auch erst einmal an die betreffenden Daten kommen. Sprich: Wir benötigen das MailItem-Objekt, das sich hinter dem selektierten Eintrag befindet.
Doch zuerst zu den Steuerelementen. Diese fügen wir wie in Bild 6 hinzu. Die Textfelder heißen von oben nach unten txtSubject, txtFrom, txtTo und txtBody. Rechts befindet sich txtReceived. Die drei Schaltflächen heißen cmdReply, cmdReplyAll und cmdForward.
Bild 6: Hinzufügen von Steuerelementen zum Anzeigen einer E-Mail
Anschließend kümmern wir uns um eine Prozedur, die beim Auswählen eines der Einträge des Outlook View Control-Steuerelements ausgelöst wird. Diese fügen wir hinzu, indem wir im Codefenster des Klassenmoduls des Formulars im linken Kombinationsfelder den Eintrag objView auswählen und im rechten den Eintrag SelectionChange. Diese füllen wir lediglich mit einem einzigen Befehl, der eine weitere Prozedur namens ShowMail aufruft.
Private Sub objView_SelectionChange() ShowMail End Sub
Die Prozedur ShowMail finden Sie in Listing 4. Sie ermittelt mit der Funktion GetFirstSelectedMailItem die aktuell selektierte E-Mail. Ist objMailItem danach nicht leer, wurde also ein MailItem-Element markiert, stellt die Prozedur die Textfelder des Formulars auf die Eigenschaften des MailItem-Elements ein. Dabei füllt sie txtFrom mit dem Namen des Absenders gefolgt von der E-Mail-Adresse in Klammern. Die übrigen Textfelder werden mit den Werten der Eigenschaften To, Body, Subject und ReceivedTime bestückt. Außerdem aktiviert die Prozedur die drei Schaltflächen. Hat objMailItem hingegen den Wert Nothing, leert die Prozedur im Else-Zweig der Bedingung die Textfelder und deaktiviert die drei Schaltflächen.
Private Sub ShowMail() Dim objMailItem As Outlook.MailItem Set objMailItem = GetFirstSelectedMailItem If Not objMailItem Is Nothing Then Me!txtFrom = objMailItem.SenderName & " (" & objMailItem.SenderEmailAddress & ")" Me!txtTo = objMailItem.To Me!txtBody = objMailItem.Body Me!txtSubject = objMailItem.Subject Me!txtReceived = objMailItem.ReceivedTime Me!cmdForward.Enabled = True Me!cmdReply.Enabled = True Me!cmdReplyAll.Enabled = True Else Me!txtFrom = "" Me!txtTo = "" Me!txtBody = "" Me!txtSubject = "" Me!txtReceived = "" Me!cmdForward.Enabled = False Me!cmdReply.Enabled = False Me!cmdReplyAll.Enabled = False End If End Sub
Listing 4: Prozedur zum Anzeigen der Daten einer E-Mail
Die von ShowMail aufgerufene Funktion GetFirstSelectedMailItem deklariert Variablen zum Referenzieren des Selection-Objekts sowie eines MailItem-Objekts von Outlook (siehe Listing 5). Die Variable objSelection füllt sie mit der aktuellen Auswahl im Outlook View Control. Dann prüft sie in einer If…Then-Bedingung, ob die Auswahl überhaupt mindestens ein Element enthält. Falls ja, untersucht sie in einer Select Case-Bedingung den Typ des ersten Elements der aktuellen Auswahl, das sie mit objSelection.Item(1) referenziert. Die TypeName-Funktion liefert den Namen des Typs des Elements. Dieses sollte in der Regel MailItem heißen. In diesem Fall referenziert die Prozedur das Element mit der Variablen objMailItem. Anschließend stellt die Funktion den Rückgabewert GetFirstSelectedMailItem auf den Inhalt von objMailItem ein.
Private Function GetFirstSelectedMailItem() As MailItem Dim objSelection As Outlook.Selection Dim objMailItem As Outlook.MailItem Set objSelection = objView.Selection If Not objSelection.Count = 0 Then Select Case TypeName(objSelection.Item(1)) Case "MailItem" Set objMailItem = objSelection.Item(1) End Select Set GetFirstSelectedMailItem = objMailItem End If End Function
Listing 5: Funktion zum Ermitteln der aktuell markierten E-Mail
Das Formular sieht nach der Auswahl wie in Bild 7 aus. Hier ist je nach den Anforderungen des Benutzers noch Finetuning möglich. Zum Beispiel wird hier nicht geprüft, ob die Mail im Text- oder HTML-Format kommt und auch in der E-Mail enthaltene Anlagen werden noch nicht angezeigt. Schließlich haben wir unter Access nur die Möglichkeit, eines der Steuerelemente oben und unten gleichzeitig zu verankern, sodass sich seine Größe beim Ändern der Größe des Formulars anpasst. Wir können also in der aktuellen Konstellation nur entweder das Outlook View Control oder das Textfeld txtBody vergrößerbar gestalten.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
Testzugang
eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel
diesen und alle anderen Artikel mit dem Jahresabo
Ich bekomme andauernd den Laufzeitfehler 91 und 462.
Muss da noch speziell was konfiguriert werden?
(Windows 10×64, Office 365, Datenbank plain kopiert und gestartet).
Gegebenenfalls müssen Sie in diesem Fall das Outlook View Control auf Ihrem System erneut einfügen wie im Artikel https://access-im-unternehmen.de/OutlookFolder_in_Access_anzeigen/ beschrieben.