comment-lire-un-email-d'un-serveur-d'échange-python-tutoriel-utilisant-connect-bridge

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

Ana NetoCompany news, Connectors, Technical Leave a Comment

"Vous avez besoin de connecter votre script Python à un serveur Exchange ? Nous allons vous montrer une façon simple 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 plateforme d'intégration développée par Connecting Software. Elle permet à votre script de se connecter à n'importe quel logiciel via des pilotes ODBC, JDBC ou des 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 aussi récupérer des données de Microsoft SharePoint ou d'un CRM comme Salesforce ou Dynamics parmi beaucoup d'autres. Et les transferts de données peuvent en fait être bidirectionnels. En d'autres termes, vous pouvez également transmettre des données à ces systèmes, bien que nous nous concentrions cette fois 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. Ajoutez 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.

Image

Nous allons faire un exemple de requête ici, mais c'est ici que vous devez entrer ce que vous recherchez dans Exchange. Une fois que vous avez cliqué sur New Query, ouvrez le navigateur de connexions, sur la gauche. Trouvez le connecteur Exchange (MGEXPlugin2010) et ouvrez-le jusqu'à ce que l'option Tables soit visible. Nous pouvons voir que le schéma contient une "table" appelée Message. Nous pouvons donc construire notre requête comme suit : SELECT * FROM Message WHERE CreationDate >= '2019-01-01 00:00:00' LIMIT 10 ; pour sélectionner 10 entrées dans la liste des messages électroniques de Exchange qui ont été créées après le 1er janvier 2019. Encore une fois, veuillez noter que même si nous avons l'impression d'utiliser directement une base de données, ce n'est pas le cas. 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.

cmd-comment-faire-fonctionner-votre-pyton

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 et [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-le jusqu'à ce que vous puissiez voir l'option "Stored Procedures". Encore une fois, ces procédures stockées sont l'intégration de l'API de Connect Bridge, et non des procédures stockées de base de données réelles. 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 :

CB Exchange Server Sync - Comment synchroniser les calendriers Outlook
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 accéder aux données Exchange en Python peut être facilement réalisé en utilisant la plateforme d'intégration Connect Bridge. Imaginez maintenant 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 manière de le faire est similaire... vous devez juste choisir le connecteur pour le logiciel spécifique que vous voulez et le suivre.

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

connecteurs-list-connect-bridge-python

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 qui reposent tous deux sur le protocole OData. Vous pouvez également jeter un coup d'œil au 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 qui peut résulter de ce type d'intégration, jetez un coup d'oeil à 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 et qui traitent d'autres possibilités d'intégration :

Laisser un commentaire

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

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