Zugriff auf Groupwaredaten aus PHP-Projekten heraus: MAPI@TYPO3
Freie Groupwareserver gibt es viele. Die bekanntesten sind Kolab, Open-Xchange, OpenGroupware und exchange4linux. Diese vier sind zugleich auch Vertreter sehr unterschiedlicher Architekturansätze. Kolab ist serverseitig in erster Linie ein IMAP-Server, der von intelligenten Clients als Groupware genutzt wird. Open-Xchange und OpenGroupware sind typische Webapplikationen, die über die Jahre vom SUSE-Slox beziehungsweise Skyrix abgeleitet wurden. Exchange4linux entspricht weitestgehend dem Client-Server Konzept von MS Exchange mit zentraler Datenbank und objektorientiertem Datenmodel.
Von den proprietären Systemen kann man zumindest Scalix, Groupwise und Notes auch unter Linux als Groupwareserver einsetzen. Scalix ist bestrebt, immer mehr Teile seines Sourcecodes freizugeben. Bei Groupwise und Notes ist damit wohl nicht zu rechnen.
Seit etwas mehr als einem Jahr sorgt nun Zarafa für Bewegung auf dem Linux-Groupware-Markt. Die Architektur entspricht in weiten Teilen MS Exchange und exchange4linux. Durch konsequente Programmierung der Kernkomponenten in C++ wurde eine optimale Performance erreicht. Gute Outlook-Unterstützung und ein optisch ansprechender Webclient runden das Bild ab. Dass die Entwickler „Open-Source-Minded“ sind, beweist die bestens dokumentierte PHP-MAPI-Extension.
Wer heute mit TYPO3 Websites gestaltet und seinen Kunden hohe Integration und dadurch hohen Nutzen bieten will, wird sehr schnell Adressdaten oder Termine mit lokalen Groupwaresystemen verbinden müssen. Lösungen, die mit Synchronisationstechnik arbeiten, bieten keine Echtzeitintegration und sind durch Kollisionsprobleme schwer zu administrieren. Nach wie vor wird in der Praxis meist die Kombination Outlook/Exchange eingesetzt. Wer nun Outlook-Clients in seine Lösung voll integrieren will, kommt kaum um eine echte MAPI-Einbindung herum.
Die Groupware Zarafa stellt mit der PHP-MAPI-Extension einen sehr umfangreichen Satz von Befehlen und Schnittstellen aus Microsofts MAPI-Welt unter PHP zur Verfügung. Die Entwickler haben sich bei der gut dokumentierten Syntax [1] stark an das offen liegende MAPI-Protokoll gehalten, so dass ein Großteil der Informationen von Microsoft [2] auch auf die PHP-MAPI-Funktionen anwendbar sind. Dieser Vorteil der Kompatibilität stellt allerdings die Anforderung an den PHP-Entwickler, auch Grundwissen über MAPI zu besitzen.
Outlook-Kontakte in PHP ausgeben
Im folgenden Beispiel wird demonstriert, wie einfach der Zugriff auf die Kontakte eines Zarafa-Benutzers aus der eigenen PHP-Applikation heraus erfolgen kann, wenn man nur weiß, wie man die MAPI-spezifischen Konstanten findet. Mit dieser einfachen Anwendung lassen sich zum Beispiel die im TYPO3-Projekt publizierten Kontakte eines Vereins bequem mit Microsoft Outlook verwalten.
Zunächst gilt es, so wie man es von MySQL & Co. gewohnt ist, eine Verbindung zur Datenbank, dem MAPI-Store, herzustellen (siehe Listing 1). Der String „$server“ gibt dabei die URL zur SOAP-Schnittstelle von Zarafa an. Im Erfolgsfall enthält „$stores“ ein Array aus den MAPI-Stores des Benutzers „$user“. Dies sind im Normalfall genau zwei: Der „default-store“ (die eigenen PIM-Daten) an Position 0 und der „public-store“ (die gemeinsamen Daten) an Position 1.
$server = 'http://localhost:236/zarafa'; $stores = mapi_openmsgstore_zarafa($user, $pass, $server); if (is_array($stores)) $default_store = $stores[0]; else die('Fehler');
Listing 1
Wie man in Microsofts Outlook sieht, sind die MAPI-Daten in einer Baumstruktur organisiert. Um zum gewünschten Zweig zu gelangen, erzeugt man einen Zeiger auf das Mutter-Element über die Funktion „mapi_msgstore_openentry“ und fragt den Zeiger auf den gewünschten Zweig via „mapi_getprops“ ab (siehe Listing 2). Hier trifft man auf eine Hürde: MAPI-Objekte werden über Eigenschaften (Properties) adressiert, die aus Typ und ID bestehen. Die Funktion „mapi_prop_tag“ fügt diese zu einer einfach verwendbaren Konstante zusammen. Eine Liste von Properties (Prefix PR_) und Property Types (Prefix PT_) findet sich in der Datei „include/mapi/mapitags.php“ des Zarafa WebAccess. Alternativ kann man auch über Outlook-Plugins von Drittanbietern [3] selbst nach den passenden Werten suchen.
define('PT_BIN',258); define('PR_IPM_CONTACT_ENTRYID',mapi_prop_tag(PT_BIN,0x36D1)); $root = mapi_msgstore_openentry($default_store); $container = mapi_getprops($root,array(PR_IPM_CONTACT_ENTRYID)); if (isset($container[PR_IPM_CONTACT_ENTRYID])) $contact_entryid = $container[PR_IPM_CONTACT_ENTRYID]; else die('Fehler');
Listing 2
Nachdem nun bekannt ist, wo sich der Ordner mit den Kontaktdaten befindet, kann man diesen in Tabellenform öffnen und die gewünschten Daten abfragen. Die Funktion „mapi_table_queryallrows“ übernimmt dazu als Parameter einen Zeiger auf die Tabelle und ein Array mit den gewünschten Eigenschaften. Im Folgenden werden die Vor- und Nachnamen sowie das Unternehmen aller Kontakte abgefragt:
define('PT_TSTRING',30); define('PR_GIVEN_NAME',mapi_prop_tag(PT_TSTRING,0x3A06)); define('PR_SURNAME',mapi_prop_tag(PT_TSTRING,0x3A11)); define('PR_COMPANY_NAME',mapi_prop_tag(PT_TSTRING,0x3A16)); $properties = array(); $properties["given_name"] = PR_GIVEN_NAME; $properties["surname"] = PR_SURNAME; $properties["company_name"] = PR_COMPANY_NAME; $folder = mapi_msgstore_openentry($default_store, $contact_entryid); $table = mapi_folder_getcontentstable($folder); $list = mapi_table_queryallrows($table,$properties);
Listing 3
Das Array „$list“ enthält nun je Kontakt ein Array aus den abgefragten Daten. Das folgende Code-Fragment demonstriert den Zugriff auf die Daten:
foreach ($list as $item) { echo $item[$properties['company_name']].'<br>'; echo $item[$properties['given_name']].'<br>'; echo $item[$properties['surname']].'<br>'; }
Listing 4
Zarafa WebAccess
Eine sehr umfangreiche Anwendung der PHP-MAPI-Extension ist der Zarafa WebAccess, das Web-Frontend von Zarafa. Dessen nicht verschlüsselte PHP-Skripte bieten dem PHP-Entwickler einen Einblick in den lesenden und schreibenden Zugriff auf E-Mails, Termine, Kontakte, Aufgaben und Notizen. Der WebAccess greift dabei nicht nur auf den eigenen Mailstore zu, sondern auch auf die gemeinsamen Ordner und die freigegebenen Ordner anderer Benutzer.
Öffnet man den Kalender eines Benutzers via WebAccess in einem Browser und parallel dazu denselben Kalender des Benutzers in Microsoft Outlook, offenbart sich ein weiteres Feature der PHP-MAPI-Extension: Wird ein Kalenderdatum per Drag&Drop im WebAccess verschoben, wandert dieses in Outlook sofort mit. Die PHP-MAPI-Befehle arbeiten also nicht nur „realtime“ mit dem MAPI-Store, sie senden auch noch ein „NOTIFY“ an eventuell angemeldete Outlooks, damit die Änderungen auch dort vorgenommen werden.
Fazit
Ob ein neuer Kontakt in die online publizierte Partnerdatenbank eines Unternehmens einzutragen ist, sich der Vorstand eines Vereines geändert hat oder dem Veranstaltungskalender neue Termine hinzuzufügen sind – alles kann mit dem nach wie vor auf sehr vielen PCs vorhandenen Microsoft Outlook getan werden. Als Schnittstelle fungiert der Zarafa Server, der mit Outlook in dessen Sprache MAPI und mit der Internetpräsenz in deren Sprache PHP kommuniziert. Zwar ist Zarafa ein kommerzielles Produkt, doch kauft man sich zu einem akzeptablen Preis neben der Groupware-Funktionalität komfortable und sehr gut dokumentierte Schnittstellen, einen Echtzeitzugriff in jeder Hinsicht und eine sehr einfache und übersichtliche Möglichkeit, komplett selbst gestaltete Kontaktlisten oder Kalender zu verwalten.