betrifft MS Outlook |
Problembeschreibung:
Outlook speichert alle Informationen in Ordnern (engl.: Folder) ab. Das gilt sowohl für Emails als auch für Kontakte, Aufgaben oder Termine. Möchte man nun die Ordner ansprechen und die Einträge auslesen, muss man die Ordner per VBA erst adressieren. Leider werden freigegebene Ordner oder Kalender nicht in den eigenen Ordnerbaum importiert bzw. eingehängt, obwohl diese dort angezeigt werden. Dadurch können freigegebene Ordner nicht einfach angesprochen werden. Es gibt zwar noch Funktionen wie GetSharedDefaultFolder(), allerdings adressieren diese nur die Standard-Ordner. Freigegebene Ordner, die nicht Standard-Ordner sind, wie z. B. ein zweiter Kalender, können damit nicht angesprochen werden.
Lösungsidee
Outlook muss diese Ordner ja irgend wie adressieren. Die Informationen sind in der Einladungs-Email versteckt, die man bekommt, wenn ein Ordner von jemanden freigegeben wird. Die Einladungs-Email wird von Outlook jedoch verschleiert. Statt die Informationen anzuzeigen, erhält man einen Button "Kalender öffnen". In Wirklichkeit ist diese Einladung eine normale Email mit einer Datei "sharing_metadata.xml" im Anhang, die von Outlook aber versteckt wird. Jedes andere Email-Programm zeigt diese an. Diese Datei "sharing_metadata.xml" hat folgenden Inhalt:
<!--?xml version="1.0"?-->
<SharingMessage xmlns="http://schemas.microsoft.com/sharing/2008">
<DataType>calendar</DataType>
<Initiator>
<Name>Name des Einladenden (Absender)</Name>
<SmtpAddress>Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!</SmtpAddress>
<EntryId>0000000002B2FE18201DC ... EntryID des Absenders ... 69656E747200</EntryId>
</Initiator>
<Invitation>
<Title>Ordnername</Title>
<Providers>
<Provider Type="ms-exchange-internal" TargetRecipients="Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!">
<FolderId xmlns="http://schemas.microsoft.com/exchange/sharing/2008">
00000000F01003789413DD2EE ... FolderID = Ordneradresse ... D869DF6174260000
</FolderId>
<MailboxId xmlns="http://schemas.microsoft.com/exchange/sharing/2008">
0000000034D44422E444C4C3 ... Postfach-ID des Empfängers ... E3D726563697000
</MailboxId>
</Provider>
</Providers>
</Invitation>
</SharingMessage>
Mit Hilfe der Ordneradresse (FolderId) kann der freigegebene Ordner mittels der Funktion GetFolderFromID() angesprochen werden.
Programmcode
Der folgende Beispiel-Code zeigt, wie mittels der FolderID der Ordner adressiert werden kann und darin befindliche Einträge verarbeitet werden können:
' VBA-Code zum Auslesen eines freigegebenen Ordners
Dim Namensraum As NameSpace 'Namensraum
Dim Kalender As MAPIFolder 'Ordner "Kalender"
Dim Eintrag As AppointmentItem 'Kalender-Objekt
' Namespace öffnen
Set Namensraum = GetNamespace("MAPI")
' Kalender adressieren
Set Kalender = Namensraum.GetFolderFromID("00000000F01003789413DD2EE ... D869DF6174260000")
For Each Eintrag In Kalender.Items
' Jeden Kalendereintrag anzeigen
MsgBox Eintrag.Subject, vbOKOnly + vbInformation
Next Eintrag
Set Kalender = Nothing
Set Namensraum = Nothing