Integración de C# de Dropbox y Exchange ejemplo

Integración de C# de Dropbox y Exchange ejemplo

Sherif KenawyTechnical Leave a Comment

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 puede conectarse al sistema de destino (Exchange y Dropbox en nuestro caso); la forma más sencilla de hacerlo es mediante CB Query Analyzer. Aquí ya he configurado mi servidor ConnectBridge a través de la herramienta de administración para conectarme a MS Exchange 365 y a 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.

Exchange ejemplo

Figura 1: Administración de cuentas

Dropbox y Exchange

Figura 2: Administración de grupos y usuarios

Dropbox y Exchange

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

Dropbox y 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.

Image

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

Dropbox y Exchange

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

Dropbox y Exchange

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.

Dropbox y Exchange

Figura 8: Subir un archivo al Dropbox

Image

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

Dropbox y Exchange

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. Cree y abra 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. Cree y abra 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)
{
     using (OdbcCommand command = new OdbcCommand("Exec SP_UploadFile ?, ?, ?",
           conexión))
     {
       command.CommandType = CommandType.StoredProcedure;
       command.Parameters.AddWithValue("@ruta", "/");
       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

Dropbox y Exchange

Figura 11: Ejecutando la solución

Dropbox y Exchange

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 System;
usando System.Data;
usando System.Data.Odbc;

namespace Mi Solución
{
    clase Programa
    {
        static void Main(string[] args)
        {
            //proporcionar conexión
            string connectionString = string.Empty;
            string sqlQueryString = string.Empty;
            OdbcConnection conexión;
            Comando OdbcCommand;
            DataTable documentsTable = new DataTable();
            OdbcDataAdapter messagesAdapter, documentsListAdapter, documentsAdapter;
            DataTable messageIDs = new DataTable();
            DataTable documentsListTable = new DataTable();

            //crear la conexión con Exchange
            connectionString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_EXCH365_CU7';UID='martin';PWD='1234'";
            using (connection = new OdbcConnection(connectionString))
            {
                //abrir la conexión
                connection.Open();

                //cargar los identificadores de los mensajes con adjuntos
                using (messagesAdapter = new OdbcDataAdapter("SELECT ID FROM Message where HasAttachment = true;", connection))
                {
                    //llenar la tabla messageIDs con los mensajes
                    messagesAdapter.Fill(messageIDs);
                }

                //para cada mensaje con el id de mensaje, obtener la lista de adjuntos
                foreach (DataRow messageIDRow en messageIDs.Rows)
                {
                    sqlQueryString = string.Format("EXEC SP_SELECT_ATTACHMENTS '{0}';", messageIDRow["ID"]);
                    using (documentsListAdapter = new OdbcDataAdapter(sqlQueryString, connection))
                        documentsListAdapter.Fill(documentsListTable);
                }

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

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

                //cerrar la conexión con Exchange
                if (connection.State == ConnectionState.Open)
                    connection.Close();
            }

            //crear conexión con DropBox
            connectionString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_DRBX_CBD';UID='martin';PWD='1234'";
            using (connection = new OdbcConnection(connectionString))
            {
                //abrir la conexión
                connection.Open();

                //estado de carga del documento marcador de posición
                string fileUploadStatus = string.Empty;

                //por cada documento que tengamos en nuestra documentsTable
                foreach (DataRow documentRow en documentsTable.Rows)
                {
                    //llamar a un procedimiento almacenado para subir el archivo
                    using (command = new OdbcCommand("Exec SP_UploadFile ?, ?, ?", connection))
                    {
                        command.CommandType = CommandType.StoredProcedure;
                        command.Parameters.AddWithValue("@ruta", "/");
                        command.Parameters.AddWithValue("@filename", documentRow["OutFileName"]);
                        command.Parameters.AddWithValue("@content", documentRow["OutBuffer"]);

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

                //cerrar la conexión con Dropbox
                if (connection.State == ConnectionState.Open)
                    connection.Close();
            }

            //dar respuesta al usuario
            Console.WriteLine("todo hecho...");
            Console.ReadKey();
        }
    }
}

Deja una respuesta

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

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