Integración de C# de Dropbox y Exchange ejemplo

Sherif Kenawy Técnico Deje un comentario

1. Introducción

1.1 Introducción

Decidimos escribir un breve blog para cualquier desarrollador de C# que quiera desarrollar una solución de integración entre sistemas como Dropbox, Exchange o muchos otros. Creamos una aplicación corta de muestra que sirve como demostración de lo simple que puede ser esa integración usando el Connect Bridge plataforma.

1.2 Requisitos previos

Puedes escanear el artículo para entender el concepto de la plataforma Connect Bridge. Además, también proporcionamos una licencia de prueba gratuita del software a petición en caso de que quiera jugar con él por su cuenta.

2. 2. Requisitos de los escenarios

El escenario de integración que se requiere aquí es crear una copia de seguridad de los archivos adjuntos de tus correos electrónicos de intercambio en tu carpeta de Dropbox. Podría ser útil tener una copia de seguridad, o mantener el uso de su intercambio al mínimo o algunas otras razones.

3. Flujo de trabajo básico

Independientemente de la solución de integración que se requiera implementar, hay tres pasos básicos fáciles de seguir que se deben realizar. Esos pasos son los siguientes.

3.1 Configurar el Analizador de Consultas CB

El primer paso, es asegurarse de que eres capaz de conectarte al sistema objetivo (Exchange y Dropbox en nuestro escenario); la forma más fácil de hacerlo es a través de CB Query Analyzer. Aquí ya he configurado mi servidor ConnectBridge a través de la herramienta de Administración para conectar con el MS Exchange 365 y con mi Dropbox creando los grupos y usuarios necesarios. He creado un nombre de usuario llamado "martin" con contraseña "1234”. Este usuario tiene derechos para conectarse al Exchange365 y al Dropbox. Ahora desde el Query Analyzer crearé 2 conexiones a cada sistema de destino y me aseguraré de que pueda conectarse con éxito.

Figura 1: Administración de cuentas

Figura 2: Administración de grupos y usuarios

Figura 3: Conexiones del analizador de consultas

3.2 Pruebe sus declaraciones

Como se muestra arriba, tenemos una configuración y conexión exitosa a ambos sistemas de objetivos. Ahora podemos probar nuestras declaraciones.

3.2.1. Descarga de archivos adjuntos de Exchange

En mi cuenta de intercambio, tengo un par de correos electrónicos, con sólo 3 correos electrónicos que tienen adjuntos como se muestra a continuación

Figura 4: Correos electrónicos Exchange

Para descargar los archivos adjuntos del intercambio, necesitamos seguir 3 pasos:

1. Obtén una lista de identificaciones de correo electrónico con archivos adjuntos:
La ejecución de la siguiente declaración debería darnos 3 identificaciones ya que sólo tenemos 3 correos electrónicos con archivos adjuntos, como se muestra en la Figura 4 anterior. Para la prueba voy a tomar la ID del correo electrónico que tiene 2 adjuntos y obtendré la lista de sus adjuntos de correo electrónico en el siguiente paso.

SELECCIONE ID DEL MENSAJE DONDE HA SIDO ACOPLICADO = verdadero;

En la figura 5 se muestra el resultado de la ejecución de la declaración anterior.

2. Obtén una lista de archivos adjuntos de cada correo electrónico:

Ejecutando la siguiente declaración, debería darnos 2 filas, una para el readme.txt y otra para el logo.jpg, como se muestra en la Figura 4 anterior. Cada archivo adjunto tendrá un campo llamado dirección que se utilizará en el siguiente paso para descargar el archivo adjunto

EXEC SP_SELECT_ATTACHMENTS 'AAMkADljZGY4ZjYzLWY2MDUtN..........';

La figura 6 muestra el resultado de la ejecución de la declaración anterior.

3. Consigue los accesorios:
Ahora, descargaré el archivo adjunto logo.jpg usando la dirección que obtuve en el paso anterior

EXEC SP_SAVE_ATTACHMENT 'AAMkADljZGY4ZjYzLWY2MDUtNDBjOC0......';

La figura 7 muestra el resultado de la ejecución de la declaración anterior.

Nota: utilizamos una tabla y 2 procedimientos almacenados ofrecidos por el conector Exchange, para más información sobre las tablas y los procedimientos almacenados ofrecidos por el conector, por favor consulte el "Referencia del conector Exchange" documento.

Figura 5: Obtener la lista de identificaciones de correo electrónico con archivos adjuntos

Figura 6: Obtener la lista de archivos adjuntos de un correo electrónico

Figura 7: Obtener un accesorio

3.2.2 Subir un archivo al Dropbox

Este es un paso directo. Para subir un archivo a Dropbox, ejecutaremos un procedimiento almacenado "SP_UPLOADFILE" que llama a las APIs necesarias en Dropbox para subir un archivo. Para simplificar, vamos a subir un archivo de texto.

SP_UPLOADFILE:

EJECUTAR ARCHIVO DE CARGA "@ruta", "@nombre de archivo", "@contenido";

El procedimiento almacenado anterior espera el contenido del archivo en bytes.
Me gustaría subir un archivo de texto llamado "first.txt"al directorio raíz de Dropbox. El contenido del archivo, será "Hello World"; como se acordó, necesitamos convertir ese mensaje "Hello World" a bytes a través de su propio código o cualquier convertidor en línea.

EXEC SP_UPLOADFILE '/', 'first.txt', 'SGVsbG8gV29ybGQ=';

Nota: Para más información sobre las tablas y procedimientos almacenados que ofrece el conector del Dropbox, por favor consulte el "Referencia del conector del buzón" documento.

La figura 8 y la figura 9 muestran la ejecución y la salida del procedimiento almacenado anterior.

Figura 8: Subir un archivo al Dropbox

Figura 9: Archivo cargado

3.3 Copiar la conexión y las declaraciones

Ahora sabemos que podemos descargar archivos adjuntos desde Exchange y también sabemos que podemos subir documentos a Dropbox. También probamos nuestras sentencias SQL. Lo que necesitamos hacer ahora es copiar la cadena de conexión del Analizador de Consultas y nuestras sentencias probadas a nuestra aplicación C#.

Para copiar la conexión del analizador de consultas, sólo tenemos que hacer clic con el botón derecho del ratón en la conexión, hacer clic en Editar e ir a la pestaña Avanzado y copiar el texto desde allí como se muestra a continuación en la Figura 10.

Figura 10: Copia de la cadena de conexión del Analizador de Consultas

Aquí están mis cadenas de conexión para ambos sistemas de objetivos.

Exchange

Driver={Media Gateway ODBC Driver};impl='CORBA';host='localhost';port='8087';acc='ACC_EXCH365_CU7';uid='martin';pwd='1234'

Dropbox

Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_DRBX_CBD';UID='martin';PWD='1234'

Ahora estamos listos para abrir visual studio.net y empezar a implementar nuestra solución de integración C#.

4. 4. Recorrido de la solución

4.1 Crear una nueva aplicación C#

Es suficiente para crear una simple aplicación de consola. Nuestra solución no requiere ninguna referencia externa ni ningún despliegue de paquetes de terceros. La solución está basada en ODBC; por lo tanto, sólo necesitamos importar los espacios de nombres requeridos a nuestra clase.

usando System.Data;
usando System.Data.Odbc;

4.2 Crear y abrir una conexión con Exchange

1. Especifique la cadena de conexión

conexión de cadenaString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_EXCH365_CU7';UID='martin';PWD='1234'";

2. Crear y abrir la conexión:

usando (OdbcConnection connection = nueva OdbcConnection(connectionString))
{
    conexión. Abrir();
    …………………………
}

4.3 Descargar los archivos adjuntos del Exchange

1. Descargue las identificaciones de los correos electrónicos Exchange con archivos adjuntos a un DataTable "messageIDs". vamos a utilizar un DataAdapter "messagesAdapter" para conectar y descargar las identificaciones.

usando (OdbcDataAdapter mensajesAdapter = nuevo OdbcDataAdapter("SELECT ID FROM Message where HasAttachment = true;", conexión))
{
    Adaptador de mensajes. Llenar (messageIDs);
}

2. Por cada ID de correo electrónico en la tabla "messageIDs", obtendremos una lista de archivos adjuntos "sólo información" y los guardaremos en otra tabla de datos "documentsListTable". Vamos a utilizar otro DataAdapter "documentsListAdapter" para obtener esa lista de archivos adjuntos.

foreach (DataRow messageIDRow in messageIDs.Rows)
{
     cadena sqlQueryString = cadena.Formato("EXEC SP_SELECT_ATTACHMENTS '{0}';",
                             messageIDRow["ID"]);
     usando (OdbcDataAdapter documentsListAdapter = nuevo OdbcDataAdapter
                                                  (sqlQueryString, conexión))
            documentosListAdapter.Fill(documentosListTable);
}

3. Para cada anexo de la "lista de documentos", obtendremos la dirección y la utilizaremos para obtener el anexo real y luego agregaremos ese anexo a una tercera tabla "documentsTable". Vamos a utilizar otro DataAdapter "documentsAdapter" para obtener los archivos adjuntos/documentos.

foreach (DataRow documentInfoRow in documentsListTable.Rows)
{
    string sqlQueryString = string.Format("EXEC SP_SAVE_ATTACHMENT '{0}';",
                            documentInfoRow["Dirección"]);
    usando (documentsAdapter = nuevo OdbcDataAdapter(sqlQueryString, conexión))
          Documentos Adaptador. Rellenar (documentosTabla);
}

4. Por cada archivo adjunto descargado con éxito del intercambio, se muestra un mensaje al usuario utilizando el nombre del archivo adjunto.

foreach (DataRow documentRow in documentsTable.Rows)
    Console.WriteLine(string.Format("{0} descargado!",
                                    documentRow["OutFileName"]));

4.4 Cerrar la conexión con Exchange

si (connection.State == ConnectionState.Open)
        Conexión. Cerrar;

4.5 Crear y abrir una conexión con Dropbox

1. Especifique la cadena de conexión

cadena de conexiónString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_DRBX_CBD';UID='martin';PWD='1234'";

2. Crear y abrir la conexión:

usando (OdbcConnection connection = nueva OdbcConnection(connectionString))
{
    conexión. Abrir();
    …………………………
}

4.6 Subir los archivos adjuntos al Dropbox

Para cada archivo adjunto en el "documentsTable", obtendremos el nombre del archivo "OutFileName" y el contenido del archivo "OutBuffer" y guardar el archivo en la raíz de la carpeta de Dropbox "/".

No necesitamos un nuevo DataAdapter, sólo necesitamos un OdbcCommand basado en "ARCHIVO DE CARGA" procedimiento almacenado discutido anteriormente, y necesitamos agregarle los parámetros requeridos, para poder pasar los valores requeridos al procedimiento almacenado.

foreach (DataRow documentRow in documentsTable.Rows)
{
     usando (OdbcCommand command = nuevo OdbcCommand("Exec SP_UploadFile ?, ?, ?",
           conexión))
     {
       command.CommandType = CommandType.StoredProcedimiento;
       command.Parameters.AddWithValue("@path", "/");
       command.Parameters.AddWithValue("@filename", documentRow["OutFileName"]);
       command.Parameters.AddWithValue("@content", documentRow["OutBuffer"]);
       fileUploadStatus = (command.ExecuteNonQuery() > 0) ? "¡Subido!" :
                          "¡No subido!";
       Console.WriteLine("{0} : {1}", documentRow["OutFileName"]],
                                      fileUploadStatus);
     }
}

4.7 Cerrar la conexión con el Dropbox

si (connection.State == ConnectionState.Open)
        Conexión. Cerrar;

5. Ejecutar la solución

Figura 11: Ejecutando la solución

Figura 12: Contenido del buzón después de ejecutar la solución

6. Notas sobre la solución

Intentamos mantener la lógica de la aplicación lo más simple posible, sin embargo la lógica podría mejorarse guardando los archivos adjuntos de cada correo electrónico de intercambio en una carpeta separada, donde el nombre de la carpeta podría ser una parte del ID del mensaje o cualquier otro identificador único.

Por simplicidad, ignoramos muchos estándares de codificación esenciales, incluyendo pero no limitado a:

1. Tener cadenas de conexión en un archivo de configuración
2. 2. Tramitar y encriptar las contraseñas usando un código hash y una sal.
3. Implementar patrones de diseño como el Principio de Responsabilidad Única o mejor aún, el Principio de Inversión de la Dependencia

7. Código fuente completo

usando el sistema;
usando System.Data;
usando Sistema.de.Datos.Odbc;

namespace MySolution
{
    Programa de clases
    {
        vacío estático Principal(string[] args)
        {
            //proveer la conexión
            conexión de la cadenaCadena = cadena.Vacía;
            cadena sqlQueryString = cadena.Vacía;
            OdbcConexión de la conexión;
            OdbcCommand command;
            DataTable documentsTable = new DataTable();
            OdbcDataAdapter messagesAdapter, documentsListAdapter, documentsAdapter;
            DataTable messageIDs = nuevo DataTable();
            DataTable documentsListTable = new DataTable();

            //creando conexión con Exchange
            connectionString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_EXCH365_CU7';UID='martin';PWD='1234'";
            usando (connection = new OdbcConnection(connectionString))
            {
                //conexión abierta
                conexión. Abrir();

                //carga los identificadores de mensajes para los mensajes con archivos adjuntos
                usando (messagesAdapter = new OdbcDataAdapter("SELECT ID FROM Message where HasAttachment = true;", conexión))
                {
                    //llenar la tabla de ID de mensajes con mensajes
                    Adaptador de mensajes. Llenar (messageIDs);
                }

                // para cada mensaje usando el ID del mensaje, obtener la lista de archivos adjuntos
                foreach (DataRow messageIDRow in messageIDs.Rows)
                {
                    sqlQueryString = string.Format("EXEC SP_SELECT_ATTACHMENTS '{0}';", messageIDRow["ID"]);
                    usando (documentsListAdapter = new OdbcDataAdapter(sqlQueryString, connection))
                        documentosListAdapter.Fill(documentosListTable);
                }

                // obtener cada archivo adjunto y guardarlo en documentosTabla
                foreach (DataRow documentInfoRow in documentsListTable.Rows)
                {
                    sqlQueryString = string.Format("EXEC SP_SAVE_ATTACHMENT '{0}';", documentInfoRow["Address"]);
                    using (documentsAdapter = new OdbcDataAdapter(sqlQueryString, connection))
                        Documentos Adaptador. Rellenar (documentosTabla);
                }

                // dar retroalimentación al usuario de que esos archivos fueron descargados
                foreach (DataRow documentRow in documentsTable.Rows)
                    Console.WriteLine(string.Format("{0} downloaded!", documentRow["OutFileName"]));

                //cerrar la conexión a Exchange
                si (connection.State == ConnectionState.Open)
                    Conexión. Cerrar;
            }

            //creando conexión con DropBox
            connectionString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_DRBX_CBD';UID='martin';PWD='1234'";
            usando (connection = new OdbcConnection(connectionString))
            {
                //conexión abierta
                conexión. Abrir();

                // estado de carga del documento marcador de posición
                archivo de cadenaSubirEstado = cadena.Vacío;

                // para cada documento que tenemos en nuestra tabla de documentos
                foreach (DataRow documentRow in documentsTable.Rows)
                {
                    // Llamar a un procedimiento almacenado para cargar el archivo
                    usando (command = new OdbcCommand("Exec SP_UploadFile ?, ?, ?", connection))
                    {
                        command.CommandType = CommandType.StoredProcedimiento;
                        command.Parameters.AddWithValue("@path", "/");
                        command.Parameters.AddWithValue("@filename", documentRow["OutFileName"]);
                        command.Parameters.AddWithValue("@content", documentRow["OutBuffer"]);

                        //comprobar el estado y la visualización en pantalla
                        fileUploadStatus = (command.ExecuteNonQuery() > 0) ? "¡Subido!" "¡No subido!";
                        Console.WriteLine("{0} : {1}", documentRow["OutFileName"], fileUploadStatus);
                    }
                }

                // estrecha conexión con el Dropbox
                si (connection.State == ConnectionState.Open)
                    Conexión. Cerrar;
            }

            // dar retroalimentación al usuario
            Consola. WriteLine("todo hecho...");
            Console.ReadKey();
        }
    }
}

Share this Post

Deja una respuesta