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

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

"Hai bisogno di collegare il tuo script Python a un server Exchange? Ti 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 is an integration platform developed by Connecting Software. It allows your script to connect any software through ODBC drivers, JDBC drivers, or Web Services...avoiding the need to study and learn the API of the program you are trying to connect to!

In this specific article, we are using Connect Bridge to connect to Microsoft Exchange but you can also grab data from Microsoft SharePoint or a CRM like Salesforce or Dynamics among many others. And data transfers can actually be bidirectional. That is, you can also put data to these systems, although this time we are focusing on reading data.

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 account per Exchange (Accounts - Add account). Per aggiungere l'account, dovresti selezionare il connettore MGEXPlugin2010 e usare 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 dovreste inserire ciò che state cercando in Exchange. Dopo aver cliccato su New Query, apri il Connection Browser, sulla sinistra. Trova il connettore Exchange (MGEXPlugin2010) e aprilo fino a quando l'opzione Tables è visibile. Possiamo vedere che lo schema contiene una "tabella" chiamata Message, quindi possiamo costruire la nostra query come SELECT * FROM Message WHERE CreationDate >= '2019-01-01 00:00:00' LIMIT 10; per selezionare 10 voci dall'elenco dei messaggi e-mail del Exchange che sono stati creati dopo il 1 gennaio 2019. Di nuovo, si prega di notare che anche se sembra che stiamo usando direttamente un database, non è così. Connect Bridge sta accedendo all'API e poi lo presenta come se fosse un database. Una volta che hai la tua query, copiala, poiché dovrai 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

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

Potete anche esplorare le "Stored Procedures" disponibili. Trovate il connettore Exchange (MGEXPlugin2010) ed espandete fino a che non vedete l'opzione "Stored Procedures". Di nuovo, 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 come 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 usando 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... devi solo scegliere il connettore per il software specifico che vuoi e andare con quello.

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 Finanze e operazioni e Dynamics 365 Business Central entrambi costruiti sul protocollo OData. Oppure date un'occhiata al connettore OPC UA. Sì, lo so che sembra un caso d'uso totalmente diverso.... Ma la verità è che si può accedere ai server OPC UA utilizzando lo stesso strumento. Solo per darvi un'idea di ciò che può risultare da questo tipo di integrazione, date un'occhiata a Connect Bridge Vetrina IIoT.

We hope this article was helpful to you!

Here are some more posts we have on our blog discussing other integration possibilities:

Lascia un commento

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