Cómo leer el correo electrónico del servidor Exchange - un tutorial de Python usando Connect Bridge

Ana Neto Noticias de la empresa, Conectores, Técnico Deje un comentario

"¿Necesita conectar tu Python script a un servidor Exchange? Te mostraremos una forma fácil de hacerlo usando una herramienta llamada Connect Bridge".

Introducción

Este artículo describe cómo hacer que Python se conecte al Exchange, es decir, cómo leer el correo de un servidor Microsoft Exchange (Exchange 2010, 2013, 2016, 2019, Online) utilizando un script de lenguaje Python.

Las transferencias de datos se realizan a través de la layer ODBC, por lo que desde el punto de vista de las secuencias de comandos es exactamente igual que si se utilizara Python para acceder a Microsoft SQL Server o para acceder a cualquier base de datos a través de ODBC. Simplemente se utiliza el módulo pyodbc (usamos la versión 3.7 de Python y la versión 4.0.26 de pyodbc). La integración del API se realiza mediante una herramienta llamada Connect Bridge y luego en su script de Python se leen los datos como si se tratara de una base de datos.

Tenga en cuenta que el Connect Bridge es un producto comercial. Puede obtener una prueba gratuita para ello, así que puedes probar este enfoque por ti mismo sin costo alguno.

¿Qué es este "Connect Bridge"?

Connect Bridge es una plataforma de integración desarrollada por Connecting Software. Permite a su script conectar cualquier software a través de controladores ODBC, JDBC o Web Services... ¡evitando la necesidad de estudiar y aprender el API del programa al que se intenta conectar!

En este artículo específico estamos usando el Connect Bridge para conectar con el Microsoft Exchange pero también se pueden tomar datos del Microsoft SharePoint o de un CRM como Salesforce o Dynamics entre muchos otros. Y las transferencias de datos pueden ser efectivamente bidireccionales. Es decir, también puedes poner datos en estos sistemas, aunque esta vez nos centramos en la lectura de datos.

¿Por dónde empiezo?

Nuestro objetivo es crear un simple script Python que acceda a un servidor Exchange y lea el correo electrónico desde él. Asumimos que la instancia Exchange ya existe. Estos son unos pasos sencillos que hay que seguir:

1. Asegúrate de tener a mano tus credenciales de acceso a Exchange

2. Solicite una prueba gratuita e instale Connect Bridge

3. Instalar Python para Windows ver. 3.7+. Puedes usar el editor que prefieras para escribir el script.

4. Instalar el módulo 4.0.26+ de pyodbc

5. Ejecute Connect Bridge Management Studio y:

5.1. Añade una cuenta para Exchange (Accounts – Add account). Para añadir la cuenta, debe seleccionar el conector MGEXPlugin2010 y utilizar las credenciales mencionadas en el punto 1.

5.2. Abre la opción New Query y luego el Connection Browser. Encuentra el conector Exchange y expándelo hasta que veas la DefaultConnection. Haga clic con el botón derecho del ratón en DefaultConnection y elija la cadena Get Connection. Copie la cadena de conexión ODBC, ya que la necesitará para pasarla al script.

5.3. Usa la opción New Query para probar una consulta que acceda a lo que necesitas en Exchange.

Haremos una consulta de ejemplo aquí, pero aquí es donde debes poner lo que buscas en Exchange. Una vez que hayas pulsado New Query, abre el Connection Browser, a la izquierda. Busque el conector Exchange (MGEXPlugin2010) y ábralo hasta que la opción Tables esté visible. Podemos ver que el esquema contiene una "table" llamada Message para que podamos construir nuestra consulta como SELECT * FROM Message WHERE CreationDate >= ‘2019-01-01 00:00:00’ LIMIT 10; para seleccionar 10 entradas de la lista de mensajes de correo electrónico del Exchange que se crearon después del 1 de enero de 2019. De nuevo, por favor, tened en cuenta que aunque parezca que estamos usando una base de datos directamente, no es así. Connect Bridge está accediendo a la API y luego la presenta como si fuera una base de datos. Una vez que tenga su consulta, cópiela, ya que tendrá que pasarla al script.

¡Manos a la obra!

Nuestra solución sólo tiene un archivo: CBExchange.py. El código fuente completo está abajo. Por favor, enfóquese en las líneas 70-92 que representan la solución principal. Una descripción completa de cómo funciona este script está abajo.

#!/usr/local/bin/python3.7

# codificación: utf-8

'''

CBExchange -- consultar datos desde, escribir datos en Exchange

  

CBExchange es un script que permite leer el correo de Exchange mediante consultas SQL a través del driver ODBC de Connect Bridge

  

@autor:    Ana Neto

  

@copyright: 2019

  

@contacto: ana@connecting-software.com

@deffield actualizado: 22.07.2019

'''

  

importar sys

importar os

importar pyodbc

  

from argparse import ArgumentParser

from argparse import RawDescriptionHelpFormatter

  

__all__ = []

__versión__ = 0.2

__date__ = '2019-07-22'

__updated__ = '2019-07-22'

  

DEBUG = 1

TESTRUN = 0

PERFIL = 0

  

clase CLIError(Exception):

    '''Excepción genérica para lanzar y registrar diferentes errores fatales'''.

    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

    '''Opciones de la línea de comandos'''.

  

    si argv es None:

        argv = sys.argv

    si no:

        sys.argv.extend(argv)

  

    nombre_del_programa = os.path.basename(sys.argv[0])

    versión_del_programa = "v%s" % __versión__

    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]

    licencia_del_programa = '''%s

  

  Creado por Ana Neto en %s.

  

  Licencia Apache 2.0

  http://www.apache.org/licenses/LICENSE-2.0

  

  Distribuido "tal cual" sin garantías

  o condiciones de ningún tipo, ni expresas ni implícitas.

  

USO

''' % (program_shortdesc, str(__date__))

  

    inténtelo:

        # Configurar el analizador de argumentos

        parser = ArgumentParser(description=programa_licencia, formatter_class=RawDescriptionHelpFormatter)

        parser.add_argument('connstr')

        parser.add_argument('query')

         

        # Procesar argumentos

        args = parser.parse_args()

  

        query = args.query

        connstr = args.connstr

  

        conn = pyodbc.connect(connstr)

        cursor = conn.cursor()

        cursor.execute(query)

        mientras 1:

            row = None

            Inténtalo:

                row = cursor.fetchone()

            excepto:

                print(sys.exc_info()[1])

                break

            si no es fila:

                break

            print(fila)

                         

             

    excepto KeyboardInterrupt:

        ### manejar la interrupción del teclado ##

        devolver 0

    excepto:

        print(sys.exc_info()[1])

        #indent = len(nombre_programa) * " "

        #sys.stderr.write(nombre_programa + ": " + repr(e) + "n")

        #sys.stderr.write(indent + " para ayuda usa --help")

        retornar 2

  

si __name__ == "__main__":

          

    si TESTRUN:

        importar doctest

        doctest.testmod()

    si PROFILE:

        import cProfile

        importar pstats

        profile_filename = 'CBExchange_profile.txt'

        cProfile.run('main()', profile_filename)

        statsfile = open("profile_stats.txt", "wb")

        p = pstats.Stats(nombre_perfil, stream=fichero_de_estadística)

        stats = p.strip_dirs().sort_stats('cumulative')

        stats.print_stats()

        statsfile.close()

        sys.exit(0)

    sys.exit(main()) 

Aquí hay un poco sobre las variables que estamos usando:

- El parser se usa para analizar los argumentos que obtenemos de la línea de comandos

- args sostiene esos argumentos

- la query contiene la consulta que queremos hacer y eso viene como un argumento

- connstr sostiene la cadena de conexión ODBC que viene como argumento y que pasamos al módulo pyodbc para crear una conexión ODBC

- La conn es la conexión ODBC

Y esto es lo que nuestro script está haciendo

- En las líneas 70 a 78, el objetivo es obtener las variables connstr y query de la entrada de argumentos de la línea de comandos. La plantilla de script argparse de pydev se utilizó por simplicidad

- En la línea 80, abrimos un cursor de la base de datos usando conn

- En la línea 82, ejecutamos la query SQL que obtuvimos de la línea de comandos

- En las líneas 83 a 92, repasamos los resultados y los leemos desde el cursor fila por fila.

-Cuando cursor.fetchone vuelve None, rompemos el loop

- Si se produce una excepción durante la obtención del ODBC, también rompemos el loop y imprimimos el problema en la salida

- Si el método de fetchone tiene éxito y devuelve una fila de datos, imprimimos la fila de datos en bruto tal como está a la salida. Esto se hace como es suficiente para fines de demostración, pero naturalmente en una situación del mundo real se podría formatear como xml, json, csv... o cualquier otro tipo de formato de intercambio de datos. O también podrías simplemente usar el objeto de la fila de datos en bruto para realizar tareas personalizadas en el código posterior.

¿Cómo puedo ejecutar el script CBExchange.py?

El script CBExchange.py acepta dos argumentos de línea de comandos posicionales: connstr y query.

Necesitamos copiarlos de Connect Bridge Management Studio como se explicó anteriormente (punto 5.2). Cuando los tenga a mano, abra una línea de comandos, cd en la carpeta en la que guardó el script y ejecuta tu script Python... pasándole los 2 parámetros.

¿Qué más puedo hacer? Explorar más...

Como se mencionó antes, se pueden construir queries más sofisticadas para que recibas los correos electrónicos que quieras. Por ejemplo, si sólo quieres recibir los correos electrónicos con archivos adjuntos y con una fecha de creación específica, la consulta sería

SELECT * FROM Message

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

También puede explorar los "Stored Procedures" (Procedimientos Almacenados) disponibles. Encuentra el conector Exchange (MGEXPlugin2010) y amplíalo hasta que puedas ver la opción "Stored Procedures". Una vez más, estos Stored Procedures son la integración de la API del Connect Bridge, no procedimientos almacenados en la base de datos. Pero la forma de trabajar con ellos es la misma que si lo fueran.

Algunos de los Stored Procedures disponibles son visibles en esta captura de pantalla:

Puedes echar un vistazo a SP_SELECT_DEFAULT_FOLDER_INBOX para un procedimiento simple almacenado (sin parámetros obligatorios) o SP_SEND_MESSAGE para uno un poco más complicado.

Restricciones

La herramienta Connect Bridge sólo está disponible para sistemas operativos Windows, porque no hay ninguna biblioteca cliente ODBC Linux disponible. Así que, para que esto funcione, necesitará una máquina Windows.

Conclusión

Hemos visto cómo el acceso a los datos del Exchange en Python puede hacerse fácilmente usando la plataforma de integración Connect Bridge. Ahora imagina que lo que has visto en este artículo es posible también con Microsoft Dynamics CRM y Microsoft Exchange! Sí, con Connect Bridge esto es posible y la forma de hacerlo es similar... sólo tienes que elegir el conector para el software específico que quieras y utilícelo.

Si quieres explorar los conectores actualmente disponibles en Connect Bridge, el lugar para ir es https://www.connecting-software.com/connect-bridge-connectors/

Si tienes curiosidad por saber cuáles son los conectores más nuevos de este gran conjunto, echa un vistazo a los Connect Bridges Dynamics 365 Finanzas y operaciones y Dynamics 365 Business Central conectores, ambos construidos en el Protocolo de OData. O eche un vistazo al Conector OPC UA. Sí, sé que parece un caso de uso totalmente diferente... ...pero la verdad es que puedes acceder a los servidores OPC UA usando la misma herramienta. Sólo para darte una idea de lo que puede resultar de este tipo de integración, echa un vistazo al IIoT showcase de Connect Bridge.

¡Esperamos que este artículo le haya sido útil! Aquí hay algunas publicaciones más que tenemos en nuestro blog discutiendo otras posibilidades de integración:

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *