Come leggere le email dal Server Exchange - un tutorial Python utilizzando Connect Bridge

Ana Neto Notizie dell'azienda, Connettori, Tecnico Lascia un commento

"Necessità di connettersi al server your Python script to an Exchange? Vi mostreremo un modo semplice per farlo utilizzando uno strumento chiamato Connect Bridge".

Introduzione

Questo articolo descrive come far connettere Python a Exchange, cioè come leggere la posta da un Server Microsoft Exchange (Exchange 2010, 2013, 2016, 2019, Online) utilizzando uno script in linguaggio Python.

I trasferimenti di dati vengono effettuati tramite lo strato ODBC, quindi dal lato dello scripting è esattamente come se si utilizzasse python per accedere a Microsoft SQL Server o per accedere a qualsiasi database tramite ODBC. Si usa semplicemente l'opzione modulo pyodbc (abbiamo usato la versione 3.7 del pitone e la versione 4.0.26 del pyodbc). L'effettiva integrazione delle API è fatta da uno strumento chiamato Connect Bridge e poi sul vostro script Python leggete i dati come se steste leggendo un database.

Si prega di notare che Connect Bridge è un prodotto commerciale. È possibile ottenere una prova gratuita per questo, in modo che possiate provare questo approccio per voi stessi senza alcun costo.

Che cos'è questo "Connect Bridge"?

Connect Bridge è una piattaforma di integrazione sviluppata da Connecting Software. Permette al vostro script di connettere qualsiasi software attraverso driver ODBC, driver JDBC o Web Services... evitando di studiare e imparare le API del programma a cui state cercando di connettervi!

In questo articolo specifico stiamo usando Connect Bridge per connetterci a Microsoft Exchange, ma è possibile anche prendere i dati da Microsoft SharePoint o da un CRM come Salesforce o Dynamics tra molti altri. E i trasferimenti di dati possono essere bidirezionali. Cioè, è possibile anche mettere i dati in questi sistemi, anche se questa volta ci stiamo concentrando sulla lettura dei dati.

Da dove comincio?

Il nostro obiettivo è quello di creare un semplice script Python che acceda ad un server Exchange e legga la posta elettronica da esso. Supponiamo che l'istanza Exchange esista già. Questi sono semplici passi da seguire:

1. Assicuratevi di avere a portata di mano le vostre credenziali di accesso Exchange

2. Richiedi una prova gratuita e installa Connect Bridge

3. Installare Python per Windows ver. 3.7+. Per la scrittura dello script potete utilizzare l'editor di vostra scelta.

4. Installare il modulo pyodbc 4.0.26+

5. Eseguire Connect Bridge Management Studio e:

5.1. Aggiungere un conto per Exchange (Conti - Aggiungi conto). Per aggiungere l'account, si dovrebbe selezionare il connettore MGEXPlugin2010 e utilizzare le credenziali menzionate al punto 1.

5.2. Aprire l'opzione Nuova Query e poi il Browser di connessione. Trovare il Connettore Exchange ed espanderlo fino a visualizzare la DefaultConnection. Fare clic con il tasto destro del mouse sulla DefaultConnection e scegliere la stringa Get Connection. Copiare la stringa di connessione ODBC, in quanto ne avrete bisogno per trasmetterla allo script.

5.3. Utilizzare l'opzione New Query per testare una query che accederà a ciò di cui si ha bisogno in Exchange.

Faremo una query di esempio qui, ma qui è dove si dovrebbe mettere quello che si sta cercando in Exchange. Dopo aver cliccato su Nuova Query, aprire il Browser di connessione, a sinistra. Trovate il Connettore Exchange (MGEXPlugin2010) e aprite fino a quando l'opzione Tabelle non è visibile. Possiamo vedere che lo schema contiene una "tabella" chiamata Message in modo da poter costruire la nostra query come SELECT * FROM Message WHERE CreationDate >= '2019-01-01 00:00:00:00' LIMIT 10; per selezionare 10 voci dalla lista dei messaggi email Exchange che sono stati creati dopo il 1 gennaio 2019. Anche in questo caso, si prega di notare che, anche se sembra che stiamo usando direttamente un database, non è così. Connect Bridge accede all'API e la presenta come se fosse un database. Una volta che avete la vostra richiesta, copiatela, in quanto dovrete passarla allo script.

Mani sullo scripting!

La nostra soluzione ha un solo file: CBExchange.py. Il codice sorgente completo è riportato di seguito. Si prega di concentrarsi sulle linee 70-92 che rappresentano la soluzione di base. Una descrizione completa di come funziona questo script è riportata di seguito.

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

Qui c'è qualcosa sulle variabili che stiamo usando:

- il parser è usato per analizzare gli argomenti che riceviamo dalla linea di comando

- args tiene questi argomenti

- query contiene la query che vogliamo eseguire e che viene fornita come argomento

- connstr tiene la stringa di connessione ODBC che entra come argomento e che passiamo nel modulo pyodbc per creare una connessione ODBC

- Il collegamento è il collegamento ODBC

Ed ecco cosa sta facendo il nostro copione

- Nelle righe da 70 a 78, l'obiettivo è quello di ottenere le variabili connstr e query dall'input degli argomenti della riga di comando. Il modello di script argparse di pydev è stato usato per semplicità

- Nella riga 80, apriamo un cursore di database utilizzando il conn

- Nella linea 82, eseguiamo la query SQL che abbiamo ottenuto dalla linea di comando

- Nelle righe da 83 a 92, passiamo in rassegna i risultati e li leggiamo dalla riga del cursore riga per riga.

-Quando cursor.fetchone ritorna Nessuno, rompiamo il ciclo

- Se si verifica un'eccezione durante il fetch ODBC, rompiamo anche il loop e stampiamo il problema in uscita

- Se il metodo fetchone ha successo e restituisce una riga di dati, stampiamo la riga di dati grezzi così com'è all'uscita. Questo viene fatto in quanto è sufficiente a scopo dimostrativo, ma naturalmente in una situazione reale si può formattare come xml, json, csv... o qualsiasi altro tipo di formato di scambio di dati. Oppure si potrebbe anche semplicemente usare l'oggetto raw data row per eseguire compiti personalizzati nel codice successivo.

Come si esegue lo script CBExchange.py?

Lo script CBExchange.py accetta due argomenti a riga di comando posizionale: connstr e query.

Dobbiamo copiarli da Connect Bridge Management Studio come spiegato sopra (punto 5.2). Quando li avete a portata di mano, aprite una riga di comando, cd nella cartella in cui avete salvato lo script e Esegui il tuo script Python passandogli i 2 parametri.

Cos'altro posso fare? Esplorare ulteriormente...

Come accennato in precedenza, è possibile costruire query più sofisticate in modo da ottenere le e-mail che si desidera. Ad esempio, se si desidera ottenere solo le e-mail con allegati e con una data di creazione specifica, la query sarebbe

SELEZIONA * DA Messaggio

DOVE [HasAttachment] = vero e [CreationDate] >= '2019-07-01 00:00:00:00';

È inoltre possibile esplorare le "Procedure memorizzate" disponibili. Trovate il connettore Exchange (MGEXPlugin2010) ed espandetevi fino a visualizzare l'opzione "Stored Procedures". Anche in questo caso, queste Stored Procedures sono l'integrazione API di Connect Bridge, non vere e proprie stored procedure di database. Ma il modo di lavorare con loro è lo stesso che se lo fossero.

Alcune delle Stored Procedure disponibili sono visibili in questa schermata:

Si può dare un'occhiata a SP_SELECT_DEFAULT_FOLDER_INBOX per una semplice procedura memorizzata (nessun parametro obbligatorio) o a SP_SEND_MESSAGE per una procedura un po' più complicata.

Vincoli

Lo strumento Connect Bridge è disponibile solo per sistemi operativi Windows, perché non è disponibile alcuna libreria client ODBC Linux. Quindi, perché questo funzioni, è necessaria una macchina Windows.

Conclusione

Abbiamo visto come l'accesso ai dati Exchange in Python può essere fatto facilmente utilizzando la piattaforma di integrazione Connect Bridge. Ora immaginate che quello che avete visto in questo articolo sia possibile anche con Microsoft Dynamics CRM e Microsoft Exchange! Sì, con Connect Bridge questo è possibile e il modo di farlo è simile... basta solo scegliere il connettore per il software specifico che si desidera e andare con esso.

Se volete esplorare i connettori attualmente disponibili a Connect Bridge, il posto dove andare è https://www.connecting-software.com/connect-bridge-connectors/

Se siete curiosi di sapere quali sono i connettori più recenti di questo grande set, date un'occhiata a Connect Bridges Dynamics 365 Finanza e operazioni e Dynamics 365 Business Central connettori, entrambi costruiti sul protocollo OData. Oppure date un'occhiata all'OPC UA Connector. Sì, so che sembra un caso d'uso completamente diverso..... Ma la verità è che si può accedere ai server OPC UA utilizzando lo stesso strumento. Giusto per darvi un'idea di ciò che può risultare da questo tipo di integrazione, date un'occhiata a Connect Bridge Vetrina IIoT.

Speriamo che questo articolo vi sia stato utile! Qui ci sono altri post che abbiamo sul nostro blog che parlano di altre possibilità di integrazione:

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *