"Sie möchten Ihr Python-Skript mit einem Exchange-Server verbinden? Wir zeigen Ihnen eine einfache Möglichkeit, dies mit einem Tool namens Connect Bridge zu tun."
Einführung
Dieser Artikel beschreibt, wie Python eine Verbindung zu Exchange herstellen kann, d.h. wie E-Mails von einem Microsoft Exchange Server (Exchange 2010, 2013, 2016, 2019, Online) mit Hilfe eines Python-Sprachskripts gelesen werden können.
Die Datenübertragungen erfolgen über die ODBC-Schicht, so dass es von der Skriptseite her genau dasselbe ist, als ob Sie Python für den Zugriff auf Microsoft SQL Server oder für den Zugriff auf eine beliebige Datenbank über ODBC verwenden würden. Sie verwenden einfach die pyodbc-Modul (wir haben Python Version 3.7 und Pyodbc Version 4.0.26 verwendet). Die eigentliche API-Integration erfolgt durch ein Werkzeug namens Connect Bridge, und auf Ihrem Python-Skript lesen Sie die Daten dann so, als ob Sie eine Datenbank lesen würden.
Bitte beachten Sie, dass Connect Bridge ein kommerzielles Produkt ist. Sie können eine kostenlose Testversion erhalten dafür, so dass Sie diesen Ansatz ohne Kosten für sich selbst ausprobieren können.
Was ist diese "Verbindungsbrücke"?
Connect Bridge ist eine von Connecting Software entwickelte Integrationsplattform. Sie ermöglicht es Ihrem Skript, jede beliebige Software über ODBC-Treiber, JDBC-Treiber oder Webdienste zu verbinden... ohne die Notwendigkeit, die API des Programms zu studieren und zu lernen, mit dem Sie sich verbinden wollen!
In diesem Artikel verwenden wir Connect Bridge für die Verbindung zu Microsoft Exchange, aber Sie können auch Daten von Microsoft SharePoint oder einem CRM wie Salesforce oder Dynamics und vielen anderen abrufen. Und die Datenübertragung kann sogar bidirektional erfolgen. Das heißt, Sie können auch Daten in diese Systeme einspeisen, obwohl wir uns dieses Mal auf das Lesen von Daten konzentrieren.
Wo soll ich anfangen?
Unser Ziel ist es, ein einfaches Python-Skript zu erstellen, das auf einen Exchange-Server zugreift und E-Mails von diesem liest. Wir gehen davon aus, dass die Exchange-Instanz bereits existiert. Dies sind einfache Schritte, die Sie befolgen müssen:
1. Stellen Sie sicher, dass Sie Ihre Exchange-Anmeldedaten zur Hand haben
2. Kostenlose Testversion anfordern und Connect Bridge installieren
3. Installieren Sie Python für Windows ver. 3.7+. Sie können den Editor Ihrer Wahl zum Schreiben des Skripts verwenden.
4. Pyodbc-Modul 4.0.26+ installieren
5. Führen Sie Connect Bridge Management Studio und aus:
5.1. Fügen Sie ein Konto für Exchange hinzu (Konten - Konto hinzufügen). Zum Hinzufügen des Kontos sollten Sie den Anschluss MGEXPlugin2010 auswählen und die unter Punkt 1 genannten Anmeldeinformationen verwenden.
5.2. Öffnen Sie die Option Neue Abfrage und dann den Verbindungs-Browser. Suchen Sie den Exchange-Konnektor und erweitern Sie ihn, bis Sie die Standardverbindung sehen. Klicken Sie mit der rechten Maustaste auf die DefaultConnection und wählen Sie Get Connection string. Kopieren Sie die ODBC-Verbindungszeichenfolge, da Sie sie benötigen, um sie an das Skript weiterzugeben.
5.3. Verwenden Sie die Option Neue Abfrage, um eine Abfrage auszuprobieren, die auf das zugreift, was Sie in Exchange benötigen.
Wir werden hier eine Beispielabfrage durchführen, aber hier sollten Sie eingeben, wonach Sie in Exchange suchen. Nachdem Sie auf "Neue Abfrage" geklickt haben, öffnen Sie den Verbindungsbrowser auf der linken Seite. Suchen Sie den Exchange-Connector (MGEXPlugin2010) und öffnen Sie ihn, bis die Option "Tabellen" sichtbar ist. Wir können sehen, dass das Schema eine "Tabelle" namens Nachricht enthält, so dass wir unsere Abfrage wie folgt konstruieren können: SELECT * FROM Nachricht WHERE Erstellungsdatum >= '2019-01-01 00:00:00' LIMIT 10; um 10 Einträge aus der Liste der E-Mail-Nachrichten des Exchange auszuwählen, die nach dem 1. Januar 2019 erstellt wurden. Bitte beachten Sie noch einmal, dass es zwar so aussieht, als ob wir direkt eine Datenbank verwenden, aber das ist nicht der Fall. Connect Bridge greift auf die API zu und stellt sie dann so dar, als wäre es eine Datenbank. Sobald Sie Ihre Abfrage haben, kopieren Sie sie, da Sie sie an das Skript weitergeben müssen.
Hände aufs Skript!
Unsere Lösung hat nur eine Akte: CBExchange.py. Den vollständigen Quellcode finden Sie unten. Bitte konzentrieren Sie sich auf die Zeilen 70-92, die die Kernlösung darstellen. Eine vollständige Beschreibung, wie dieses Skript funktioniert, finden Sie weiter unten.
#!/usr/local/bin/python3.7 # encoding: utf-8 ''' CBExchange -- query data from, write data to Exchange CBExchange is a script that allows to read Exchange mail using SQL queries via Connect Bridge's ODBC driver @author: Ana Neto @copyright: 2019 @contact: ana@connecting-software.com @deffield updated: 22.07.2019 ''' import sys import os import pyodbc from argparse import ArgumentParser from argparse import RawDescriptionHelpFormatter __all__ = [] __version__ = 0.2 __date__ = '2019-07-22' __updated__ = '2019-07-22' DEBUG = 1 TESTRUN = 0 PROFILE = 0 class CLIError(Exception): '''Generic exception to raise and log different fatal errors.''' def __init__(self, msg): super(CLIError).__init__(type(self)) self.msg = "E: %s" % msg def __str__(self): return self.msg def __unicode__(self): return self.msg def main(argv=None): # IGNORE:C0111 '''Command line options.''' if argv is None: argv = sys.argv else: sys.argv.extend(argv) program_name = os.path.basename(sys.argv[0]) program_version = "v%s" % __version__ program_build_date = str(__updated__) program_version_message = '%%(prog)s %s (%s)' % (program_version, program_build_date) program_shortdesc = __import__('__main__').__doc__.split("n")[1] program_license = '''%s Created by Ana Neto on %s. Licensed under the Apache License 2.0 http://www.apache.org/licenses/LICENSE-2.0 Distributed on an "AS IS" basis without warranties or conditions of any kind, either express or implied. USAGE ''' % (program_shortdesc, str(__date__)) try: # Setup argument parser parser = ArgumentParser(description=program_license, formatter_class=RawDescriptionHelpFormatter) parser.add_argument('connstr') parser.add_argument('query') # Process arguments args = parser.parse_args() query = args.query connstr = args.connstr conn = pyodbc.connect(connstr) cursor = conn.cursor() cursor.execute(query) while 1: row = None try: row = cursor.fetchone() except: print(sys.exc_info()[1]) break if not row: break print(row) except KeyboardInterrupt: ### handle keyboard interrupt ### return 0 except: print(sys.exc_info()[1]) #indent = len(program_name) * " " #sys.stderr.write(program_name + ": " + repr(e) + "n") #sys.stderr.write(indent + " for help use --help") return 2 if __name__ == "__main__": if TESTRUN: import doctest doctest.testmod() if PROFILE: import cProfile import pstats profile_filename = 'CBExchange_profile.txt' cProfile.run('main()', profile_filename) statsfile = open("profile_stats.txt", "wb") p = pstats.Stats(profile_filename, stream=statsfile) stats = p.strip_dirs().sort_stats('cumulative') stats.print_stats() statsfile.close() sys.exit(0) sys.exit(main())
Hier ist ein wenig über die Variablen, die wir verwenden:
- Parser wird zum Parsen der Argumente verwendet, die wir von der Befehlszeile erhalten
- args hält diese Argumente
- Query enthält die Anfrage, die wir ausführen wollen, und das kommt als Argument
- connstr enthält die ODBC-Verbindungszeichenfolge, die als Argument hereinkommt und die wir an das pyodbc-Modul übergeben, um eine ODBC-Verbindung herzustellen.
- conn ist die ODBC-Verbindung
Und hier ist, was unser Skript tut
- In den Zeilen 70 bis 78 geht es darum, die Variablen connstr und query von der Eingabe der Befehlszeilenargumente zu erhalten. Der Einfachheit halber wurde die argparse-Skriptvorlage von pydev verwendet
- In Zeile 80 öffnen wir einen Datenbank-Cursor mit conn
- In Zeile 82 führen wir die SQL-Abfrage aus, die wir von der Befehlszeile erhalten haben
- In den Zeilen 83 bis 92 gehen wir die Ergebnisse in einer Schleife durch und lesen sie Zeile für Zeile vom Cursor ab.
-Wenn cursor.fetchone Keine zurückgibt, unterbrechen wir die Schleife
- Wenn während des ODBC-Abrufs eine Ausnahme auftritt, brechen wir auch die Schleife ab und drucken das Problem zur Ausgabe
- Wenn die Fetchone-Methode erfolgreich ist und eine Datenzeile zurückgibt, drucken wir die Rohdatenzeile so aus, wie sie in der Ausgabe ist. Dies wird so gemacht, wie es für Demo-Zwecke ausreichend ist, aber in einer realen Situation könnten Sie natürlich als xml, json, csv... oder jede andere Art von Datenaustauschformat formatieren. Oder Sie könnten auch einfach das Rohdatenzeilenobjekt verwenden, um benutzerdefinierte Aufgaben im nachfolgenden Code auszuführen.
Wie führe ich das Skript CBExchange.py aus?
Das Skript CBExchange.py akzeptiert zwei positionale Befehlszeilenargumente: connstr und query.
Wir müssen diese, wie oben (Punkt 5.2) erläutert, aus dem Connect Bridge Management Studio kopieren. Wenn Sie sie zur Hand haben, öffnen Sie eine Befehlszeile, cd in den Ordner, in dem Sie das Skript gespeichert haben, und Ihr Python-Skript ausführen und übergibt ihm die 2 Parameter.
Was kann ich sonst noch tun? Weiter erkunden...
Wie bereits erwähnt, können anspruchsvollere Abfragen erstellt werden, so dass Sie die gewünschten E-Mails erhalten. Wenn Sie beispielsweise nur die E-Mails mit Anhängen und mit einem bestimmten Erstellungsdatum erhalten möchten, wäre die Abfrage
SELECT * FROM Nachricht
WHERE [HasAttachment] = true und [CreationDate] >= '2019-07-01 00:00:00';
Sie können auch die verfügbaren "Gespeicherten Prozeduren" erkunden. Suchen Sie den Exchange Connector (MGEXPlugin2010) und erweitern Sie ihn, bis Sie die Option "Stored Procedures" sehen können. Auch hier handelt es sich bei diesen Stored Procedures um die API-Integration von Connect Bridge, nicht um tatsächliche Stored Procedures für Datenbanken. Aber die Art und Weise, mit ihnen zu arbeiten, ist die gleiche, als ob sie es wären.
Einige der verfügbaren Stored Procedures sind auf diesem Screenshot zu sehen:
Einschränkungen
Das Werkzeug Connect Bridge ist nur für Windows-Betriebssysteme verfügbar, da keine ODBC-Linux-Client-Bibliothek verfügbar ist. Damit dies funktioniert, benötigen Sie also eine Windows-Maschine.
Schlussfolgerung
Wir haben gesehen, wie der Zugriff auf Exchange-Daten in Python mit der Connect Bridge-Integrationsplattform einfach möglich ist. Stellen Sie sich nun vor, dass das, was Sie in diesem Artikel gesehen haben, auch mit Microsoft Dynamics CRM und Microsoft Exchange möglich ist! Ja, mit Connect Bridge ist dies möglich und der Weg dorthin ist ähnlich... Sie müssen nur den Konnektor für die gewünschte Software auswählen und damit arbeiten.
Wenn Sie die Konnektoren, die derzeit bei Connect Bridge verfügbar sind, erkunden möchten, dann ist die folgende Stelle die richtige Wahl https://www.connecting-software.com/connectors/
Wenn Sie neugierig sind, welche die neuesten Anschlüsse in diesem großen Set sind, schauen Sie sich die Connect Bridges Dynamics 365 Finanzen & Betrieb und Dynamics 365 Business Central Konnektoren, die beide auf dem OData-Protokoll aufbauen. Oder werfen Sie einen Blick auf den OPC UA Connector. Ja, ich weiß, das scheint ein völlig anderer Anwendungsfall zu sein.... Aber die Wahrheit ist, dass Sie mit demselben Tool auf OPC UA Server zugreifen können. Nur um Ihnen eine Vorstellung davon zu geben, was bei dieser Art von Integration herauskommen kann, schauen Sie sich die Connect Bridge's an IIoT-Vitrine.
Wir hoffen, dieser Artikel war hilfreich für Sie!
Hier finden Sie einige weitere Beiträge in unserem Blog, die sich mit anderen Integrationsmöglichkeiten befassen: