Skip to content

MAPI Programmierung mit PyWin32

Disclaimer: Dies ist ein Cross Post der auch auf der GONICUS Webseite erschienen ist. Mit freundlicher Erlaubnis darf ich den auch hier veröffentlichen.

GOsa ist ein Werkzeug zur Administration und kann durch Plugins erweitert werden. Eines dieser Plugins erweitert GOsa um die Fähigkeit, Groupware Systeme, z.B. Exchange zu administrieren. Exchange bietet die Messaging Application Programming Interface (MAPI) in C/C++ und Visual Basic an. Das GOsa Plugin ist jedoch in Python programmiert und muss daher diese Funktionen nach C wrappen. Die Python Win32 Extension bietet eine fast vollständige Implementierung der MAPI an. Zwei Punkte sind jedoch derzeit nicht abgedeckt, das arbeiten mit Access Control Lists (ACLs) und Regeln (Rules).

Damit auch diese Funktionen verwendet werden können, habe ich die PyWin32 MAPI Implementierung um die Fehlenden Funktionen erweitert. In drei Blog Posts werde ich folgende Themen behandeln

– Dieser Post: Aufsetzen einer Umgebung zur Pywin32 Entwicklung/Kompilierung

– Teil 2: GONICUS Patch für MAPI Extensions

– Teil 3: Setzen von Zugriffsberechtigungen von Ordnern

– Teil 4: Erstellen einer OutOfOffice Reply Methode.

Zunächst gibt es hier ein paar Links die bei der Entwicklung sehr hilfreich sein können.

Python Win32 Extension Webseite

MSDN MAPI Referenz mit Interfaces und Strukturen (leider eher schlecht als recht)

MSDN Artikel zum erstellen einer OutOfOffice Reply Regel

MSDN Artikel zum ändern einer Ordnerberechtigung mit der MAPI

Python C API Referenz um Python Strukturen in C zu verwenden (PDF)

Um die MAPI Erweiterung der Win32 Extension zu implementieren, muss zunächst der Quellcode vorliegen, der sich im CVS Repository befindet. (Die Erweiterungen der MAPI liegt den Entwicklern als Patch vor, ich hoffe das er es in den stabilen Zweig schafft, damit der Kompilier-Schritt wegfallen kann).

Als weitere Vorraussetzung zum erfolgreichen kompilieren muss ein Windows SDK auf der Maschine installiert sein. (Ggf. muss auch Exchange installiert sein, aber das wird zur Ausführung ja sowieso benötigt)

Um das Buildscript (setup.py) fehlerfrei ausführen zu können, waren auf meinem System (Windows 2003 Server mit Windows Exchange 2000) noch einige Änderungen notwendig.

Änderung in der setup.py :

Zeile 1596 (axdebug) auskommentieren

Zeile 1651-1700 auskommentieren

Zeile 2000 (‘win32comext.axdebug’,) auskommentieren

Änderungen in der Klasse PyINameSpaceTreeControl (.h und .cpp):

PyINameSpaceTreeControl.h

Zeile 115: Datentyp DWORD zu NSTCGNI ändern

PyINameSpaceTreeControl.cpp

Zeile 968 und 978 in *ret = (EXPLORER_BROWSER_OPTIONS) PyLong_AsUnsignedLongMask(ob); ändern

Zu guter letzt müssen noch Änderungen an dem Buildverfahren von Scintilla vorgenommen werden:

Pythonwin/Scintilla/makefile_pythonwin Zeile 40:

@cd win32 && $(MAKE) /$(MAKEFLAGS) /f scintilla_vc6.mak DIR_BIN=$(SUB_DIR_BIN) DIR_O=$(SUB_DIR_O) LEXCOMPONENT=$(SCINTILLA_DLL) COMPONENT=dummy $(SCINTILLA_DLL) & cd..

+ @cd win32 && $(MAKE) /$(MAKEFLAGS) /f scintilla.mak DIR_BIN=$(SUB_DIR_BIN) DIR_O=$(SUB_DIR_O) LEXCOMPONENT=$(SCINTILLA_DLL) COMPONENT=dummy $(SCINTILLA_DLL) & cd..

Pythonwin/Scintilla/win32/scintilla_vc6.mak und Pythonwin/Scintilla/win32/scintilla.mak
LDFLAGS=-OPT:REF -LTCG -DEBUG (-OPT:NOWIN98 entfernen)

Nun sollte der erfolgreichen Ausführung nichts mehr im Weg stehen:

$> python setup.py -q build

Je nach vorhandenen Bibliotheken und SDKs werden einige Extensions nicht kompiliert, was aber die Verwendung mit der MAPI nicht beeinflussen sollte.

Nun kann der Patch angewendet werden und ein zweiter Kompilerdurchlauf erfolgen. Am Ende befindet sich im Build Verzeichnis (pywin32\build\lib.win32-2.6\win32comext\mapi\) die kompilierte Version der MAPI die dann in das Python Installationsverzeichnis kopiert werden kann.

Für Fragen und Anmerkungen bitte eine Mail an info@gonicus.de schicken oder hier kommentieren.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.