C# integração do Dropbox e Exchange exemplo

C# integração do Dropbox e Exchange exemplo

Sherif KenawyTechnical Leave a Comment

1. Introdução

1.1 Introdução

Decidimos escrever um pequeno blog para qualquer desenvolvedor do C# que gostaria de desenvolver uma solução de integração entre sistemas como Dropbox, Exchange ou muitos outros. Criamos uma pequena aplicação que serve como demonstração de como essa integração pode ser realizada de forma simples usando o Connect Bridge plataforma.

1.2 Pré-requisitos

Você pode digitalizar o artigo para entender o conceito da plataforma Connect Bridge. Além disso, nós também fornecemos uma licença de teste gratuita do software mediante solicitação, caso você queira jogar com ele por conta própria.

2. 2. Requisitos do Cenário

O cenário de integração necessário aqui é crie uma cópia de segurança a partir dos seus e-mails de troca anexos à sua pasta Dropbox. Pode ser útil para ter um backup, ou para manter o seu uso de troca ao mínimo ou algumas outras razões.

3. Fluxo de Trabalho Básico

Não importa qual é a solução de integração que você precisa implementar, existem 3 passos básicos fáceis de seguir que você precisa executar. Esses passos são abordados a seguir.

3.1 Configurar o CB Query Analyzer

O primeiro passo, é assegurar que é capaz de se ligar ao sistema alvo (Exchange & Dropbox no nosso cenário); a forma mais fácil de o fazer é através do CB Query Analyzer. Aqui já configurei o meu servidor ConnectBridge através da ferramenta de Administração para me ligar ao MS Exchange 365 e à minha Dropbox, criando os grupos e utilizadores necessários. Criei um nome de utilizador chamado "martin"com senha".1234”. Este utilizador tem direitos de ligação ao Exchange365 e ao Dropbox. Agora do Query Analyzer vou criar 2 conexões para cada sistema alvo e garantir que eu possa me conectar com sucesso.

Exchange exemplo

Figura 1: Administração de Contas

Dropbox e Exchange

Figura 2: Administração de grupos e utilizadores

Dropbox e Exchange

Figura 3: Conexões do Analisador de Consulta

3.2 Teste as suas declarações

Como mostrado acima, temos uma configuração e conexão bem sucedida com ambos os sistemas alvo. Agora podemos testar as nossas declarações.

3.2.1. Descarga de anexos do Exchange

Na minha conta de troca, tenho alguns e-mails, com apenas 3 e-mails que têm anexos, como mostrado abaixo

Figura 4: Exchange Emails

Dropbox e Exchange

Para descarregar os anexos da troca, precisamos de seguir 3 passos:

1. Obter lista de IDs de e-mail com anexos:
A execução da declaração abaixo deve nos dar 3 identificações, pois temos apenas 3 e-mails com anexos, como mostrado na Figura 4 acima. Para testar vou pegar o ID do e-mail que tem 2 anexos e obter a lista dos seus anexos de e-mail na próxima etapa.

SELECT ID FROM Message WHERE HasAttachment = true;

A Figura 5 abaixo mostra o resultado da execução da declaração acima.

2. Obtenha a lista de anexos de cada e-mail:

Executando a declaração abaixo, deve nos dar 2 linhas, uma para o readme.txt e outra para o logo.jpg, como mostrado na Figura 4 acima. Cada anexo terá um campo chamado endereço que será usado no próximo passo para fazer o download do anexo

EXEC SP_SELECT_ATTTACHMENTS 'AAMkADljZGY4ZjYzLWY2MDUtN.....................................;

A Figura 6 abaixo mostra o resultado da execução da declaração acima.

3. Vai buscar os anexos:
Agora, vou baixar o anexo logo.jpg usando seu endereço que obtive do passo anterior

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

A Figura 7 abaixo mostra o resultado da execução da declaração acima.

Nota: usamos uma tabela e 2 procedimentos armazenados oferecidos pelo conector Exchange, para mais informações sobre tabelas e procedimentos armazenados oferecidos pelo conector, por favor consulte a página "Exchange Referência do conector" documento.

Image

Figura 5: Obter lista de IDs de e-mail com anexos

Dropbox e Exchange

Figura 6: Obter lista de anexos a partir de um e-mail

Dropbox e Exchange

Figura 7: Obter um anexo

3.2.2 Upload de um arquivo para o Dropbox

Este é um passo em frente. Para carregar um arquivo no Dropbox, nós executaremos um procedimento armazenado "SP_UPLOADFILE" que chama as APIs necessárias no Dropbox para carregar um arquivo. Para simplificar, vamos carregar um arquivo de texto.

SP_UPLOADFILE:

EXEC SP_UPLOADFILE '@caminho', '@nome do ficheiro', '@contente';

O procedimento de armazenamento acima está esperando o conteúdo do arquivo em bytes.
Eu gostaria de carregar um arquivo de texto chamado "primeiro.txt"para o diretório raiz do Dropbox. O conteúdo do arquivo, será "Hello World"; como acordado, precisamos converter essa mensagem "Hello World" para bytes através do seu próprio código ou qualquer conversor online.

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

Nota: Para mais informações sobre tabelas e procedimentos armazenados oferecidos pelo conector Dropbox, por favor consulte a página "Referência Dropbox Connector" documento.

A Figura 8 e a Figura 9 abaixo mostram a execução e a saída do procedimento armazenado acima.

Dropbox e Exchange

Figura 8: Upload de um arquivo para o Dropbox

Image

Figura 9: Arquivo carregado

3.3 Conexão de cópia e declarações

Agora sabemos que podemos descarregar anexos do Exchange e também sabemos que podemos carregar documentos para o Dropbox. Nós também testamos as nossas instruções SQL. O que precisamos fazer agora é copiar a string de conexão do Query Analyzer e nossas instruções testadas para nossa aplicação C#.

Para copiar a conexão do analisador de consultas, basta clicar com o botão direito do mouse na conexão, clicar em Editar e ir para a aba Avançado e copiar o texto de lá, como mostrado abaixo na Figura 10.

Figura 10: Cópia do fio de ligação do Query Analyzer

Dropbox e Exchange

Aqui estão as minhas cordas de ligação para ambos os sistemas alvo.

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'

Agora estamos prontos para abrir o visual studio.net e começar a implementar a nossa solução de integração C#.

4. Solução Walkthrough

4.1 Criar uma Nova Aplicação C#

É suficiente para criar uma simples aplicação de consola. A nossa solução não requer nenhuma referência externa ou a implementação de qualquer pacote de terceiros. A solução é baseada em ODBC; portanto, só precisamos importar os namespaces necessários para a nossa classe.

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

4.2 Criar e abrir uma ligação ao Exchange

1. Especifique a cadeia de ligação

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

2. Criar e abrir a ligação:

usando (conexão OdbcConnection = novo OdbcConnection(connectionString))
{
    connection.Open();
    …………………………
}

4.3 Download de anexos do Exchange

1. Faça o download das IDs dos e-mails Exchange com anexos a uma DataTable "messageIDs". vamos usar um DataAdapter "messagesAdapter" para conectar e baixar as IDs.

usando (OdbcDataAdapter messagesAdapter = novo OdbcDataAdapter("SELECT ID FROM Message where HasAttachment = true;", conexão))
{
    messagesAdapter.Fill(messageIDs);
}

2. Para cada e-mail ID na tabela "messageIDs", vamos obter uma lista de anexos "info only" e salvá-los em outra DataTable "documentsListTable". Nós vamos usar outro DataAdapter "documentsListAdapter" para obter essa lista de anexos.

foreach (DataRow messageIDRow in messageIDs.Rows)
{
     string sqlQueryString = string.Format("EXEC SP_SELECT_ATTACHMENTS '{0}';",
                             messageIDRow["ID"]);
     usando (OdbcDataAdapter documentsListAdapter = novo OdbcDataAdapter
                                                  (sqlQueryString, conexão))
            documentsListAdapter.Fill(documentsListTable);
}

3. Para cada anexo da "tabela de documentos", vamos obter o endereço e usá-lo para obter o anexo real e depois adicionar esse anexo a uma terceira tabela "tabela de documentos". Vamos utilizar outro Adaptador DataAdapter "documentsAdapter" para obter os anexos/documentos.

foreach (DataRow documentInfoRow in documentsListTable.Rows)
{
    string sqlQueryString = string.Format("EXEC SP_SAVE_ATTACHMENT '{0}';",
                            documentInfoRow["Endereço"]);
    usando (documentsAdapter = novo OdbcDataAdapter(sqlQueryString, conexão))
          documentsAdapter.Fill(documentsTable);
}

4. Para cada anexo descarregado com sucesso da troca, exibir uma mensagem para o usuário usando o nome do arquivo anexo.

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

4.4 Fechar a ligação ao Exchange

se (conexão.Estado == ConexãoState.Open)
        conexão.Fechar();

4.5 Criar e abrir uma ligação ao Dropbox

1. Especifique a cadeia de ligação

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

2. Criar e abrir a ligação:

usando (conexão OdbcConnection = novo OdbcConnection(connectionString))
{
    connection.Open();
    …………………………
}

4.6 Carregar os anexos na Dropbox

Para cada arquivo anexo no "documentosTabela", vamos obter o nome do ficheiro"OutFileName" e o conteúdo do arquivo "OutBuffer" e guardar o ficheiro na raiz da pasta Dropbox "/".

Não precisamos de um novo Adaptador de Dados, só precisamos de um OdbcCommand baseado em "SP_UPLOADFILE"procedimento de armazenamento discutido anteriormente, e precisamos adicionar os parâmetros necessários para que possamos passar os valores necessários para o procedimento de armazenamento.

foreach (DataRow documentRow in documentsTable.Rows)
{
     usando (comando OdbcCommand = novo comando OdbcCommand("Exec SP_UploadFile ?, ?, ?",
           ligação)))
     {
       command.CommandType = CommandType.StoredProcedure;
       command.Parameters.AddWithValue("@caminho", "/");
       command.Parameters.AddWithValue("@filename", documentRow["OutFileName"]));
       command.Parameters.AddWithValue("@content", documentRow["OutBuffer"]));
       fileUploadStatus = (comando.ExecuteNonQuery() > 0) ? "Uploaded"! :
                          "Not Uploaded!";
       Console.WriteLine("{0} : {1}", documentRow["OutFileName"],
                                      fileUploadStatus);
     }
}

4.7 Fechar a ligação ao Dropbox

se (conexão.Estado == ConexãoState.Open)
        conexão.Fechar();

5. Executando a solução

Dropbox e Exchange

Figura 11: Executando a solução

Dropbox e Exchange

Figura 12: Conteúdo do Dropbox após a execução da solução

6. Notas sobre a solução

Tentamos manter a lógica da aplicação o mais simples possível, porém a lógica poderia ser melhorada salvando anexos de cada e-mail de troca em uma pasta separada, onde o nome da pasta poderia ser uma parte do ID da mensagem ou qualquer outro identificador único.

Por simplicidade, ignoramos muitos padrões de codificação essenciais, incluindo mas não limitados a:

1. Ter cordas de conexão em um arquivo de configuração
2. Como hashing e encriptar senhas usando um código hash e um sal
3. Implementar padrões de design como o Princípio da Responsabilidade Única ou ainda melhor, Princípio da Inversão de Dependência

7. Código Fonte Completo

utilizando o System;
utilizando System.Data;
usando System.Data.Odbc;

namespace MySolution
{
    programa da classe
    {
        vazio estático Main(string[] args)
        {
            //necessária ligação
            ligação de cordaString = string.Vazio;
            string sqlQueryString = string.Vazio;
            ligação OdbcConnection;
            comando OdbcCommand;
            DataTable documentsTable = new DataTable();
            OdbcDatAs mensagens AdapterAdapter, documentsListAdapter, documentsAdapter;
            DataTable messageIDs = novo DataTable();
            DataTable documentsListTable = novo DataTable();

            //criar ligação ao Exchange
            connectionString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_EXCH365_CU7';UID='martin';PWD='1234'";
            usando (ligação = nova OdbcConnection(connectionString))
            {
                //ligação aberta
                ligação.aberto();

                //carregar identificações de mensagens para mensagens com anexos
                usando (mensagensAdaptador = novo OdbcDataAdaptador("SELECT ID FROM Message where HasAttachment = true;", ligação))
                {
                    //fill messageIDs tabela com mensagens
                    messagesAdapter.Fill(messageIDs);
                }

                // para cada mensagem usando o id de mensagem, obter lista de anexos
                foreach (DataRow messageIDRow in messageIDs.Rows)
                {
                    sqlQueryString = string.Format("EXEC SP_SELECT_ATTACHMENTS '{0}';", messageIDRow["ID"]);
                    usando (documentsListAdapter = novo OdbcDataAdapter(sqlQueryString, conexão))
                        documentsListAdapter.Fill(documentsListTable);
                }

                //agrupar cada anexo e guardá-lo em documentosTabela
                foreach (DataRow documentInfoRow in documentsListTable.Rows)
                {
                    sqlQueryString = string.Format("EXEC SP_SAVE_ATTACHMENT '{0}';", documentInfoRow["Endereço"]);
                    usando (documentsAdapter = new OdbcDataAdapter(sqlQueryString, conexão))
                        documentsAdapter.Fill(documentsTable);
                }

                // dar feedback ao utilizador de que esses ficheiros foram descarregados
                foreach (DataRow documentRow in documentsTable.Rows)
                    Console.WriteLine(string.Format("{0} download!", documentRow["OutFileName"])));

                //fechar ligação ao Exchange
                se (ligação.Estado == ConexãoState.Open)
                    ligação.Fechar();
            }

            //criar ligação à DropBox
            connectionString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_DRBX_CBD';UID='martin';PWD='1234'";
            usando (ligação = nova OdbcConnection(connectionString))
            {
                //ligação aberta
                ligação.aberto();

                //documentar o estado de carregamento de documentos local de colocação
                string fileUploadStatus = string.Empty;

                // para cada documento que temos nos nossos documentosTabela
                foreach (DataRow documentRow in documentsTable.Rows)
                {
                    //convite um procedimento de armazenamento para carregar o ficheiro
                    usando (comando = novo OdbcCommand("Exec SP_UploadFile ?, ?, ?", ligação))
                    {
                        command.CommandType = CommandType.StoredProcedure;
                        command.Parameters.AddWithValue("@caminho", "/");
                        command.Parameters.AddWithValue("@filename", documentRow["OutFileName"]));
                        command.Parameters.AddWithValue("@content", documentRow["OutBuffer"]));

                        //cheque o estado e exibição no ecrã
                        fileUploadStatus = (comando.ExecuteNonQuery() > 0) ? "Uploaded"! Uploaded: "Not Uploaded!";
                        Console.WriteLine("{0} : {1}", documentRow["OutFileName"], fileUploadStatus);
                    }
                }

                //fechar ligação à Dropbox
                se (ligação.Estado == ConexãoState.Open)
                    ligação.Fechar();
            }

            // dar feedback ao utilizador
            Console.WriteLine("tudo feito...");
            Console.ReadKey();
        }
    }
}

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

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

I agree to these terms.