Python API-Wrapper Tutorial
Dieses Dokument stellt die Python API Bibliothek vor, mit der sich der MailStore Server administrieren lässt.
Installation
Die API Bibliothek wurde mit den Python Versionen 3.2 bis 3.4 getestet. Sie ist kompatibel mit der 32-Bit sowie der 64-Bit Version von Python.
Das Python Installationspaket kann von der Python Download Seite heruntergeladen werden. Alternativ kann Python über den Paket Manager der Distribution installiert werden.
Zusätzlich wird die MailStore Python API Bibliothek benötigt. Diese muss in das mailstore-Verzeichnis des site-packages-Verzeichnisses der Python-Installation kopiert werden. Der Ort des site-packages-Verzeichnisses lässt sich mittels
python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"
herausfinden.
Log in
Die Bibiliothek kann mittels
import mailstore
importiert werden. Nun kann die mailstore.server.Client Klasse instanziiert werden.
serverClient = mailstore.server.Client(username="admin", password="admin", host="127.0.0.1", port=8463)
Standardwerte können ausgelasen werden.
Die verfügbaren Parameter und die Standardwerte sind
username = "admin"
password = "admin"
host = "127.0.0.1"
port = 8463
autoHandleToken = True
waitTime = 1
logLevel = 2
Wenn autoHandleToken aktiviert ist, muss man sich nicht manuell um die Verarbeitung des zurückgegebenen Tokens kümmern. Die Bibliothek kümmert sich darum. Nach Beendigung der Methode wird das Ergebnis zurückgeliefert. Wenn autoHandleToken deaktiviert ist, wird das Token zurückgegeben, welches den Aufruf identifiziert. Mehr dazu später.
Der waitTime Wert gibt die Zeit in Sekunden an, die die Bibliothek zwischen zwei aufrufen von get-status wartet. get-status wird aufgerufen, wenn der Status einer Methode abgerufen werden soll, die ein Token zurückgeliefert hat.
logLevel muss im Bereich von 0 bis 4 liegen. Die Loglevel sind wie folgt definiert
0 : "NONE" 1 : "ERROR" 2 : "WARNING" 3 : "INFO" 4 : "DEBUG"
Log-Einträge werden auf stdout ausgegeben.
Einfache Aufrufe
Einfache Aufrufe liefern das Ergebnis sofort zurück
print(serverClient.GetServerInfo())
{'machineName': 'WIN2012MS', 'version': '8.1.2.9268'}
Wenn der Aufruf erfolgreich war, wird der Ergebnis in Form eines Python Dictionarys zurückgegeben. Wenn der Aufruf misslang, wird ein HTTP Fehler geworfen.
Fehlerbehandlung
Wenn ein Fehler auftrit, wirft die aufrufende Methode eine Exception. Alle MailStore Fehlerklassen sind von der Basisklasse mailstore.errors.MailStoreBaseError abgeleitet, welche ihrerseits von Exception abgeleitet ist.
try:
print(serverClient.GetUserInfo("not_such_user"))
except mailstore.errors.MailStoreBaseError as e:
print(e)
ERROR ('internal MailStore Server error',)
500 Internal Server Error https://127.0.0.1:8463/JSON/Invoke/GetUserInfo POST userName=not_such_user Command in MethodList: True
Einfache Beispiele
Um die detaillierten Informationen aller Benutzer zu erhalten:
serverClient = mailstore.server.Client(username="admin", password="admin", host="127.0.0.1", port=8463)
for user in serverClient.GetUserList():
print(serverClient.GetUserInfo(user["userName"]))
Eine Liste aller zugewiesenen E-Mail-Adressen erhält man mit:
serverClient = mailstore.server.Client(username="admin", password="admin", host="127.0.0.1", port=8463)
emailaddresses = list()
for user in serverClient.GetUserList():
emailaddresses += serverClient.GetUserInfo(user["userName"])['emailAddresses']
print(emailaddresses)
Lang laufende Methoden
Lang laufende Methoden wie VerifyStore laufen asynchron im Hintergrund auf dem Server. Wenn autoHandleToken auf True (Standardwert) gesetzt ist, fragt die Bibliothek den Server automatisch, periodisch nach Statusänderungen ab und gibt das Ergebnis zurück, sobald dieses vorliegt. Ist autoHandleToken deaktiviert, wird das Token zurückgegeben. In diesem Fall muss man sich um die Statusaktuelisierungen manuell kümmern. Dafür existieren Hilfsmethoden.
autoHandleToken ist aktiviert:
serverClient = mailstore.server.Client(autoHandleToken=True)
storeID = 1
print(serverClient.VerifyStore(storeID))
{'status': 'succeeded', 'progressPercentage': 100, 'messages': [{'text': 'Verifying file group #2...', 'type': 'line'}, {'text': 'Creating a list of messages to be verified...', 'type': 'line'}, {'text': '234 messages are about to be verified.', 'type': 'line'}, {'text': 'Verifying...', 'type': 'line'}, {'text': ' 100 messages verified...', 'type': 'line'}, {'text': ' 200 messages verified...', 'type': 'line'}, {'text': ' 234 messages verified.', 'type': 'line'}, {'text': 'Finished. No errors have been found.', 'type': 'line'}]}
Es ist möglich, die Statusaktualisierung manuell durchzuführen, dazu muss das Token an die GetStatus Methode übergeben werden. Der Aufruf ist beendet wenn der status nicht mehr running ist. Der im Beispiel gezeigte Wartezeitraum (time.sleep(1)) entspricht dem waitTime-Wert, der der Klasse mitgegeben werden kann.
import time
serverClient = mailstore.server.Client(autoHandleToken=False)
storeID = 2
token = serverClient.VerifyStore(storeID)
print(token)
while True:
time.sleep(1)
status = serverClient.GetStatus(token)
print(status)
if status["status"] != "running":
break
{'statusUrl': '/JSON/Status/243fc983-89c3-19ef-196a-dbe082894cc5', 'statusToken': '243fc983-89c3-19ef-196a-dbe082894cc5'}
{'progressPercentage': 0, 'messages': [{'type': 'line', 'text': 'Verifying file group #2...'}, {'type': 'line', 'text': 'Creating a list of messages to be verified...'}, {'type': 'line', 'text': '234 messages are about to be verified.'}, {'type': 'line', 'text': 'Verifying...'}, {'type': 'line', 'text': ' 100 messages verified...'}], 'status': 'running'}
{'progressPercentage': 100, 'messages': [{'type': 'line', 'text': 'Verifying file group #2...'}, {'type': 'line', 'text': 'Creating a list of messages to be verified...'}, {'type': 'line', 'text': '234 messages are about to be verified.'}, {'type': 'line', 'text': 'Verifying...'}, {'type': 'line', 'text': ' 100 messages verified...'}, {'type': 'line', 'text': ' 200 messages verified...'}, {'type': 'line', 'text': ' 234 messages verified.'}, {'type': 'line', 'text': 'Finished. No errors have been found.'}], 'status': 'succeeded'}
Man kann das Token an die HandleToken-Methode übergeben. In diesem Fall entspricht das Verhalten exakt dem, als wenn man autoHandleToken auf True gesetzt hätte..
serverClient = mailstore.server.Client(autoHandleToken=False)
storeID = 2
token = serverClient.VerifyStore(storeID)
print(token)
print(serverClient.HandleToken(token))
Das Verhalten des Token-Handlings kann global und lokal gesetzt werden. Wenn die Klasse mit autoHandleToken=True instanziiert wird, von einzelne Methoden jedoch das Token benötigt wird, kann der Methode der zusätzliche Parameter autoHandleToken=False übergeben werden. Umgekehrt ist dies genauso möglich. Die Klasse wird mit autoHandleToken=False instanziiert, die einzene Methode kann dennoch mit dem Parameter autoHandleToken=True aufgerufen werden. Methoden die nicht lang laufend sind, akzeptieren den autoHandleToken-Parameter nicht.
serverClient = mailstore.server.Client(autoHandleToken=False)
storeID = 2
token = serverClient.VerifyStore(storeID, autoHandleToken=True)
print(token)
{'status': 'succeeded', 'messages': [{'text': 'Verifying file group #2...', 'type': 'line'}, {'text': 'Creating a list of messages to be verified...', 'type': 'line'}, {'text': '234 messages are about to be verified.', 'type': 'line'}, {'text': 'Verifying...', 'type': 'line'}, {'text': ' 100 messages verified...', 'type': 'line'}, {'text': ' 200 messages verified...', 'type': 'line'}, {'text': ' 234 messages verified.', 'type': 'line'}, {'text': 'Finished. No errors have been found.', 'type': 'line'}], 'progressPercentage': 100}
Abbrechen lang laufender Methoden
Aktuell können lang laufende Methoden nicht abgebrochen werden. Dies ist keine Limitierung der Python Bibliothek sondern der Management API als solches. Dieser Umstand wird in der nächsten MailStore Server Hauptversion behoben werden.
Formatierung der Ausgabe
Es gibt eine Hilfsfunktion, die die zurückgelieferten Dictionarys formatiert ausgeben kann.
mailstore.pprint(serverClient.GetUserInfo("admin"))
authentication integrated
distinguishedName
privileges
admin
fullName Administrator
userName admin
Funktionsübersicht
Alle Methoden die in der Übersicht aufgelistet sind, sind auch implementiert.
Zusätzliche Methoden
Zusätzliche Methoden sind verfügbar. Bitte schauen Sie in den Quellcode der Bibliothek, um mehr Details zu erfahren.