Difference between revisions of "Python API Wrapper Tutorial"
[unchecked revision] | [checked revision] |
Ltalaschus (talk | contribs) |
|||
(43 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
__NOTOC__ | __NOTOC__ | ||
+ | <p class=msnote>'''Important notice:''' The Python API wrapper for the MailStore Service Provider Edition Management API provided on this website, represents an example implementation of an API client. This wrapper should help system administrators and developers to quickly understand how the Management API of MailStore SPE works and how to use it in own scripts. Please understand that beyond this documentation no further support for the Python API wrapper is provided. Unless stated otherwise, the Python API wrapper as well as all related example scripts are released under the terms an conditions of the [[wikipedia:MIT_License|MIT License]].</p> | ||
− | This document | + | This document explains the installation and usage of the Python API wrapper for the MailStore SPE Management API. In order to prevent loss of data, service interruption or other problems, it is highly recommended to use a non-productive test environment for this tutorial as well as for script development in general. The 30-day-trial version of MailStore Server is perfectly suited for this. |
− | + | {{Template:API Service Provider Access}} | |
− | The API library is tested against Python 3. | + | == Installation == |
+ | The API wrapper library is tested against Python 3.6 and newer and is compatible with 32bit and 64bit versions of Python. | ||
− | + | Python binaries for various operating systems can be downloaded from the [http://www.python.org/download/ Python download page] or installed using the package manager of most Linux distributions. | |
+ | |||
+ | Additionally create a folder "mailstore" in the Python's site-packages directory and extract the files from the [[Media:python-api-wrapper.zip|Python API wrapper library]] into this folder. | ||
+ | |||
+ | In a UNIX like operating system the location of the site-packages directory can be found by executing the following command in a shell: | ||
− | |||
<source lang="python" smart-tabs="true" toolbar="false" gutter="false"> | <source lang="python" smart-tabs="true" toolbar="false" gutter="false"> | ||
− | + | python3 -c "import site; print(site.getsitepackages())" | |
</source> | </source> | ||
− | + | In Windows the location of the site-packages directory can be found by opening a ''cmd'', navigating in the Python3 installation directory and executing the following command: | |
− | |||
<source lang="python" smart-tabs="true" toolbar="false" gutter="false"> | <source lang="python" smart-tabs="true" toolbar="false" gutter="false"> | ||
− | + | python -c "import site; print(site.getsitepackages())" | |
</source> | </source> | ||
− | + | ||
+ | == Instantiating the API Client == | ||
+ | Before the API wrapper library can be used, it must first be imported with: | ||
+ | |||
<source lang="python" smart-tabs="true" toolbar="false" gutter="false"> | <source lang="python" smart-tabs="true" toolbar="false" gutter="false"> | ||
− | + | import mailstore | |
</source> | </source> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Now the ''mailstore.mgmt.SPEClient'' class can be instantiated as follows: | |
+ | |||
<source lang="python" smart-tabs="true" toolbar="false" gutter="false"> | <source lang="python" smart-tabs="true" toolbar="false" gutter="false"> | ||
− | + | speClient = mailstore.mgmt.SPEClient(username="admin", password="admin", host="127.0.0.1", port=8474, instanceID="example") | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</source> | </source> | ||
− | |||
− | + | Default values can be omitted. Credentials of an admin of the global SPE installation have to be used. Find a listing of all default values in the following table: | |
− | '' | + | {| class="wikitable" |
− | + | ! width="150px" | Parameter | |
− | + | ! width="100px" | Default Value | |
− | + | ! Description | |
− | + | |- | |
− | + | | <tt>username</tt> | |
+ | | admin | ||
+ | | Username used for connecting to the API. | ||
+ | |- | ||
+ | | <tt>password</tt> | ||
+ | | admin | ||
+ | | Password used for connecting to the API. | ||
+ | |- | ||
+ | | <tt>host</tt> | ||
+ | | 127.0.0.1 | ||
+ | | Hostname or IP address of MailStore SPE Management Server. | ||
+ | |- | ||
+ | | <tt>port</tt> | ||
+ | | 8474 | ||
+ | | TCP port on which the Management Server is listening for API requests. | ||
+ | |- | ||
+ | | <tt>autoHandleToken</tt> | ||
+ | | True | ||
+ | | If set to ''True'', the caller does not need to handle tokens of long running tasks, but instead has to wait for the result. When set to ''False'' and the ''statusCode'' is ''running'', a status token is returned and must be handled appropriately by the caller of the method. Further details about token handling is described the corresponding section [[#Automatic Token Handling|Automatic Token Handling]] of this document. | ||
+ | |- | ||
+ | | <tt>waitTime</tt> | ||
+ | | 1000 | ||
+ | | Specifies the number of milliseconds the API should wait for a final result. Otherwise the process is treated as ''running'', in which case token handling as defined by the status of ''autoHandleToken'' becomes necessary. | ||
+ | |- | ||
+ | | <tt>callback</tt> | ||
+ | | None | ||
+ | | A callback function to which interim statuses of long running tasks should be passed. This allows keeping track of the tasks' progress even if ''autoHandleToken'' is enabled. This can be quite useful in order to notify users about the progress without having to deal with the token logic as a whole. | ||
+ | |- | ||
+ | | <tt>logLevel</tt> | ||
+ | | 2 | ||
+ | | Has to be in the range ''0'' to ''4'', where 0 (''NONE'') has the lowest verbosity and 4 (''DEBUG'') the highest. The loglevels are defined in the following order (low to high verbosity) ''NONE'', ''ERROR'', ''WARNING'', ''INFO'' and ''DEBUG''. Log entries will always be printed to ''stdout''. | ||
+ | |- | ||
+ | | <tt>ignoreInvalidSSLCerts</tt> | ||
+ | | False | ||
+ | | Has to be set to ''True'' or ''False''. Has to be enabled if untrusted certificates are used, otherwise an error occurs when using recent Python versions (>= 3.4.3). | ||
+ | |- | ||
+ | | <tt>instanceID</tt> | ||
+ | | None | ||
+ | | The instance id of the instance for instance specific commands. Can be changed between calls by setting the ''instanceID'' variable of the instantiated ''SPEClient''. | ||
+ | |} | ||
− | |||
− | |||
− | = | + | == Invoking API Method == |
− | + | After the API client has been successfully instantiated, API methods can easily be invoked. When the method call was successful, the ''statusCode'' is ''succeeded'' and the result is stored in the dictionary ''result'' as shown in the following example: | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
<source lang="python" smart-tabs="true" toolbar="false" gutter="false"> | <source lang="python" smart-tabs="true" toolbar="false" gutter="false"> | ||
− | + | print(speClient.GetEnvironmentInfo()["result"]) | |
− | + | {'userName': 'admin', 'systemProperties': {'operatingSystem': 'Microsoft Windows Server 2012 R2 Standard', 'totalPhysicalMemory': 2146942976, 'processors': ['Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz']}, 'licenseeID': 10435, 'version': '9.0.3.9873', 'licenseeName': 'MailStore Software GmbH', 'copyright': 'Copyright (c) 2005-2014 MailStore Software GmbH', 'serverName': 'win-2012-r2-x64'} | |
</source> | </source> | ||
− | |||
− | + | If ''autoHandleToken'' was set to ''False'' and the ''statusCode'' returns ''running'', manual token handling is required as described in the [[#Auto Handle Token|Automatic Token Handling]] section. | |
− | + | For any other ''statusCode'' value than ''succeeded'' and ''running'' the occurrence of an error has to be assumed, in which further information such as the error message and error details are available in the dictionary ''error'' as shown below: | |
− | |||
<source lang="python" smart-tabs="true" toolbar="false" gutter="false"> | <source lang="python" smart-tabs="true" toolbar="false" gutter="false"> | ||
− | + | ||
− | + | speClient.instanceID = "example" | |
− | + | userInfo = speClient.GetUserInfo("john.doe") | |
− | + | ||
+ | if userInfo["statusCode"] == 'succeeded': | ||
+ | print(userInfo["result"]["emailAddresses"]) | ||
+ | else: | ||
+ | print(userInfo["error"]["message"]) | ||
</source> | </source> | ||
− | + | === Examples === | |
+ | Create a list of all email addresses assigned to MailStore users. | ||
+ | |||
<source lang="python" smart-tabs="true" toolbar="false" gutter="false"> | <source lang="python" smart-tabs="true" toolbar="false" gutter="false"> | ||
− | + | speClient = mailstore.mgmt.SPEClient() | |
− | + | speClient.instanceID = "example" | |
− | + | emailAddresses = list() | |
− | + | for user in speClient.GetUsers()["result"]: | |
− | + | emailAddresses += speClient.GetUserInfo(user["userName"])["result"]["emailAddresses"] | |
− | + | print(emailAddresses) | |
− | |||
</source> | </source> | ||
− | + | Create a list of all admin users of all instances where the service provider access is enabled. | |
− | |||
<source lang="python" smart-tabs="true" toolbar="false" gutter="false"> | <source lang="python" smart-tabs="true" toolbar="false" gutter="false"> | ||
− | + | speClient = mailstore.mgmt.SPEClient() | |
− | + | ||
− | + | for instance in speClient.GetInstances("* .running")["result"]: | |
− | + | speClient.instanceID = instance["instanceID"] | |
− | + | if speClient.GetArchiveAdminEnabled()["result"]["value"]: | |
− | + | for user in speClient.GetUsers()["result"]: | |
+ | if "admin" in speClient.GetUserInfo(user["userName"])["result"]["privileges"]: | ||
+ | print(instance["instanceID"], user["userName"]) | ||
</source> | </source> | ||
− | + | == Long Running Tasks == | |
+ | The execution of certain API methods like ''VerifyStore'' may take several minutes or even hours until it finishes. There are different options available to deal with these long running tasks: | ||
+ | |||
+ | # [[#Automatic Token Handling|Automatic Token Handling]] | ||
+ | # [[#Automatic Token Handling with Callback Function|Automatic Token Handling with Callback Function]] | ||
+ | # [[#Manual Token Handling|Manual Token Handling]] | ||
+ | |||
+ | Generally it is recommended to expect that every method call can become a long running task, as this depends on the ''waitTime'' value, the called method but also the overall load on the server. Thus it is not advisable to globally turn off automatic token handling when instantiating the API client. | ||
+ | |||
+ | If desired, automatic token handling can be enabled or disabled for each invoked method by adding ''autoHandleToken=True/False'' to the method's argument list. | ||
+ | |||
+ | Once a method has been invoked with manual token handling or a callback function, it can be cancelled by using the ''CancelAsync'' method as described in [[#Cancelling Long Running Tasks|Cancelling Long Running Tasks]]. | ||
+ | |||
+ | === Automatic Token Handling === | ||
+ | When ''autoHandleToken'' is set to ''True'' (default), the wrapper polls the status of long running tasks automatically in the background and will return the final result when the process has ended. | ||
+ | |||
+ | ==== Code ==== | ||
<source lang="python" smart-tabs="true" toolbar="false" gutter="false"> | <source lang="python" smart-tabs="true" toolbar="false" gutter="false"> | ||
− | + | import mailstore | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | speClient = mailstore.mgmt.SPEClient(autoHandleToken=True) | |
+ | speClient.instanceID = "example" | ||
+ | storeID = 1 | ||
+ | print(speClient.VerifyStore(storeID)) | ||
</source> | </source> | ||
− | + | ||
− | <source lang=" | + | ==== Output ==== |
− | + | <source lang="text" smart-tabs="true" toolbar="false" gutter="false"> | |
− | + | {'logOutput': None, 'statusText': None, 'error': None, 'percentProgress': 100, 'token': 'd242d822a59bd4db308eef8b85af7d2a', 'result': None, 'statusVersion': 71, 'statusCode': 'succeeded'} | |
− | |||
− | |||
− | |||
− | |||
− | |||
</source> | </source> | ||
− | + | ||
+ | === Automatic Token Handling with Callback Function === | ||
+ | If a caller wants to keep track of the progress of a long running task (i.e. to inform the user about the progress), although automatic token handling was enabled, he could pass a function as ''callback'' argument to the instance of the API client. | ||
+ | |||
+ | ==== Code ==== | ||
<source lang="python" smart-tabs="true" toolbar="false" gutter="false"> | <source lang="python" smart-tabs="true" toolbar="false" gutter="false"> | ||
− | + | import mailstore | |
− | + | ||
− | + | def showProgress(progress): | |
− | + | print(progress["logOutput"], end="", flush=True) | |
− | + | ||
− | + | speClient = mailstore.mgmt.SPEClient(autoHandleToken=True, callback=showProgress, instanceID="example") | |
− | + | storeID = 2 | |
− | + | print(speClient.VerifyStore(storeID)) | |
− | |||
− | |||
</source> | </source> | ||
− | = | + | ==== Output ==== |
+ | <source lang="text" smart-tabs="true" toolbar="false" gutter="false"> | ||
+ | Verifying file group #3... | ||
+ | Creating a list of messages to be verified... | ||
+ | 1249 messages are about to be verified. | ||
+ | Verifying... | ||
+ | 100 messages verified... | ||
+ | 200 messages verified... | ||
+ | 300 messages verified... | ||
+ | 400 messages verified... | ||
+ | 500 messages verified... | ||
+ | 600 messages verified... | ||
+ | 700 messages verified... | ||
+ | 800 messages verified... | ||
+ | 900 messages verified... | ||
+ | 1000 messages verified... | ||
+ | 1100 messages verified... | ||
+ | 1200 messages verified... | ||
+ | 1249 messages verified. | ||
+ | Finished. No errors have been found. | ||
+ | {'error': None, 'result': None, 'logOutput': ' 1000 messages verified...\r\n 1100 messages verified...\r\n 1200 messages verified...\r\n 1249 messages verified.\r\nFinished. No errors have been found.\r\n', 'token': 'c56f032d9db263133c1a413f79744b84', 'statusVersion': 71, 'statusText': None, 'percentProgress': 100, 'statusCode': 'succeeded'} | ||
+ | </source> | ||
− | If | + | === Manual Token Handling === |
+ | If ''autoHandleToken'' is set to ''False'' the caller must handle long running tasks and the corresponding tokens all by itself. To poll for status updates, the ''GetStatus'' method must be called periodically passing the last returned result as parameter. ''GetStatus'' will extract the status token itself, poll for the latest update and return the received data to the caller again. The main call has finished when the ''statusCode'' changes to something different than ''running''. Calling ''GetStatus'' without passing a status token will result in an exception. | ||
+ | ==== Code ==== | ||
<source lang="python" smart-tabs="true" toolbar="false" gutter="false"> | <source lang="python" smart-tabs="true" toolbar="false" gutter="false"> | ||
− | + | import mailstore | |
− | + | import time | |
− | + | ||
− | + | speClient = mailstore.mgmt.SPEClient(autoHandleToken=False) | |
− | + | speClient.instanceID = "example" | |
− | + | storeID = 3 | |
− | + | status = speClient.VerifyStore(storeID) | |
− | + | ||
− | + | while True: | |
− | + | if status["statusCode"] != "running": | |
− | + | break | |
− | + | print(status["logOutput"], end="", flush=True) | |
− | + | status = speClient.GetStatus(status) | |
+ | time.sleep(1) | ||
+ | </source> | ||
+ | |||
+ | ==== Output ==== | ||
+ | <source lang="text" smart-tabs="true" toolbar="false" gutter="false"> | ||
+ | Verifying file group #3... | ||
+ | Creating a list of messages to be verified... | ||
+ | 1249 messages are about to be verified. | ||
+ | Verifying... | ||
+ | 100 messages verified... | ||
+ | 200 messages verified... | ||
+ | 300 messages verified... | ||
+ | 400 messages verified... | ||
+ | 500 messages verified... | ||
+ | 600 messages verified... | ||
+ | 700 messages verified... | ||
+ | 800 messages verified... | ||
+ | 900 messages verified... | ||
+ | 1000 messages verified... | ||
+ | 1100 messages verified... | ||
+ | 1200 messages verified... | ||
+ | 1249 messages verified. | ||
+ | Finished. No errors have been found. | ||
</source> | </source> | ||
− | = | + | === Cancelling Long Running Tasks === |
+ | Tasks invoked by using the callback method or manual token handling, can be canceled at any time by using the ''CancelAsync'' method. Please notice that the API does not acknowledge the success of the cancellation request. Instead the caller must continue to monitor the ''statusCode'' of the canceled method. | ||
− | + | ==== Code ==== | |
<source lang="python" smart-tabs="true" toolbar="false" gutter="false"> | <source lang="python" smart-tabs="true" toolbar="false" gutter="false"> | ||
− | + | import mailstore | |
+ | import time | ||
− | + | speClient = mailstore.mgmt.SPEClient(autoHandleToken=False) | |
− | + | speClient.instanceID = "example" | |
− | + | storeID = 3 | |
− | + | status = speClient.VerifyStore(storeID) | |
− | + | ||
− | + | while True: | |
− | + | if status["statusCode"] != "running": | |
− | + | break | |
− | + | print(status["logOutput"], end="", flush=True) | |
+ | status = speClient.GetStatus(status) | ||
+ | time.sleep(1) | ||
+ | speClient.CancelAsync(status) | ||
</source> | </source> | ||
+ | |||
+ | ==== Output ==== | ||
+ | <source lang="text" smart-tabs="true" toolbar="false" gutter="false"> | ||
+ | Verifying file group #3... | ||
+ | Creating a list of messages to be verified... | ||
+ | 1249 messages are about to be verified. | ||
+ | Verifying... | ||
+ | 100 messages verified... | ||
+ | 200 messages verified... | ||
+ | 300 messages verified... | ||
+ | 400 messages verified... | ||
+ | 500 messages verified... | ||
+ | 600 messages verified... | ||
+ | 700 messages verified... | ||
+ | 800 messages verified... | ||
+ | 900 messages verified... | ||
+ | 1000 messages verified... | ||
+ | 1100 messages verified... | ||
+ | </source> | ||
+ | |||
+ | == Methods Overview == | ||
+ | All methods listed in the [[Management API - Function Reference|function reference]] are implemented in the Python API library. Use | ||
+ | |||
+ | pydoc3 mailstore.mgmt.SPEClient | ||
+ | |||
+ | to access the build in documentation, which also includes an overview of all methods and their parameters. |
Latest revision as of 08:42, 20 September 2024
Important notice: The Python API wrapper for the MailStore Service Provider Edition Management API provided on this website, represents an example implementation of an API client. This wrapper should help system administrators and developers to quickly understand how the Management API of MailStore SPE works and how to use it in own scripts. Please understand that beyond this documentation no further support for the Python API wrapper is provided. Unless stated otherwise, the Python API wrapper as well as all related example scripts are released under the terms an conditions of the MIT License.
This document explains the installation and usage of the Python API wrapper for the MailStore SPE Management API. In order to prevent loss of data, service interruption or other problems, it is highly recommended to use a non-productive test environment for this tutorial as well as for script development in general. The 30-day-trial version of MailStore Server is perfectly suited for this.
In order to run API commands that work on an instance, service provider access must be enabled for that instance. This includes all API commands that require an instanceID argument, except those that affect archive stores and search indexes. These can be run using the API without service provider access.
Installation
The API wrapper library is tested against Python 3.6 and newer and is compatible with 32bit and 64bit versions of Python.
Python binaries for various operating systems can be downloaded from the Python download page or installed using the package manager of most Linux distributions.
Additionally create a folder "mailstore" in the Python's site-packages directory and extract the files from the Python API wrapper library into this folder.
In a UNIX like operating system the location of the site-packages directory can be found by executing the following command in a shell:
python3 -c "import site; print(site.getsitepackages())"
In Windows the location of the site-packages directory can be found by opening a cmd, navigating in the Python3 installation directory and executing the following command:
python -c "import site; print(site.getsitepackages())"
Instantiating the API Client
Before the API wrapper library can be used, it must first be imported with:
import mailstore
Now the mailstore.mgmt.SPEClient class can be instantiated as follows:
speClient = mailstore.mgmt.SPEClient(username="admin", password="admin", host="127.0.0.1", port=8474, instanceID="example")
Default values can be omitted. Credentials of an admin of the global SPE installation have to be used. Find a listing of all default values in the following table:
Parameter | Default Value | Description |
---|---|---|
username | admin | Username used for connecting to the API. |
password | admin | Password used for connecting to the API. |
host | 127.0.0.1 | Hostname or IP address of MailStore SPE Management Server. |
port | 8474 | TCP port on which the Management Server is listening for API requests. |
autoHandleToken | True | If set to True, the caller does not need to handle tokens of long running tasks, but instead has to wait for the result. When set to False and the statusCode is running, a status token is returned and must be handled appropriately by the caller of the method. Further details about token handling is described the corresponding section Automatic Token Handling of this document. |
waitTime | 1000 | Specifies the number of milliseconds the API should wait for a final result. Otherwise the process is treated as running, in which case token handling as defined by the status of autoHandleToken becomes necessary. |
callback | None | A callback function to which interim statuses of long running tasks should be passed. This allows keeping track of the tasks' progress even if autoHandleToken is enabled. This can be quite useful in order to notify users about the progress without having to deal with the token logic as a whole. |
logLevel | 2 | Has to be in the range 0 to 4, where 0 (NONE) has the lowest verbosity and 4 (DEBUG) the highest. The loglevels are defined in the following order (low to high verbosity) NONE, ERROR, WARNING, INFO and DEBUG. Log entries will always be printed to stdout. |
ignoreInvalidSSLCerts | False | Has to be set to True or False. Has to be enabled if untrusted certificates are used, otherwise an error occurs when using recent Python versions (>= 3.4.3). |
instanceID | None | The instance id of the instance for instance specific commands. Can be changed between calls by setting the instanceID variable of the instantiated SPEClient. |
Invoking API Method
After the API client has been successfully instantiated, API methods can easily be invoked. When the method call was successful, the statusCode is succeeded and the result is stored in the dictionary result as shown in the following example:
print(speClient.GetEnvironmentInfo()["result"])
{'userName': 'admin', 'systemProperties': {'operatingSystem': 'Microsoft Windows Server 2012 R2 Standard', 'totalPhysicalMemory': 2146942976, 'processors': ['Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz']}, 'licenseeID': 10435, 'version': '9.0.3.9873', 'licenseeName': 'MailStore Software GmbH', 'copyright': 'Copyright (c) 2005-2014 MailStore Software GmbH', 'serverName': 'win-2012-r2-x64'}
If autoHandleToken was set to False and the statusCode returns running, manual token handling is required as described in the Automatic Token Handling section.
For any other statusCode value than succeeded and running the occurrence of an error has to be assumed, in which further information such as the error message and error details are available in the dictionary error as shown below:
speClient.instanceID = "example"
userInfo = speClient.GetUserInfo("john.doe")
if userInfo["statusCode"] == 'succeeded':
print(userInfo["result"]["emailAddresses"])
else:
print(userInfo["error"]["message"])
Examples
Create a list of all email addresses assigned to MailStore users.
speClient = mailstore.mgmt.SPEClient()
speClient.instanceID = "example"
emailAddresses = list()
for user in speClient.GetUsers()["result"]:
emailAddresses += speClient.GetUserInfo(user["userName"])["result"]["emailAddresses"]
print(emailAddresses)
Create a list of all admin users of all instances where the service provider access is enabled.
speClient = mailstore.mgmt.SPEClient()
for instance in speClient.GetInstances("* .running")["result"]:
speClient.instanceID = instance["instanceID"]
if speClient.GetArchiveAdminEnabled()["result"]["value"]:
for user in speClient.GetUsers()["result"]:
if "admin" in speClient.GetUserInfo(user["userName"])["result"]["privileges"]:
print(instance["instanceID"], user["userName"])
Long Running Tasks
The execution of certain API methods like VerifyStore may take several minutes or even hours until it finishes. There are different options available to deal with these long running tasks:
Generally it is recommended to expect that every method call can become a long running task, as this depends on the waitTime value, the called method but also the overall load on the server. Thus it is not advisable to globally turn off automatic token handling when instantiating the API client.
If desired, automatic token handling can be enabled or disabled for each invoked method by adding autoHandleToken=True/False to the method's argument list.
Once a method has been invoked with manual token handling or a callback function, it can be cancelled by using the CancelAsync method as described in Cancelling Long Running Tasks.
Automatic Token Handling
When autoHandleToken is set to True (default), the wrapper polls the status of long running tasks automatically in the background and will return the final result when the process has ended.
Code
import mailstore
speClient = mailstore.mgmt.SPEClient(autoHandleToken=True)
speClient.instanceID = "example"
storeID = 1
print(speClient.VerifyStore(storeID))
Output
{'logOutput': None, 'statusText': None, 'error': None, 'percentProgress': 100, 'token': 'd242d822a59bd4db308eef8b85af7d2a', 'result': None, 'statusVersion': 71, 'statusCode': 'succeeded'}
Automatic Token Handling with Callback Function
If a caller wants to keep track of the progress of a long running task (i.e. to inform the user about the progress), although automatic token handling was enabled, he could pass a function as callback argument to the instance of the API client.
Code
import mailstore
def showProgress(progress):
print(progress["logOutput"], end="", flush=True)
speClient = mailstore.mgmt.SPEClient(autoHandleToken=True, callback=showProgress, instanceID="example")
storeID = 2
print(speClient.VerifyStore(storeID))
Output
Verifying file group #3...
Creating a list of messages to be verified...
1249 messages are about to be verified.
Verifying...
100 messages verified...
200 messages verified...
300 messages verified...
400 messages verified...
500 messages verified...
600 messages verified...
700 messages verified...
800 messages verified...
900 messages verified...
1000 messages verified...
1100 messages verified...
1200 messages verified...
1249 messages verified.
Finished. No errors have been found.
{'error': None, 'result': None, 'logOutput': ' 1000 messages verified...\r\n 1100 messages verified...\r\n 1200 messages verified...\r\n 1249 messages verified.\r\nFinished. No errors have been found.\r\n', 'token': 'c56f032d9db263133c1a413f79744b84', 'statusVersion': 71, 'statusText': None, 'percentProgress': 100, 'statusCode': 'succeeded'}
Manual Token Handling
If autoHandleToken is set to False the caller must handle long running tasks and the corresponding tokens all by itself. To poll for status updates, the GetStatus method must be called periodically passing the last returned result as parameter. GetStatus will extract the status token itself, poll for the latest update and return the received data to the caller again. The main call has finished when the statusCode changes to something different than running. Calling GetStatus without passing a status token will result in an exception.
Code
import mailstore
import time
speClient = mailstore.mgmt.SPEClient(autoHandleToken=False)
speClient.instanceID = "example"
storeID = 3
status = speClient.VerifyStore(storeID)
while True:
if status["statusCode"] != "running":
break
print(status["logOutput"], end="", flush=True)
status = speClient.GetStatus(status)
time.sleep(1)
Output
Verifying file group #3...
Creating a list of messages to be verified...
1249 messages are about to be verified.
Verifying...
100 messages verified...
200 messages verified...
300 messages verified...
400 messages verified...
500 messages verified...
600 messages verified...
700 messages verified...
800 messages verified...
900 messages verified...
1000 messages verified...
1100 messages verified...
1200 messages verified...
1249 messages verified.
Finished. No errors have been found.
Cancelling Long Running Tasks
Tasks invoked by using the callback method or manual token handling, can be canceled at any time by using the CancelAsync method. Please notice that the API does not acknowledge the success of the cancellation request. Instead the caller must continue to monitor the statusCode of the canceled method.
Code
import mailstore
import time
speClient = mailstore.mgmt.SPEClient(autoHandleToken=False)
speClient.instanceID = "example"
storeID = 3
status = speClient.VerifyStore(storeID)
while True:
if status["statusCode"] != "running":
break
print(status["logOutput"], end="", flush=True)
status = speClient.GetStatus(status)
time.sleep(1)
speClient.CancelAsync(status)
Output
Verifying file group #3...
Creating a list of messages to be verified...
1249 messages are about to be verified.
Verifying...
100 messages verified...
200 messages verified...
300 messages verified...
400 messages verified...
500 messages verified...
600 messages verified...
700 messages verified...
800 messages verified...
900 messages verified...
1000 messages verified...
1100 messages verified...
Methods Overview
All methods listed in the function reference are implemented in the Python API library. Use
pydoc3 mailstore.mgmt.SPEClient
to access the build in documentation, which also includes an overview of all methods and their parameters.