Wie man E-Mails von Exchange Server liest - ein Python-Tutorial mit Connect Bridge

Ana Neto Neuigkeiten zum Unternehmen, Konnektoren, Technisch Einen Kommentar hinterlassen

"Muss eine Verbindung zum Server your Python script to an Exchange hergestellt werden? Wir zeigen Ihnen einen einfachen Weg, dies mit Hilfe eines Tools 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 dass Sie die API des Programms, mit dem Sie sich verbinden wollen, studieren und erlernen müssen!

In diesem speziellen Artikel verwenden wir Connect Bridge, um eine Verbindung mit Microsoft Exchange herzustellen, aber Sie können auch Daten aus Microsoft SharePoint oder einem CRM wie Salesforce oder Dynamics und vielen anderen abrufen. Und Datenübertragungen können tatsächlich bidirektional sein. Das heißt, Sie können auch Daten in diese Systeme stellen, 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 Konnektor MGEXPlugin2010 auswählen und die unter Punkt 1 genannten Zugangsdaten 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 machen, aber hier sollten Sie eintragen, was Sie in Exchange suchen. Wenn Sie auf Neue Abfrage geklickt haben, öffnen Sie den Verbindungsbrowser auf der linken Seite. Suchen Sie den Exchange-Konnektor (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 als SELECT * FROM Message WHERE CreationDate >= '2019-01-01 00:00:00' LIMIT 10; konstruieren können, 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 auch hier, dass, obwohl es so aussieht, als ob wir direkt eine Datenbank benutzen, dies nicht der Fall ist. Connect Bridge greift auf die API zu und stellt sie dann so dar, als ob sie eine Datenbank wäre. 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

#-Kodierung: utf-8

'''

CBExchange - Daten abfragen von, Daten schreiben in Exchange

  

CBExchange ist ein Skript, das das Lesen von Exchange-Mails mit SQL-Abfragen über den ODBC-Treiber von Connect Bridge ermöglicht.

  

@Autor:    Ana Neto

  

@Urheberrecht: 2019

  

@Kontakt: ana@connecting-software.com

@deffield aktualisiert: 22.07.2019

'''

  

Importsysteme

Import-OS

Einfuhr pyodbc

  

aus argparse importieren ArgumentParser

aus argparse import RawDescriptionHelpFormatter

  

__alle__ = []

__Version__ = 0,2

__Datum__ = '2019-07-22'.

__aktualisiert__ = '2019-07-22'.

  

DEBUG = 1

TESTRUN = 0

STECKBRIEF = 0

  

Klasse CLIError(Ausnahme):

    '''Generische Ausnahme, um verschiedene fatale Fehler auszulösen und zu protokollieren.'''

    def __init__(selbst, msg):

        super(CLIError).__init__(typ(selbst))

        self.msg = "E: %s" % msg

    def __str__(selbst):

        self.msg zurückgeben

    def __unicode__(self):

        self.msg zurückgeben

  

def main(argv=Keine): # IGNORE:C0111

    '''Kommandozeilenoptionen'''

  

    wenn argv keine ist:

        argv = sys.argv

    sonst:

        sys.argv.erweitern(argv)

  

    programm_name = os.pfad.basename(sys.argv[0])

    programm_version = "v%s" % __version__

    program_build_date = str(__aktualisiert__)

    program_version_message = '%%(prog)s %s (%s)' % (program_version, program_build_date)

    program_shortdesc = __import__('__main__').__doc__.split("n")[1]

    Programm_Lizenz = '''%s

  

  Erstellt von Ana Neto auf %s.

  

  Lizenziert unter der Apache-Lizenz 2.0

  http://www.apache.org/licenses/LICENSE-2.0

  

  Verteilt auf einer "AS IS"-Basis ohne Gewährleistungen

  oder Bedingungen jeglicher Art, weder ausdrücklich noch stillschweigend.

  

VERWENDUNG

''' % (program_shortdesc, str(__date__))

  

    versuchen:

        # Setup-Argument-Parser

        Parser = ArgumentParser(description=program_license, formatatter_class=RawDescriptionHelpFormatter)

        parser.add_argument('connstr')

        parser.add_argument('abfrage')

         

        # Prozess-Argumente

        args = parser.parse_args()

  

        Abfrage = args.abfrage

        connstr = args.connstr

  

        conn = pyodbc.connect(connstr)

        Cursor = Verbindungscursor()

        cursor.execute(Abfrage)

        während 1:

            Zeile = Keine

            versuchen:

                Zeile = cursor.fetchone()

            außer:

                drucken(sys.exc_info()[1])

                Pause

            wenn nicht Reihe:

                Pause

            drucken(Zeile)

                         

             

    außer KeyboardInterrupt:

        ### Tastatur-Unterbrechung handhaben ###

        Rückgabe 0

    außer:

        drucken(sys.exc_info()[1])

        1TP3Einrückung = len(Programm-Name) * " " "

        #sys.stderr.write(programm_name + ": " + repr(e) + "n")

        #sys.stderr.write(Einrückung + " für Hilfe verwenden --help")

        Rückkehr 2

  

wenn __name__ == "__hauptsächlich__":

          

    wenn TESTRUN:

        Import-Doktest

        doctest.testmod()

    wenn PROFIL:

        cProfil importieren

        pstats importieren

        Profil_Dateiname = 'CBExchange_profile.txt'.

        cProfil.run('main()', Profil_Dateiname)

        statsfile = offen ("profile_stats.txt", "wb")

        p = pstats.Stats(profile_filename, stream=statsfile)

        stats = p.strip_dirs().sort_stats('kumulativ')

        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] = wahr und [CreationDate] >= '2019-07-01 00:00:00';

Sie können auch die verfügbaren "Stored Procedures" 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 und nicht um tatsächliche Datenbank-Stored Procedures. 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:

Sie können einen Blick auf SP_SELECT_DEFAULT_FOLDER_INBOX für eine einfache Stored Procedure (kein obligatorischer Parameter) oder SP_SEND_MESSAGE für eine etwas kompliziertere werfen.

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 Integrationsplattform Connect Bridge leicht möglich ist. Nun stellen Sie sich 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 die Vorgehensweise ist ähnlich... Sie müssen nur den Konnektor für die spezielle Software auswählen, die Sie wollen, und mit ihr gehen.

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/connect-bridge-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 ganz anderer Anwendungsfall zu sein... Aber die Wahrheit ist, dass Sie mit demselben Werkzeug auf OPC UA Server zugreifen können. Um Ihnen eine Vorstellung davon zu geben, was sich aus dieser Art von Integration ergeben kann, werfen Sie einen Blick auf Connect Bridge's IIoT-Vitrine.

Wir hoffen, dieser Artikel war für Sie hilfreich! Hier sind einige weitere Beiträge, die wir in unserem Blog über andere Integrationsmöglichkeiten diskutieren:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.