C# integratie van Dropbox en Exchange voorbeeld

C# integratie van Dropbox en Exchange voorbeeld

Sherif KenawyTechnical Leave a Comment

1. Inleiding

1.1 Inleiding

We besloten om een korte blog te schrijven voor elke C# ontwikkelaar die graag een integratie oplossing wil ontwikkelen tussen systemen zoals Dropbox, Exchange of vele anderen. We hebben een voorbeeld korte applicatie die dient als demo van hoe eenvoudig een dergelijke integratie kan worden bereikt met behulp van de Connect Bridge platform.

1.2 Vereisten

U kunt het artikel scannen om het concept van het Connect Bridge platform te begrijpen. Bovendien bieden wij ook gratis proeflicentie van de software op aanvraag voor het geval u wilt om te spelen met het op uw eigen.

2. Scenario-eisen

Het integratiescenario dat hier nodig is, is om maak een backup van je exchange email bijlagen naar je Dropbox map. Kan handig zijn om een backup te hebben, of om uw exchange gebruik tot een minimum te beperken of andere redenen.

3. Basis-Workflow

Ongeacht de integratie-oplossing die u moet implementeren, er zijn 3 eenvoudig te volgen basisstappen die u moet uitvoeren. Deze stappen worden hierna behandeld.

3.1 De CB Query Analyzer configureren

De eerste stap is ervoor te zorgen dat je verbinding kunt maken met het doelsysteem (Exchange & Dropbox in ons scenario); de eenvoudigste manier om dat te doen is via CB Query Analyzer. Hier heb ik mijn ConnectBridge server al geconfigureerd via de Administration tool om verbinding te maken met MS Exchange 365 en met mijn Dropbox door de vereiste groepen en gebruikers aan te maken. Ik heb een gebruikersnaam genaamd "martin" met wachtwoord "1234". Deze gebruiker heeft rechten om verbinding te maken met Exchange365 en Dropbox. Nu zal ik vanuit Query Analyzer 2 verbindingen maken naar elk doelsysteem en ervoor zorgen dat ik succesvol verbinding kan maken.

Exchange voorbeeld

Figuur 1: Rekeningenadministratie

Dropbox en Exchange

Figuur 2: Beheer van groepen en gebruikers

Dropbox en Exchange

Figuur 3: Query Analyzer Verbindingen

3.2 Test uw verklaringen

Zoals hierboven getoond hebben we een succesvolle configuratie en verbinding met beide doelsystemen. Nu kunnen we onze verklaringen testen.

3.2.1. Downloaden van bijlagen van Exchange

Op mijn exchange account, heb ik een aantal emails, met slechts 3 emails die bijlagen hebben zoals hieronder weergegeven

Figuur 4: Exchange E-mails

Dropbox en Exchange

Om de bijlagen van exchange te downloaden, moeten we 3 stappen volgen:

1. Verkrijg lijst van e-mail ID's met bijlagen:
Het uitvoeren van het onderstaande statement zou ons 3 ID's moeten geven aangezien we slechts 3 emails met bijlagen hebben, zoals getoond in Figuur 4 hierboven. Om te testen neem ik de ID van de email die 2 bijlagen heeft en krijg de lijst van zijn emailbijlagen in de volgende stap.

SELECT ID FROM Message WHERE HasAttachment = true;

Figuur 5 hieronder toont de uitvoer van het uitvoeren van het bovenstaande statement.

2. Verkrijg de lijst van bijlagen van elke e-mail:

Het uitvoeren van het onderstaande statement zou ons 2 rijen moeten geven, één voor de readme.txt en één voor de logo.jpg, zoals getoond in Figuur 4 hierboven. Elke bijlage heeft een veld genaamd adres, dat in de volgende stap gebruikt zal worden om de bijlage te downloaden

EXEC SP_SELECT_ATTACHMENTS "AAMkADljZGY4ZjYzLWY2MDUtN............";

Figuur 6 hieronder toont de uitvoer van het uitvoeren van het bovenstaande statement.

3. Haal de bijlagen:
Nu zal ik de bijlage logo.jpg downloaden met het adres dat ik in de vorige stap heb gekregen

EXEC SP_SAVE_ATTACHMENT "AAMkADljZGY4ZjYzLWY2MDUtNDBjOC0.......";

Figuur 7 hieronder toont de uitvoer van het uitvoeren van het bovenstaande statement.

Opmerking: we gebruikten een tabel en 2 stored procedures aangeboden door Exchange Connector, voor meer informatie over tabellen en stored procedures aangeboden door de connector, verwijzen we naar de "Exchange Aansluiting Referentie" document.

Image

Figuur 5: Verkrijg lijst van e-mail ID's met bijlagen

Dropbox en Exchange

Figuur 6: Lijst van bijlagen uit een e-mail ophalen

Dropbox en Exchange

Figuur 7: Een bijlage ophalen

3.2.2 Een bestand uploaden naar Dropbox

Dit is een rechttoe rechtaan stap. Om een bestand naar Dropbox te uploaden, voeren we een opgeslagen procedure "SP_UPLOADFILE" uit die de vereiste API's op Dropbox aanroept om een bestand te uploaden. Voor de eenvoud gaan we een tekstbestand uploaden.

SP_UPLOADFILE:

EXEC SP_UPLOADFILE '@path', '@filename', '@content';

De bovenstaande opgeslagen procedure verwacht de inhoud van het bestand in bytes.
Ik wil graag een tekstbestand uploaden met de naam "eerste.txt" naar de hoofdmap van Dropbox. De inhoud van het bestand, zal "Hello World" zijn; zoals afgesproken, moeten we dat bericht "Hello World" omzetten naar bytes via je eigen code of een online converter.

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

Opmerking: Voor meer informatie over tabellen en stored procedures die worden aangeboden door de Dropbox-connector, raadpleegt u de "Dropbox Connector Verwijzing" document.

Figuur 8 en Figuur 9 hieronder tonen de uitvoering en de output van de bovenstaande opgeslagen procedure.

Dropbox en Exchange

Figuur 8: Een bestand uploaden naar Dropbox

Image

Figuur 9: Bestand geüpload

3.3 Kopieerverbinding en verklaringen

Nu weten we dat we bijlagen kunnen downloaden van Exchange en we weten ook dat we documenten kunnen uploaden naar Dropbox. We hebben ook onze SQL statements getest. Wat we nu moeten doen is de connectiestring van Query Analyzer en onze geteste statements kopiëren naar onze C# applicatie.

Om de verbinding van query analyzer te kopiëren, hoeven we alleen maar met de rechtermuisknop op de verbinding te klikken, op Bewerken te klikken en naar het tabblad Geavanceerd te gaan en daar de tekst te kopiëren, zoals hieronder in Figuur 10 is te zien.

Figuur 10: Connectiestring kopiëren vanuit Query Analyzer

Dropbox en Exchange

Hier zijn mijn verbindingsstrings voor beide doelsystemen.

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'

Nu zijn we klaar om visual studio.net te openen en te beginnen met de implementatie van onze C# integratie oplossing.

4. Doorloop van de oplossing

4.1 Een nieuwe C# toepassing maken

Het is voldoende om een eenvoudige console applicatie te maken. Onze oplossing vereist geen externe referentie of een pakket van derden. De oplossing is gebaseerd op ODBC; daarom hoeven we alleen maar de vereiste namespaces in onze klasse te importeren.

met behulp van System.Data;
gebruik System.Data.Odbc;

4.2 Een verbinding maken en openen met Exchange

1. Specificeer de verbindingsreeks

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

2. Maak en open de verbinding:

using (OdbcConnection connection = new OdbcConnection(connectionString))
{
    connection.Open();
    ..............................
}

4.3 Download bijlagen van Exchange

1. Download de ID's van Exchange emails met bijlagen naar een DataTable "messageIDs". we gaan een DataAdapter "messagesAdapter" gebruiken om verbinding te maken en de ID's te downloaden.

using (OdbcDataAdapter messagesAdapter = new OdbcDataAdapter("SELECT ID FROM Message where HasAttachment = true;", connection))
{
    messagesAdapter.Fill(messageIDs);
}

2. Voor elke e-mail ID in de "messageIDs" tabel, zullen we een lijst van bijlagen "info only" ophalen en deze opslaan in een andere DataTable "documentsListTable". We gaan een andere DataAdapter "documentsListAdapter" gebruiken om die lijst van bijlagen op te halen.

foreach (DataRow messageIDRow in messageIDs.Rows)
{
     string sqlQueryString = string.Format("EXEC SP_SELECT_ATTACHMENTS '{0}';",
                             messageIDRow["ID"]);
     using (OdbcDataAdapter documentsListAdapter = new OdbcDataAdapter
                                                  (sqlQueryString, verbinding))
            documentsListAdapter.Fill(documentsListTable);
}

3. Voor elke bijlage in de "documentsListTable", krijgen we het adres en gebruiken dat om de eigenlijke bijlage te krijgen en dan voegen we die bijlage toe aan een derde tabel "documentsTable". We gaan een andere DataAdapter "documentsAdapter" gebruiken om de bijlagen/documenten op te halen.

foreach (DataRow documentInfoRow in documentsListTable.Rows)
{
    string sqlQueryString = string.Format("EXEC SP_SAVE_ATTACHMENT '{0}';",
                            documentInfoRow["Adres"]);
    using (documentsAdapter = new OdbcDataAdapter(sqlQueryString, verbinding))
          documentsAdapter.Fill(documentsTable);
}

4. Voor elke succesvol gedownloade bijlage van exchange, een bericht weergeven aan de gebruiker met de bestandsnaam van de bijlage.

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

4.4 Sluit de verbinding met Exchange

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

4.5 Een verbinding met Dropbox maken en openen

1. Specificeer de verbindingsreeks

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

2. Maak en open de verbinding:

using (OdbcConnection connection = new OdbcConnection(connectionString))
{
    connection.Open();
    ..............................
}

4.6 Upload de bijlagen naar Dropbox

Voor elk bijlagebestand in de "documentsTable", krijgen we de bestandsnaam "OutFileName" en de inhoud van het bestand "OutBuffer" en sla het bestand op in de root van Dropbox map "/".

We hebben geen nieuwe DataAdapter nodig, we hebben alleen een OdbcCommand nodig op basis van "SP_UPLOADFILE" opgeslagen procedure besproken, en we moeten de vereiste parameters eraan toevoegen, zodat we de vereiste waarden kunnen doorgeven aan de opgeslagen procedure.

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

4.7 Sluit de verbinding met Dropbox

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

5. De oplossing uitvoeren

Dropbox en Exchange

Figuur 11: De oplossing uitvoeren

Dropbox en Exchange

Figuur 12: Dropbox-inhoud na het uitvoeren van de oplossing

6. Opmerkingen over de oplossing

We hebben geprobeerd de logica van de toepassing zo eenvoudig mogelijk te houden, maar de logica zou kunnen worden verbeterd door bijlagen van elke uitwisselings-e-mail in een afzonderlijke map op te slaan, waarbij de mapnaam een deel van de bericht-ID of een andere unieke identifier zou kunnen zijn.

Om het eenvoudig te houden, hebben we veel essentiële coderingsnormen genegeerd, waaronder, maar niet beperkt tot:

1. Verbindingsstrings in een configuratiebestand
2. Hashen en versleutelen van wachtwoorden met een hashcode en een zout
3. Het implementeren van design patterns zoals Single Responsibility Principle of nog beter, Dependency Inversion Principle

7. Volledige broncode

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

namespace MySolution
{
    klasse Programma
    {
        static void Main(string[] args)
        {
            //verbinden
            string connectionString = string.Empty;
            string sqlQueryString = string.Empty;
            OdbcConnection connection;
            OdbcCommand commando;
            DataTable documentsTable = nieuwe DataTable();
            OdbcDataAdapter messagesAdapter, documentsListAdapter, documentsAdapter;
            DataTable messageIDs = nieuwe DataTable();
            DataTable documentsListTable = nieuwe DataTable();

            //verbinding maken met 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))
            {
                //open verbinding
                connection.Open();

                //laad bericht-id's voor berichten met bijlagen
                using (messagesAdapter = new OdbcDataAdapter("SELECT ID FROM Message where HasAttachment = true;", connection))
                {
                    //vullen messageIDs tabel met berichten
                    messagesAdapter.Fill(messageIDs);
                }

                //voor elk bericht met berichtID, lijst met bijlagen ophalen
                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);
                }

                //krijg elke bijlage en sla deze op in 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);
                }

                //feedback geven aan gebruiker dat die bestanden zijn gedownload
                foreach (DataRow documentRow in documentsTable.Rows)
                    Console.WriteLine(string.Format("{0} gedownload!", documentRow["OutFileName"]));

                //sluit de verbinding met Exchange
                als (connection.State == ConnectionState.Open)
                    connection.Close();
            }

            //verbinding maken met 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))
            {
                //open verbinding
                connection.Open();

                //document upload status placeholder
                string fileUploadStatus = string.Empty;

                //voor elk document dat we in onze documentsTable hebben
                foreach (DataRow documentRow in documentsTable.Rows)
                {
                    //roep een opgeslagen procedure om het bestand te uploaden
                    using (command = new OdbcCommand("Exec SP_UploadFile ?, ?, ?", connection))
                    {
                        commando.CommandType = CommandType.StoredProcedure;
                        command.Parameters.AddWithValue("@path", "/");
                        command.Parameters.AddWithValue("@filename", documentRow["OutFileName"]);
                        command.Parameters.AddWithValue("@content", documentRow["OutBuffer"]);

                        //controleer de status en toon deze op het scherm
                        fileUploadStatus = (command.ExecuteNonQuery() > 0) ? "Uploaded!" : "Niet geüpload!";
                        Console.WriteLine("{0} : {1}", documentRow["OutFileName"], fileUploadStatus);
                    }
                }

                //de verbinding met Dropbox sluiten
                als (connection.State == ConnectionState.Open)
                    connection.Close();
            }

            //feedback geven aan gebruiker
            Console.WriteLine("alles klaar...");
            Console.ReadKey();
        }
    }
}

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

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