C# integrazione di Dropbox e Exchange esempio

C# integrazione di Dropbox e Exchange esempio

Sherif KenawyTechnical Leave a Comment

1. Introduzione

1.1 Introduzione

Abbiamo deciso di scrivere un breve blog per tutti gli sviluppatori di C# che desiderano sviluppare una soluzione di integrazione tra sistemi come Dropbox, Exchange o molti altri. Abbiamo creato una breve applicazione di esempio che serve come dimostrazione di come una tale integrazione può essere realizzata in modo semplice utilizzando il sistema Connect Bridge piattaforma.

1.2 Prerequisiti

È possibile scansionare l'articolo per capire il concetto della piattaforma Connect Bridge. Inoltre, su richiesta, forniamo anche una licenza di prova gratuita del software nel caso in cui vogliate giocarci da soli.

2. 2. Requisiti dello scenario

Lo scenario di integrazione qui richiesto è creare un backup dagli allegati delle e-mail di scambio alla cartella Dropbox. Potrebbe essere utile per avere un backup, o per ridurre al minimo l'utilizzo dello scambio o per altri motivi.

3. 3. Flusso di lavoro di base

Non importa quale sia la soluzione di integrazione che vi viene richiesta per l'implementazione, ci sono 3 semplici passi di base da seguire che dovete eseguire. Questi passi sono i prossimi.

3.1 Configurare l'analizzatore di query CB

Il primo passo è assicurarsi di essere in grado di connettersi al sistema di destinazione (Exchange e Dropbox nel nostro scenario); il modo più semplice per farlo è tramite CB Query Analyzer. In questo caso, ho già configurato il mio server ConnectBridge tramite lo strumento di amministrazione per connettermi a MS Exchange 365 e a Dropbox, creando i gruppi e gli utenti necessari. Ho creato un nome utente chiamato "martin" con password "1234”. Questo utente ha i diritti per connettersi a Exchange365 e Dropbox. Ora da Query Analyzer creerò 2 connessioni ad ogni sistema di destinazione e mi assicurerò di potermi collegare con successo.

Esempio Exchange

Figura 1: Amministrazione dei conti

Dropbox e Exchange

Figura 2: Amministrazione di gruppi e utenti

Dropbox e Exchange

Figura 3: Connessioni dell'analizzatore di interrogazione

3.2 Testate le vostre dichiarazioni

Come mostrato sopra, abbiamo una configurazione e una connessione di successo con entrambi i sistemi di destinazione. Ora possiamo testare le nostre affermazioni.

3.2.1. Scaricare gli allegati da Exchange

Sul mio account di scambio ho un paio di email, con solo 3 email che hanno allegati come mostrato di seguito

Figura 4: Email Exchange

Dropbox e Exchange

Per scaricare gli allegati dallo scambio, dobbiamo seguire 3 passi:

1. 1. Ottenere una lista di ID e-mail con allegati:
L'esecuzione della seguente dichiarazione dovrebbe fornirci 3 ID in quanto abbiamo solo 3 e-mail con allegati, come mostrato nella Figura 4 sopra. Per il test prenderò l'ID dell'email che ha 2 allegati e otterrò la lista dei suoi allegati nella prossima fase.

SELEZIONARE ID DAL Messaggio DOVE È STATO FATTO = vero;

La figura 5 qui sotto mostra l'output dell'esecuzione della dichiarazione di cui sopra.

2. 2. Ricevi l'elenco degli allegati da ogni e-mail:

L'esecuzione della seguente dichiarazione, dovrebbe darci 2 righe, una per il readme.txt e una per il logo.jpg, come mostrato nella Figura 4 sopra. Ogni allegato avrà un campo chiamato indirizzo che verrà utilizzato nella fase successiva per scaricare l'allegato

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

La figura 6 qui sotto mostra l'output dell'esecuzione della dichiarazione di cui sopra.

3. 3. Prendi gli allegati:
Ora, scaricherò l'allegato logo.jpg utilizzando il suo indirizzo che ho ottenuto dal passo precedente

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

La figura 7 qui sotto mostra l'output dell'esecuzione della dichiarazione di cui sopra.

Nota: abbiamo usato una tabella e 2 stored procedure offerte da Exchange Connector, per maggiori informazioni sulle tabelle e le stored procedure offerte dal connettore, si prega di fare riferimento al ".Exchange Riferimento connettore"documento".

Image

Figura 5: Ottenere una lista di ID e-mail con allegati

Dropbox e Exchange

Figura 6: Ottenere la lista degli allegati da una e-mail

Dropbox e Exchange

Figura 7: Ottenere un allegato

3.2.2 Caricare un file su Dropbox

Questo è un passo avanti. Per caricare un file su Dropbox, eseguiremo una procedura memorizzata "SP_UPLOADFILE" che chiama le API richieste su Dropbox per caricare un file. Per semplicità caricheremo un file di testo.

SP_UPLOADFILE:

EXEC SP_UPLOADFILE '@path', '@nome file', '@contenuto';

La procedura di memorizzazione sopra descritta prevede che il contenuto del file sia in byte.
Vorrei caricare un file di testo chiamato "primo.txt" alla directory principale di Dropbox. Il contenuto del file, sarà "Hello World"; come concordato, dobbiamo convertire il messaggio "Hello World" in byte tramite il vostro codice o un qualsiasi convertitore online.

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

Nota: Per ulteriori informazioni sulle tabelle e le procedure memorizzate offerte dal connettore Dropbox, si prega di fare riferimento alla "Riferimento connettore Dropbox"documento".

La Figura 8 e la Figura 9 qui sotto mostrano l'esecuzione e l'uscita della procedura memorizzata di cui sopra.

Dropbox e Exchange

Figura 8: Caricamento di un file su Dropbox

Image

Figura 9: File caricato

3.3 Copiare il collegamento e le dichiarazioni

Ora sappiamo che siamo in grado di scaricare gli allegati da Exchange e sappiamo anche che possiamo caricare i documenti su Dropbox. Abbiamo anche testato le nostre dichiarazioni SQL. Quello che dobbiamo fare ora è copiare la stringa di connessione da Query Analyzer e le nostre istruzioni testate nella nostra applicazione C#.

Per copiare la connessione dall'analizzatore di interrogazione, basta cliccare con il tasto destro del mouse sulla connessione, cliccare su Modifica e andare alla scheda Avanzate e copiare il testo da lì come mostrato in Figura 10.

Figura 10: Copia della stringa di connessione da Query Analyzer

Dropbox e Exchange

Ecco le mie stringhe di connessione per entrambi i sistemi di destinazione.

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'.

Ora siamo pronti ad aprire visual studio.net e ad iniziare ad implementare la nostra soluzione di integrazione C#.

4. 4. Soluzione Passeggiata della soluzione

4.1 Creare una nuova applicazione C#

È sufficiente creare una semplice applicazione da console. La nostra soluzione non richiede alcun riferimento esterno o la distribuzione di pacchetti di terze parti. La soluzione è basata su ODBC; quindi, abbiamo solo bisogno di importare i namespace richiesti nella nostra classe.

utilizzando System.Data;
utilizzando System.Data.Odbc;

4.2 Creare e aprire una connessione all'Exchange

1. 2. Specificare la stringa di connessione

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

2. Creare e aprire la connessione:

utilizzando (OdbcConnection connection = nuovo OdbcConnection(connectionString))
{
    connection.Open();
    …………………………
}

4.3 Scaricare gli allegati da Exchange

1. 2. Scaricare gli ID delle e-mail Exchange con allegati ad un DataTable "messageIDs". useremo un DataAdapter "messagesAdapter" per connetterci e scaricare gli ID.

utilizzando (OdbcDataAdapter messagesAdapter = nuovo OdbcDataAdapter ("SELECT ID FROM Message where HasAttachment = true;", connessione))
{
    messagesAdapter.Fill(messageIDs);
}

2. Per ogni ID e-mail nella tabella "messageIDs", otterremo una lista di allegati "info only" e li salveremo in un'altra DataTable "documentsListTable". Utilizzeremo un altro DataAdapter "documentsListAdapter" per ottenere l'elenco degli allegati.

foreach (DataRow messageIDRow in messageIDs.Rows)
{
     stringa sqlQueryString = stringa.Formato("EXEC SP_SELECT_ATTACHMENTS '{0}';",
                             messageIDRow["ID"]);
     utilizzando (OdbcDataAdapter documentsListAdapter = nuovo OdbcDataAdapter
                                                  (sqlQueryString, collegamento))
            documentsListAdapter.Fill(documentsListTable);
}

3. Per ogni allegato nella "documentsListTable", otterremo l'indirizzo e lo useremo per ottenere l'allegato effettivo e poi aggiungeremo quell'allegato ad una terza tabella "documentsTable". Utilizzeremo un altro DataAdapter "documentsAdapter" per ottenere gli allegati/documenti.

foreach (DataRow documentInfoRow in documentsListTable.Rows)
{
    stringa sqlQueryString = stringa.Formato ("EXEC SP_SAVE_ATTACHMENT '{0}';",
                            documentoInfoRow["Indirizzo"]);
    utilizzando (documentsAdapter = nuovo OdbcDataAdapter(sqlQueryString, connessione))
          DocumentiAdapter.Fill(documentsTable);
}

4. 4. Per ogni allegato scaricato con successo dallo scambio, visualizzare un messaggio all'utente utilizzando il nome del file allegato.

foreach (DataRow documentRow documentRow in documentsTable.Rows)
    Console.WriteLine(stringa.Formato("{0} scaricato!",
                                    documentRow["OutFileName"]));

4.4 Chiudere il collegamento a Exchange

if (connection.State == ConnectionState.Open)
        connection.Close();

4.5 Creare e aprire una connessione a Dropbox

1. 2. Specificare la stringa di connessione

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

2. Creare e aprire la connessione:

utilizzando (OdbcConnection connection = nuovo OdbcConnection(connectionString))
{
    connection.Open();
    …………………………
}

4.6 Caricare gli allegati su Dropbox

Per ogni file allegato nel file "documentiTabella", otterremo il nome del file "OutFileName" e il contenuto del file "OutBuffer" e salvare il file nella root della cartella Dropbox "/".

Non abbiamo bisogno di un nuovo DataAdapter, abbiamo solo bisogno di un OdbcCommand basato su "SP_UPLOADFILE"stored procedure" discusso in precedenza, e dobbiamo aggiungere i parametri richiesti, in modo da poter passare i valori richiesti alla stored procedure.

foreach (DataRow documentRow in documentsTable.Rows)
{
     using (OdbcCommand command = new OdbcCommand("Exec SP_UploadFile ?, ?, ?",
           connection))
     {
       command.CommandType = CommandType.StoredProcedure;
       command.Parameters.AddWithValue("@path", "/");
       command.Parameters.AddWithValue("@filename", documentRow["OutFileName"]);
       command.Parameters.AddWithValue("@content", documentRow["OutBuffer"]);
       fileUploadStatus = (command.ExecuteNonQuery() > 0) ? "Caricato!" :
                          "Non caricato!";
       Console.WriteLine("{0} : {1}", documentRow["OutFileName"],
                                      fileUploadStatus);
     }
}

4.7 Chiudere il collegamento a Dropbox

if (connection.State == ConnectionState.Open)
        connection.Close();

5. Esecuzione della soluzione

Dropbox e Exchange

Figura 11: Esecuzione della soluzione

Dropbox e Exchange

Figura 12: Contenuto della Dropbox dopo l'esecuzione della soluzione

6. 6. Note sulla soluzione

Abbiamo cercato di mantenere la logica dell'applicazione il più semplice possibile, tuttavia la logica potrebbe essere migliorata salvando gli allegati di ogni e-mail di scambio in una cartella separata, dove il nome della cartella potrebbe essere una parte dell'ID del messaggio o qualsiasi altro identificatore univoco.

Per semplicità abbiamo ignorato molti standard di codifica essenziali, tra cui, ma non solo, gli standard di codifica:

1. Avere le stringhe di connessione in un file di configurazione
2. 2. Hashing e crittografare le password utilizzando un codice hash e un sale
3. 3. Implementare modelli di progettazione come il principio della responsabilità unica o, ancora meglio, il principio dell'inversione di dipendenza

7. 7. Codice sorgente completo

utilizzando System;
using System.Data;
using System.Data.Odbc;

spazio dei nomi MySolution
{
    classe Programma
    {
        static void Main(string[] args)
        {
            //fornire la connessione
            string connectionString = string.Empty;
            string sqlQueryString = string.Empty;
            OdbcConnection connessione;
            OdbcCommand command;
            DataTable documentsTable = new DataTable();
            OdbcDataAdapter messagesAdapter, documentsListAdapter, documentsAdapter;
            DataTable messageIDs = new DataTable();
            DataTable documentsListTable = new DataTable();

            /creare la connessione all'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))
            {
                //apri la connessione
                connection.Open();

                //caricare gli id dei messaggi con allegati
                using (messagesAdapter = new OdbcDataAdapter("SELECT ID FROM Message where HasAttachment = true;", connection))
                {
                    /riempie la tabella messageIDs con i messaggi
                    messagesAdapter.Fill(messageIDs);
                }

                //per ogni messaggio che utilizza l'id del messaggio, ottenere l'elenco degli allegati
                foreach (DataRow messageIDRow in messageIDs.Rows)
                {
                    sqlQueryString = string.Format("EXEC SP_SELECT_ATTACHMENTS '{0}';", messageIDRow["ID"]);
                    using (documentsListAdapter = new OdbcDataAdapter(sqlQueryString, connection))
                        documentsListAdapter.Fill(documentsListTable);
                }

                //raccogliere ogni allegato e salvarlo nella tabella documentsTable
                foreach (DataRow documentInfoRow in documentsListTable.Rows)
                {
                    sqlQueryString = string.Format("EXEC SP_SAVE_ATTACHMENT '{0}';", documentInfoRow["Address"]);
                    using (documentsAdapter = new OdbcDataAdapter(sqlQueryString, connection))
                        documentsAdapter.Fill(documentsTable);
                }

                //dare all'utente il feedback che i file sono stati scaricati
                foreach (DataRow documentRow in documentsTable.Rows)
                    Console.WriteLine(string.Format("{0} scaricato!", documentRow["OutFileName"]));

                //chiudere la connessione all'Exchange
                if (connection.State == ConnectionState.Open)
                    connection.Close();
            }

            //creare la connessione a 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))
            {
                //apri la connessione
                connection.Open();

                // segnaposto dello stato di caricamento del documento
                string fileUploadStatus = string.Empty;

                //per ogni documento presente in documentsTable
                foreach (DataRow documentRow in documentsTable.Rows)
                {
                    /chiamare una procedura memorizzata per caricare il file
                    using (command = new OdbcCommand("Exec SP_UploadFile ?, ?, ?", connection))
                    {
                        command.CommandType = CommandType.StoredProcedure;
                        command.Parameters.AddWithValue("@path", "/");
                        command.Parameters.AddWithValue("@filename", documentRow["OutFileName"]);
                        command.Parameters.AddWithValue("@content", documentRow["OutBuffer"]);

                        //verifica lo stato e visualizzazione sullo schermo
                        fileUploadStatus = (command.ExecuteNonQuery() > 0) ? "Caricato!" : "Non caricato!";
                        Console.WriteLine("{0} : {1}", documentRow["OutFileName"], fileUploadStatus);
                    }
                }

                //chiudere la connessione a Dropbox
                if (connection.State == ConnectionState.Open)
                    connection.Close();
            }

            //dare un feedback all'utente
            Console.WriteLine("tutto fatto...");
            Console.ReadKey();
        }
    }
}

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

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