Makrothek
MS Outlook 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