C#-Integration von Dropbox und Exchange-Beispiel

C#-Integration von Dropbox und Exchange-Beispiel

Sherif KenawyTechnical Leave a Comment

1. Einführung

1.1 Einleitung

Wir haben beschlossen, einen kurzen Blog für alle C#-Entwickler zu schreiben, die eine Integrationslösung zwischen Systemen wie Dropbox, Exchange und vielen anderen entwickeln möchten. Wir haben eine Beispiel-Kurzanwendung erstellt, die als Demo dafür dient, wie einfach eine solche Integration mit dem Connect Bridge Plattform.

1.2 Voraussetzungen

Sie können den Artikel einscannen, um das Konzept der Connect Bridge-Plattform zu verstehen. Darüber hinaus stellen wir auf Anfrage eine kostenlose Testlizenz der Software zur Verfügung, falls Sie selbst damit spielen möchten.

2. Szenario-Anforderungen

Das hier erforderliche Integrationsszenario ist Erstellen Sie eine Sicherungskopie von den Anhängen Ihrer Exchange-E-Mails in Ihrem Dropbox-Ordner. Könnte nützlich sein, um ein Backup zu haben, oder um Ihre Austauschnutzung auf ein Minimum zu beschränken oder aus anderen Gründen.

3. Grundlegender Arbeitsablauf

Unabhängig von der Integrationslösung, die Sie implementieren müssen, gibt es drei grundlegende, einfach zu befolgende Schritte, die Sie ausführen müssen. Diese Schritte werden im Folgenden behandelt.

3.1 Konfigurieren des CB-Abfrage-Analysators

Im ersten Schritt müssen Sie sicherstellen, dass Sie sich mit dem Zielsystem (Exchange und Dropbox in unserem Szenario) verbinden können; am einfachsten geht das über CB Query Analyzer. Hier habe ich meinen ConnectBridge Server bereits über das Administrationstool konfiguriert, um eine Verbindung zu MS Exchange 365 und zu meiner Dropbox herzustellen, indem ich die erforderlichen Gruppen und Benutzer angelegt habe. Ich habe einen Benutzernamen namens "martin" mit Passwort "1234”. Dieser Benutzer hat die Rechte zur Verbindung mit Exchange365 und Dropbox. Nun werde ich vom Query Analyzer aus 2 Verbindungen zu jedem Zielsystem erstellen und sicherstellen, dass ich mich erfolgreich verbinden kann.

Exchange Beispiel

Abbildung 1: Kontenverwaltung

Dropbox und Exchange

Abbildung 2: Gruppen- und Benutzerverwaltung

Dropbox und Exchange

Abbildung 3: Query-Analyzer-Verbindungen

3.2 Testen Sie Ihre Aussagen

Wie oben gezeigt, haben wir eine erfolgreiche Konfiguration und Verbindung zu beiden Zielsystemen. Jetzt können wir unsere Aussagen testen.

3.2.1. Herunterladen von Anhängen von Exchange

Auf meinem Austauschkonto habe ich einige E-Mails, aber nur 3 E-Mails mit Anhängen, wie unten dargestellt

Abbildung 4: E-Mails austauschen

Dropbox und Exchange

Um die Anhänge aus dem Austausch herunterzuladen, müssen wir 3 Schritte befolgen:

1. Liste der E-Mail-IDs mit Anhängen abrufen:
Die Ausführung der untenstehenden Erklärung sollte uns 3 IDs liefern, da wir nur 3 E-Mails mit Anhängen haben, wie in Abbildung 4 oben gezeigt. Zum Testen nehme ich die ID der E-Mail, die 2 Anhänge hat, und erhalte im nächsten Schritt die Liste ihrer E-Mail-Anhänge.

SELECT ID FROM Message WHERE HasAttachment = true;

Abbildung 5 unten zeigt das Ergebnis der Ausführung der obigen Anweisung.

2. Erhalten Sie eine Liste der Anhänge von jeder E-Mail:

Wenn Sie die untenstehende Anweisung ausführen, sollten Sie 2 Zeilen erhalten, eine für die readme.txt und eine für die logo.jpg, wie in Abbildung 4 oben gezeigt. Jeder Anhang wird ein Feld namens Adresse haben, das im nächsten Schritt zum Herunterladen des Anhangs verwendet wird

EXEC SP_SELECT_ATTACHMENTS 'AAMkADljZGY4ZjYzLWY2MDUtN…………';

Abbildung 6 unten zeigt das Ergebnis der Ausführung der obigen Anweisung.

3. Holen Sie sich die Anhänge:
Nun werde ich den Anhang logo.jpg herunterladen, wobei ich die Adresse verwende, die ich aus dem vorherigen Schritt erhalten habe

EXEC SP_SAVE_ATTACHMENT 'AAMkADljZGY4ZjYzLWY2MDUtNDBjOC0…….';

Abbildung 7 unten zeigt das Ergebnis der Ausführung der obigen Aussage.

Hinweis: Wir haben eine Tabelle und 2 Stored Procedures verwendet, die vom Exchange Connector angeboten werden. Weitere Informationen über Tabellen und Stored Procedures, die vom Connector angeboten werden, finden Sie im "Referenz für Austausch-Steckverbinder" Dokument.

Image

Abbildung 5: Liste der E-Mail-IDs mit Anhängen

Dropbox und Exchange

Abbildung 6: Liste der Anhänge einer E-Mail abrufen

Dropbox und Exchange

Abbildung 7: Anhang abrufen

3.2.2 Hochladen einer Datei in Dropbox

Dies ist ein direkter Schritt nach vorn. Um eine Datei auf Dropbox hochzuladen, werden wir eine gespeicherte Prozedur "SP_UPLOADFILE" ausführen, die die erforderlichen APIs auf Dropbox aufruft, um eine Datei hochzuladen. Der Einfachheit halber werden wir eine Textdatei hochladen.

SP_UPLOADFILE:

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

Die obige Stored Procedure erwartet den Inhalt der Datei in Bytes.
Ich möchte eine Textdatei mit dem Namen "erste.txt"in das Stammverzeichnis von Dropbox. Der Inhalt der Datei wird "Hello World" sein; wie vereinbart, müssen wir die Nachricht "Hello World" über Ihren eigenen Code oder einen beliebigen Online-Konverter in Bytes umwandeln.

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

Hinweis: Weitere Informationen über Tabellen und gespeicherte Prozeduren, die vom Dropbox-Konnektor angeboten werden, finden Sie im "Referenz des Dropbox-Verbinders" Dokument.

Abbildung 8 und Abbildung 9 unten zeigen die Ausführung und die Ausgabe der obigen Stored Procedure.

Dropbox und Exchange

Abbildung 8: Hochladen einer Datei in Dropbox

Image

Abbildung 9: Hochgeladene Datei

3.3 Verbindung und Erklärungen kopieren

Jetzt wissen wir, dass wir in der Lage sind, Anhänge von Exchange herunterzuladen, und wir wissen auch, dass wir Dokumente in Dropbox hochladen können. Wir haben auch unsere SQL-Anweisungen getestet. Was wir jetzt tun müssen, ist, den Verbindungsstring vom Query Analyzer und unsere getesteten Anweisungen in unsere C#-Anwendung zu kopieren.

Um die Verbindung aus dem Abfrageanalysator zu kopieren, brauchen wir nur mit der rechten Maustaste auf die Verbindung zu klicken, auf Bearbeiten zu klicken und zur Registerkarte Erweitert zu gehen und den Text von dort aus zu kopieren, wie unten in Abbildung 10 dargestellt.

Abbildung 10: Kopieren der Verbindungszeichenfolge aus Query Analyzer

Dropbox und Exchange

Hier sind meine Verbindungszeichenfolgen für beide Zielsysteme.

Exchange

Driver={Media Gateway ODBC Driver};impl='CORBA';host='localhost';port='8087';acc='ACC_EXCH365_CU7';uid='martin';pwd='1234'

Postfach

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

Jetzt sind wir bereit, visual studio.net zu öffnen und mit der Implementierung unserer C#-Integrationslösung zu beginnen.

4. Lösung Komplettlösung

4.1 Erstellen einer neuen C#-Anwendung

Es ist ausreichend, eine einfache Konsolenanwendung zu erstellen. Unsere Lösung erfordert weder eine externe Referenz noch die Bereitstellung von Paketen Dritter. Die Lösung basiert auf ODBC; daher müssen wir nur die erforderlichen Namespaces in unsere Klasse importieren.

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

4.2 Erstellen und Öffnen einer Verbindung zu Exchange

1. Geben Sie die Verbindungszeichenfolge

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

2. Erstellen und öffnen Sie die Verbindung:

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

4.3 Herunterladen von Anhängen von Exchange

1. Laden Sie die IDs von Exchange-E-Mails mit Anhängen in eine DataTable "messageIDs" herunter. Wir werden einen DataAdapter "messagesAdapter" verwenden, um die IDs zu verbinden und herunterzuladen.

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

2. Für jede E-Mail-ID in der Tabelle "messageIDs" erhalten wir eine Liste von Anhängen "nur Info" und speichern sie in einer anderen DataTable "documentsListTable". Wir werden einen anderen DataAdapter "documentsListAdapter" verwenden, um diese Liste von Anhängen zu erhalten.

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

3. Für jeden Anhang in der "documentsListTable" erhalten wir die Adresse und verwenden sie, um den eigentlichen Anhang zu erhalten, und fügen diesen Anhang dann in eine dritte Tabelle "documentsTable" ein. Wir werden einen weiteren DataAdapter "documentsAdapter" verwenden, um die Anhänge/Dokumente zu erhalten.

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

4. Zeigen Sie dem Benutzer für jeden erfolgreich vom Exchange heruntergeladenen Anhang eine Nachricht mit dem Dateinamen des Anhangs an.

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

4.4 Schließen Sie die Verbindung zur Börse

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

4.5 Erstellen und Öffnen einer Verbindung zu Dropbox

1. Geben Sie die Verbindungszeichenfolge

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

2. Erstellen und öffnen Sie die Verbindung:

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

4.6 Hochladen der Anhänge in Dropbox

Für jede Anhangsdatei in der "DokumenteTabelle", erhalten wir den Dateinamen "OutFileName"und den Dateiinhalt "OutBuffer"und speichern Sie die Datei in der Wurzel des Dropbox-Ordners "/".

Wir brauchen keinen neuen DataAdapter, wir brauchen nur einen OdbcCommand basierend auf "SP_UPLOADFILE"Wir müssen die erforderlichen Parameter hinzufügen, damit wir die erforderlichen Werte an die gespeicherte Prozedur übergeben können.

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

4.7 Schließen Sie die Verbindung zu Dropbox

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

5. Ausführen der Lösung

Dropbox und Exchange

Abbildung 11: Ausführen der Lösung

Dropbox und Exchange

Abbildung 12: Inhalt der Dropbox nach Ausführung der Lösung

6. Anmerkungen zur Lösung

Wir haben versucht, die Anwendungslogik so einfach wie möglich zu halten. Die Logik könnte jedoch verbessert werden, indem Anhänge von jeder Austausch-E-Mail in einem separaten Ordner gespeichert werden, wobei der Ordnername ein Teil der Nachrichten-ID oder eines anderen eindeutigen Identifikators sein könnte.

Der Einfachheit halber haben wir viele wesentliche Kodierungsstandards ignoriert, unter anderem, aber nicht ausschließlich, die Kodierungsstandards:

1. Verbindungszeichenfolgen in einer Konfigurationsdatei haben
2. Hashing und Verschlüsselung von Kennwörtern mit einem Hash-Code und einem Salt
3. Implementierung von Entwurfsmustern wie dem Single Responsibility-Prinzip oder noch besser dem Prinzip der Umkehrung der Abhängigkeit

7. Vollständiger Quellcode

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

namespace MySolution
{
    Klasse Programm
    {
        static void Main(string[] args)
        {
            //Verbindung bereitstellen
            string connectionString = string.Empty;
            string sqlQueryString = string.Empty;
            OdbcConnection connection;
            OdbcCommand Befehl;
            DataTable documentsTable = new DataTable();
            OdbcDataAdapter messagesAdapter, documentsListAdapter, documentsAdapter;
            DataTable messageIDs = new DataTable();
            DataTable documentsListTable = new DataTable();

            //Erstellen der Verbindung zu 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))
            {
                //Verbindung öffnen
                connection.Open();

                //Nachrichten-IDs für Nachrichten mit Anhängen laden
                using (messagesAdapter = new OdbcDataAdapter("SELECT ID FROM Message where HasAttachment = true;", connection))
                {
                    //Füllen der Tabelle messageIDs mit Nachrichten
                    messagesAdapter.Fill(messageIDs);
                }

                //für jede Nachricht mit der Nachrichten-ID die Liste der Anhänge abrufen
                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);
                }

                //jedes Attachment abrufen und in documentsTable speichern
                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);
                }

                //Dem Benutzer eine Rückmeldung geben, dass die Dateien heruntergeladen wurden
                foreach (DataRow documentRow in documentsTable.Rows)
                    Console.WriteLine(string.Format("{0} heruntergeladen!", documentRow["OutFileName"]));

                //Verbindung zu Exchange schließen
                if (connection.State == ConnectionState.Open)
                    connection.Close();
            }

            //Erstellen der Verbindung zu 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))
            {
                //Verbindung öffnen
                connection.Open();

                //Dokumenten-Upload-Status Platzhalter
                string fileUploadStatus = string.Empty;

                //für jedes Dokument, das wir in unserer documentsTable haben
                foreach (DataRow documentRow in documentsTable.Rows)
                {
                    //Aufruf einer gespeicherten Prozedur zum Hochladen der Datei
                    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"]);

                        //Status prüfen und auf dem Bildschirm anzeigen
                        fileUploadStatus = (command.ExecuteNonQuery() > 0) ? "Hochgeladen!" : "Nicht hochgeladen!";
                        Console.WriteLine("{0} : {1}", documentRow["OutFileName"], fileUploadStatus);
                    }
                }

                //Schließen der Verbindung zu Dropbox
                if (connection.State == ConnectionState.Open)
                    connection.Close();
            }

            //Feedback an den Benutzer geben
            Console.WriteLine("alles erledigt...");
            Console.ReadKey();
        }
    }
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

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