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 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 conectarme a MS Exchange 365 y a mi Dropbox creando los grupos y usuarios necesarios. He creado un nombre de usuario llamado "martin" con la contraseña "1234". Este usuario tiene derechos para conectarse a Exchange365 y Dropbox. Ahora desde Query Analyzer crearé 2 conexiones a cada sistema de destino y me aseguraré de que puedo conectarme 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: hemos utilizado una tabla y 2 procedimientos almacenados ofrecidos por Exchange Connector, para más información sobre las tablas y procedimientos almacenados ofrecidos por el conector, por favor consulte el "Referencia del conector Exchange".

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 sencillo. Para subir un archivo a Dropbox, ejecutaremos un procedimiento almacenado "SP_UPLOADFILE" que llama a las APIs requeridas 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 cargar un archivo de texto llamado "first.txt" al directorio raíz de Dropbox. El contenido del fichero, será "Hola Mundo"; según lo acordado, necesitamos convertir ese mensaje "Hola Mundo" a bytes mediante tu propio código o cualquier conversor online.
EXEC SP_UPLOADFILE '/', 'first.txt', 'SGVsbG8gV29ybGQ=';
Nota: Para obtener más información sobre las tablas y los procedimientos almacenados que ofrece el conector de Dropbox, consulta "Referencia del conector del buzón".
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 namespaces 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:
using (OdbcConnection connection = new OdbcConnection(connectionString))
{
connection.Open();
..............................
}
4.3 Descargar los archivos adjuntos del Exchange
1. Descargamos los IDs de los emails Exchange con adjuntos a una DataTable "messageIDs". vamos a utilizar un DataAdapter "messagesAdapter" para conectar y descargar los IDs.
usando (OdbcDataAdapter mensajesAdapter = nuevo OdbcDataAdapter("SELECT ID FROM Message where HasAttachment = true;", conexión))
{
Adaptador de mensajes. Llenar (messageIDs);
}
2. Por cada ID de email de la tabla "messageIDs", vamos a obtener una lista de adjuntos "info only" y los vamos a guardar en otra DataTable "documentsListTable". Vamos a utilizar otro DataAdapter "documentsListAdapter" para obtener esa lista de 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 archivo adjunto en la "documentsListTable", vamos a obtener la dirección y utilizarla para obtener el archivo adjunto real y luego añadir ese archivo adjunto 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:
using (OdbcConnection connection = new OdbcConnection(connectionString))
{
connection.Open();
..............................
}
4.6 Subir los archivos adjuntos al Dropbox
Para cada archivo adjunto en la carpeta "documentsTable", obtendremos el nombre de archivo "OutFileName" y el contenido del fichero "OutBuffer" y guarda 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"y necesitamos añadirle los parámetros requeridos, para que podamos 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();
}
}
}
