Anzeige
Anzeige
Entwicklung
Artikel merken

Zugriff auf Groupwaredaten aus PHP-Projekten heraus: MAPI@TYPO3

Open-Source-Groupware ist in vielen Varianten erhältlich. Von einfachen Webapplikationen bis hin zu sehr komplexen Systemen, die mit den proprietären Platzhirschen wie Exchange oder Notes konkurrieren, ist alles vertreten. Aus Sicht eines TYPO3-Entwicklers beziehungsweise Anwenders ist eine gute PHP-Integration ein wichtiges Merkmal für eine Groupware-Lösung.

5 Min. Lesezeit
Anzeige
Anzeige

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.

Anzeige
Anzeige

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.

Anzeige
Anzeige

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.

Anzeige
Anzeige

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.

Anzeige
Anzeige
PHP
$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.

PHP
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:

PHP
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:

Anzeige
Anzeige
PHP
 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.

Mehr zu diesem Thema
Fast fertig!

Bitte klicke auf den Link in der Bestätigungsmail, um deine Anmeldung abzuschließen.

Du willst noch weitere Infos zum Newsletter? Jetzt mehr erfahren

Anzeige
Anzeige
Schreib den ersten Kommentar!
Bitte beachte unsere Community-Richtlinien

Wir freuen uns über kontroverse Diskussionen, die gerne auch mal hitzig geführt werden dürfen. Beleidigende, grob anstößige, rassistische und strafrechtlich relevante Äußerungen und Beiträge tolerieren wir nicht. Bitte achte darauf, dass du keine Texte veröffentlichst, für die du keine ausdrückliche Erlaubnis des Urhebers hast. Ebenfalls nicht erlaubt ist der Missbrauch der Webangebote unter t3n.de als Werbeplattform. Die Nennung von Produktnamen, Herstellern, Dienstleistern und Websites ist nur dann zulässig, wenn damit nicht vorrangig der Zweck der Werbung verfolgt wird. Wir behalten uns vor, Beiträge, die diese Regeln verletzen, zu löschen und Accounts zeitweilig oder auf Dauer zu sperren.

Trotz all dieser notwendigen Regeln: Diskutiere kontrovers, sage anderen deine Meinung, trage mit weiterführenden Informationen zum Wissensaustausch bei, aber bleibe dabei fair und respektiere die Meinung anderer. Wir wünschen Dir viel Spaß mit den Webangeboten von t3n und freuen uns auf spannende Beiträge.

Dein t3n-Team

Melde dich mit deinem t3n Account an oder fülle die unteren Felder aus.

Bitte schalte deinen Adblocker für t3n.de aus!
Hallo und herzlich willkommen bei t3n!

Bitte schalte deinen Adblocker für t3n.de aus, um diesen Artikel zu lesen.

Wir sind ein unabhängiger Publisher mit einem Team von mehr als 75 fantastischen Menschen, aber ohne riesigen Konzern im Rücken. Banner und ähnliche Werbemittel sind für unsere Finanzierung sehr wichtig.

Schon jetzt und im Namen der gesamten t3n-Crew: vielen Dank für deine Unterstützung! 🙌

Deine t3n-Crew

Anleitung zur Deaktivierung
Artikel merken

Bitte melde dich an, um diesen Artikel in deiner persönlichen Merkliste auf t3n zu speichern.

Jetzt registrieren und merken

Du hast schon einen t3n-Account? Hier anmelden

oder
Auf Mastodon teilen

Gib die URL deiner Mastodon-Instanz ein, um den Artikel zu teilen.

Anzeige
Anzeige