how-to-read-email-from-exchange-server-python-tutorial-using-connect-bridge

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

Ana NetoCompany news, Connectors, Technical Leave a Comment

"Möchten Sie 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 dieses “Connect Bridge”?

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.

Image

Wir führen hier eine Beispielabfrage durch, aber hier sollten Sie eingeben, wonach Sie in Exchange suchen. Nachdem Sie auf “Neue Abfrage” geklickt haben, öffnen Sie links den Verbindungsbrowser. Suchen Sie den Exchange-Konnektor (MGEXPlugin2010) und öffnen Sie ihn, bis die Option 'Tabellen' sichtbar ist. Wir sehen, dass das Schema eine „Tabelle“ namens „Message“ enthält, sodass wir unsere Abfrage wie folgt erstellen können: SELECT * FROM Message WHERE CreationDate >= '2019-01-01 00:00:00' LIMIT 10; um 10 Einträge aus der E-Mail-Nachrichtenliste von Exchange auszuwählen, die nach dem 1. Januar 2019 erstellt wurden. Beachten Sie bitte erneut, dass es zwar so aussieht, als würden wir direkt auf eine Datenbank zugreifen, dies jedoch nicht der Fall ist. Connect Bridge greift auf die API zu und präsentiert sie dann so, als wäre es eine Datenbank. Wenn Sie Ihre Abfrage erstellt 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:

• Der Parser wird verwendet, um die Argumente zu analysieren, die wir von der Befehlszeile erhalten.

• args enthält diese Argumente

• query enthält die Abfrage, die wir ausführen möchten und die als Argument übergeben wird.

• connstr enthält die ODBC-Verbindungszeichenfolge, die als Argument übergeben wird und die wir an das pyodbc-Modul weiterleiten, um eine ODBC-Verbindung herzustellen.

• conn ist die ODBC-Verbindung

Und hier ist, was unser Skript tut

• In den Zeilen 70 bis 78 besteht das Ziel darin, die Variablen „connstr” und „query” aus den Eingaben der Befehlszeilenargumente zu erhalten. Der Einfachheit halber wurde die Skriptvorlage „argparse” 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 über die Befehlszeile erhalten haben.

• In den Zeilen 83 bis 92 durchlaufen wir die Ergebnisse in einer Schleife und lesen sie zeilenweise aus dem Cursor aus.

•Wenn cursor.fetchone None zurückgibt, wird die Schleife unterbrochen.

• Wenn während des ODBC-Abrufs eine Ausnahme auftritt, brechen wir ebenfalls die Schleife ab und geben das Problem in der Ausgabe aus.

• Wenn die fetchone-Methode erfolgreich ist und eine Datenzeile zurückgibt, geben wir die Rohdatenzeile unverändert in der Ausgabe aus. Dies reicht für Demonstrationszwecke aus, aber in der Praxis können Sie natürlich auch Formate wie XML, JSON, CSV oder andere Datenaustauschformate verwenden. Oder Sie können das Rohdatenzeilenobjekt einfach 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.

cmd-wie-man-seinen-pyton-betreibt

Was kann ich 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:

CB Exchange Server Sync - Wie synchronisiert man Outlook-Kalender?
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 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/

anschlüsse-liste-verbinden-bridge-python

Wenn Sie neugierig sind, welche die neuesten Steckverbinder in diesem großen Set sind, schauen Sie sich Connect Bridges an. Dynamik 365 Finanzen & Betrieb und Dynamics 365 Business Central Konnektoren, die beide auf dem OData-Protokoll basieren. Oder schauen Sie sich den OPC UA-Konnektor an. Ja, ich weiß, das scheint ein völlig anderer Anwendungsfall zu sein... Aber in Wahrheit können Sie mit demselben Tool auf OPC UA-Server zugreifen. Um Ihnen eine Vorstellung davon zu geben, was diese Art der Integration bewirken kann, schauen Sie sich Connect Bridge's 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:


Über den Autor

Ana Neto

Durch Ana Neto, Fachberaterin bei Connecting Software.

"Ich bin seit 1997 Software-Ingenieur, und seit kurzem schreibe ich gerne und halte öffentliche Vorträge. Haben Sie Fragen oder Kommentare zu diesem Artikel? Ich würde mich über Ihr Feedback freuen. Hinterlassen Sie unten einen Kommentar!"

Schreibe einen Kommentar

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

For security, use of Google's reCAPTCHA service is required which is subject to the Google Privacy Policy and Terms of Use.