Comment lire les courriels à partir du serveur Exchange - un tutoriel Python utilisant Connect Bridge

Ana Neto Nouvelles de l'entreprise, Connecteurs, Technique Laissez un commentaire

"Besoin de se connecter au serveur your Python script to an Exchange ? Nous allons vous montrer un moyen facile de le faire en utilisant un outil appelé Connect Bridge".

Introduction

Cet article décrit comment faire pour que Python se connecte à Exchange, c'est-à-dire comment lire le courrier d'un serveur Microsoft Exchange (Exchange 2010, 2013, 2016, 2019, en ligne) en utilisant un script en langage Python.

Les transferts de données sont effectués via la couche ODBC, donc du côté du script, c'est exactement la même chose que si vous utilisiez python pour accéder à Microsoft SQL Server ou pour accéder à n'importe quelle base de données via ODBC. Il suffit d'utiliser la couche module pyodbc (nous avons utilisé python version 3.7 et pyodbc version 4.0.26.). L'intégration API proprement dite est réalisée par un outil appelé Connect Bridge et ensuite, sur votre script Python, vous lisez les données comme si vous lisiez une base de données.

Veuillez noter que le Connect Bridge est un produit commercial. Vous pouvez obtenir un essai gratuit pour cela, vous pouvez donc essayer cette approche par vous-même sans frais.

Qu'est-ce que le "Connect Bridge" ?

Connect Bridge est une plate-forme d'intégration développée par Connecting Software. Elle permet à votre script de connecter n'importe quel logiciel par le biais de pilotes ODBC, de pilotes JDBC ou de services Web...évitant ainsi d'avoir à étudier et à apprendre l'API du programme auquel vous essayez de vous connecter !

Dans cet article spécifique, nous utilisons Connect Bridge pour nous connecter à Microsoft Exchange, mais vous pouvez également saisir des données provenant de Microsoft SharePoint ou d'un CRM comme Salesforce ou Dynamics parmi tant d'autres. Et les transferts de données peuvent en fait être bidirectionnels. Autrement dit, vous pouvez également transmettre des données à ces systèmes, bien que cette fois-ci nous nous concentrions sur la lecture des données.

Par où commencer ?

Notre objectif est de créer un script Python simple qui accède à un serveur Exchange et y lit le courrier électronique. Nous supposons que l'instance Exchange existe déjà. Il s'agit d'étapes simples que vous devez suivre :

1. Assurez-vous d'avoir vos identifiants de connexion Exchange à portée de main

2. Demandez un essai gratuit et installez Connect Bridge

3. Installer Python pour Windows ver. 3.7+. Vous pouvez utiliser l'éditeur de votre choix pour écrire le script.

4. Installer le module pyodbc 4.0.26+

5. Exécutez Connect Bridge Management Studio et :

5.1. Ajouter un compte pour Exchange (Comptes - Ajouter un compte). Pour ajouter le compte, vous devez sélectionner le connecteur MGEXPlugin2010 et utiliser les informations d'identification mentionnées au point 1.

5.2. Ouvrez l'option Nouvelle requête, puis le navigateur de connexion. Trouvez le connecteur Exchange et développez-le jusqu'à ce que vous voyiez la connexion par défaut. Cliquez avec le bouton droit de la souris sur la connexion par défaut et choisissez "Get Connection string". Copiez la chaîne de connexion ODBC, car vous en aurez besoin pour la transmettre au script.

5.3. Utilisez l'option Nouvelle requête pour tester une requête qui vous permettra d'accéder à ce dont vous avez besoin dans Exchange.

Nous allons faire une requête d'exemple ici, mais c'est ici que vous devez mettre ce que vous recherchez dans Exchange. Une fois que vous avez cliqué sur Nouvelle requête, ouvrez le navigateur de connexion, sur la gauche. Trouvez le connecteur Exchange (MGEXPlugin2010) et ouvrez jusqu'à ce que l'option Tables soit visible. Nous pouvons voir que le schéma contient une "table" appelée Message, de sorte que nous pouvons construire notre requête comme SELECT * FROM Message WHERE CreationDate >= '2019-01-01 00:00:00' LIMIT 10 ; pour sélectionner 10 entrées de la liste des messages électroniques du Exchange qui ont été créés après le 1er janvier 2019. Encore une fois, veuillez noter que bien qu'il semble que nous utilisions directement une base de données, ce n'est pas le cas. Le Connect Bridge accède à l'API et la présente ensuite comme s'il s'agissait d'une base de données. Une fois que vous avez votre requête, copiez-la, car vous devrez la transmettre au script.

Les mains sur le script !

Notre solution ne comporte qu'un seul fichier : CBExchange.py. Le code source complet se trouve ci-dessous. Veuillez vous concentrer sur les lignes 70-92 qui décrivent la solution de base. Une description complète du fonctionnement de ce script se trouve ci-dessous.

#!/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()) 

Voici un peu plus de détails sur les variables que nous utilisons :

- l'analyseur syntaxique est utilisé pour analyser les arguments que nous recevons de la ligne de commande

- args détient ces arguments

- La requête contient la requête que nous voulons exécuter et qui est présentée comme un argument

- connstr contient la chaîne de connexion ODBC qui arrive en argument et que l'on passe dans le module pyodbc pour créer une connexion ODBC

- conn est la connexion ODBC

Et voici ce que fait notre scénario

- Dans les lignes 70 à 78, le but est d'obtenir les variables connstr et query à partir des arguments de la ligne de commande. Le modèle de script argparse de pydev a été utilisé par souci de simplicité

- À la ligne 80, nous ouvrons un curseur de base de données en utilisant le conn

- À la ligne 82, nous exécutons la requête SQL que nous avons reçue de la ligne de commande

- Dans les lignes 83 à 92, nous passons en boucle les résultats et les lisons ligne par ligne à partir du curseur.

-Quand cursor.fetchone revient Aucun, on casse la boucle

- Si une exception se produit lors de la recherche ODBC, nous interrompons également la boucle et imprimons le problème en sortie

- Si la méthode fetchone réussit et renvoie une ligne de données, nous imprimons la ligne de données brutes telle qu'elle est à la sortie. Cela est fait comme il suffit pour la démonstration, mais naturellement, dans une situation réelle, vous pouvez formater en xml, json, csv... ou tout autre type de format d'échange de données. Ou vous pourriez aussi simplement utiliser l'objet row de données brutes pour effectuer des tâches personnalisées dans le code suivant.

Comment exécuter le script CBExchange.py ?

Le script CBExchange.py accepte deux arguments de ligne de commande positionnelle : connstr et query.

Nous devons les copier à partir de Connect Bridge Management Studio comme expliqué ci-dessus (point 5.2). Lorsque vous les avez à portée de main, ouvrez une ligne de commande, cédez le dossier dans lequel vous avez enregistré le script et lancez votre script Python en lui passant les 2 paramètres.

Que puis-je faire d'autre ? Explorer davantage...

Comme mentionné précédemment, des requêtes plus sophistiquées peuvent être construites de manière à ce que vous receviez les e-mails que vous souhaitez. Par exemple, si vous souhaitez recevoir uniquement les courriels avec pièces jointes et avec une date de création spécifique, la requête sera

SELECTIONNER * DU MESSAGE

WHERE [HasAttachment] = true and [CreationDate] >= '2019-07-01 00:00:00' ;

Vous pouvez également explorer les "Procédures stockées" disponibles. Trouvez le connecteur Exchange (MGEXPlugin2010) et développez jusqu'à ce que vous puissiez voir l'option "Procédures stockées". Encore une fois, ces procédures stockées sont l'intégration API de Connect Bridge, et non pas de véritables procédures stockées dans la base de données. Mais la façon de travailler avec elles est la même que si elles l'étaient.

Certaines des procédures stockées disponibles sont visibles sur cette capture d'écran :

Vous pouvez consulter SP_SELECT_DEFAULT_FOLDER_INBOX pour une procédure stockée simple (aucun paramètre obligatoire) ou SP_SEND_MESSAGE pour une procédure un peu plus compliquée.

Contraintes

L'outil Connect Bridge est uniquement disponible pour les systèmes d'exploitation Windows, car aucune bibliothèque client ODBC Linux n'est disponible. Donc, pour que cela fonctionne, vous aurez besoin d'une machine Windows.

Conclusion

Nous avons vu comment l'accès aux données Exchange en Python peut être facilement réalisé en utilisant la plate-forme d'intégration Connect Bridge. Maintenant, imaginez que ce que vous avez vu dans cet article est également possible avec Microsoft Dynamics CRM et Microsoft Exchange ! Oui, avec Connect Bridge, c'est possible et la façon de le faire est similaire... il suffit de choisir le connecteur pour le logiciel spécifique que vous voulez et de l'utiliser.

Si vous souhaitez explorer les connecteurs actuellement disponibles sur Connect Bridge, vous pouvez vous rendre à l'adresse suivante https://www.connecting-software.com/connect-bridge-connectors/

Si vous êtes curieux de savoir quels sont les nouveaux connecteurs de ce grand ensemble, jetez un coup d'œil aux Connect Bridge Dynamics 365 Finances et opérations et Dynamics 365 Business Central tous deux basés sur le protocole OData. Vous pouvez également consulter le connecteur OPC UA. Oui, je sais que cela semble être un cas d'utilisation totalement différent... Mais la vérité est que vous pouvez accéder aux serveurs OPC UA en utilisant le même outil. Juste pour vous donner une idée de ce que peut donner ce type d'intégration, jetez un coup d'œil sur les Connect Bridge Vitrine de l'IIoT.

Nous espérons que cet article vous a été utile ! Voici d'autres articles que nous avons publiés sur notre blog pour discuter d'autres possibilités d'intégration :

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *