Exemple d'intégration C# de Dropbox et Exchange

Exemple d'intégration C# de Dropbox et Exchange

Sherif KenawyTechnical Leave a Comment

1. Introduction

1.1 Introduction

Nous avons décidé d'écrire un court blog pour tous les développeurs C# qui souhaitent développer une solution d'intégration entre des systèmes tels que Dropbox, Exchange ou bien d'autres. Nous avons créé un exemple de courte application qui sert de démonstration de la simplicité d'une telle intégration en utilisant le Connect Bridge de l'UE.

1.2 Conditions préalables

Vous pouvez parcourir l'article pour comprendre le concept de la plate-forme Connect Bridge. En outre, nous fournissons également une licence d'essai gratuite du logiciel sur demande au cas où vous souhaiteriez jouer avec par vous-même.

2. Exigences du scénario

Le scénario d'intégration requis ici consiste à créer une sauvegarde des pièces jointes de vos e-mails d'échange dans votre dossier Dropbox. Il peut être utile de disposer d'une sauvegarde, ou de réduire au minimum l'utilisation de l'échange, ou pour d'autres raisons.

3. Flux de travail de base

Quelle que soit la solution d'intégration que vous devez mettre en œuvre, il existe trois étapes de base faciles à suivre que vous devez exécuter. Ces étapes sont décrites ci-après.

3.1 Configurer l'analyseur de requêtes CB

La première étape consiste à s'assurer que vous êtes en mesure de vous connecter au système cible (Exchange et Dropbox dans notre scénario) ; la façon la plus simple de le faire est de passer par CB Query Analyzer. Ici, j'ai déjà configuré mon serveur ConnectBridge via l'outil d'administration pour me connecter à MS Exchange 365 et à ma Dropbox en créant les groupes et utilisateurs requis. J'ai créé un nom d'utilisateur appelé "martin"avec mot de passe1234”. Cet utilisateur a le droit de se connecter à Exchange365 et Dropbox. Maintenant, à partir de Query Analyzer, je vais créer 2 connexions vers chaque système cible et m'assurer que je peux me connecter avec succès.

Exemple de Exchange

Figure 1 : Administration des comptes

Dropbox et Exchange

Figure 2 : Administration des groupes et des utilisateurs

Dropbox et Exchange

Figure 3 : Connexions de l'analyseur de requêtes

3.2 Testez vos déclarations

Comme indiqué ci-dessus, nous avons une configuration et une connexion réussies aux deux systèmes cibles. Nous pouvons maintenant tester nos déclarations.

3.2.1. Téléchargement des pièces jointes à partir de Exchange

Sur mon compte d'échange, j'ai quelques e-mails, dont seulement 3 avec des pièces jointes, comme indiqué ci-dessous

Figure 4 : Emails Exchange

Dropbox et Exchange

Pour télécharger les pièces jointes de l'échange, nous devons suivre 3 étapes :

1. Obtenez la liste des identifiants de courriel avec pièces jointes :
L'exécution de la déclaration ci-dessous devrait nous donner 3 identifiants car nous n'avons que 3 e-mails avec pièces jointes, comme le montre la figure 4 ci-dessus. Pour le test, je vais prendre l'ID du courriel qui a 2 pièces jointes et j'obtiendrai la liste de ses pièces jointes à l'étape suivante.

SELECT ID FROM Message WHERE HasAttachment = true ;

La figure 5 ci-dessous montre le résultat de l'exécution de la déclaration ci-dessus.

2. Obtenez la liste des pièces jointes de chaque courriel :

En exécutant la déclaration ci-dessous, nous devrions obtenir 2 lignes, une pour le readme.txt et une pour le logo.jpg, comme indiqué dans la figure 4 ci-dessus. Chaque pièce jointe aura un champ appelé adresse qui sera utilisé dans l'étape suivante pour télécharger la pièce jointe

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

La figure 6 ci-dessous montre le résultat de l'exécution de la déclaration ci-dessus.

3. Obtenez les pièces jointes :
Maintenant, je vais télécharger la pièce jointe logo.jpg en utilisant l'adresse que j'ai obtenue à l'étape précédente

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

La figure 7 ci-dessous montre le résultat de l'exécution de la déclaration ci-dessus.

Note : nous avons utilisé une table et 2 procédures stockées offertes par le connecteur Exchange. Pour plus d'informations sur les tables et les procédures stockées offertes par le connecteur, veuillez vous référer à la page "Référence du connecteur ExchangeLe document ".

Image

Figure 5 : Obtenir la liste des identifiants de courrier électronique avec pièces jointes

Dropbox et Exchange

Figure 6 : Obtenir la liste des pièces jointes à partir d'un courriel

Dropbox et Exchange

Figure 7 : Obtenir une pièce jointe

3.2.2 Téléchargement d'un fichier dans la boîte de dépôt

C'est un pas en avant. Pour télécharger un fichier sur Dropbox, nous allons exécuter une procédure stockée "SP_UPLOADFILE" qui appelle les API requises sur Dropbox pour télécharger un fichier. Pour plus de simplicité, nous allons télécharger un fichier texte.

SP_UPLOADFILE :

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

La procédure de stockage ci-dessus s'attend à ce que le contenu du fichier soit exprimé en octets.
Je souhaite télécharger un fichier texte appelé "first.txt" au répertoire racine de Dropbox. Le contenu du fichier, sera "Hello World" ; comme convenu, nous devons convertir ce message "Hello World" en octets via votre propre code ou tout convertisseur en ligne.

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

Note : Pour plus d'informations sur les tables et les procédures de stockage offertes par le connecteur Dropbox, veuillez vous référer à la page "Référence du connecteur de la boîte de dépôtLe document ".

La figure 8 et la figure 9 ci-dessous montrent l'exécution et le résultat de la procédure stockée ci-dessus.

Dropbox et Exchange

Figure 8 : Téléchargement d'un fichier vers le Dropbox

Image

Figure 9 : Fichier téléchargé

3.3 Copie de la connexion et des déclarations

Nous savons maintenant que nous pouvons télécharger des pièces jointes à partir de Exchange et nous savons également que nous pouvons télécharger des documents dans la Dropbox. Nous avons également testé nos instructions SQL. Il nous faut maintenant copier la chaîne de connexion de Query Analyzer et nos instructions testées dans notre application C#.

Pour copier la connexion à partir de l'analyseur de requêtes, il suffit de cliquer avec le bouton droit de la souris sur la connexion, de cliquer sur Modifier et d'aller dans l'onglet Avancé et de copier le texte à partir de là comme indiqué ci-dessous dans la figure 10.

Figure 10 : Copie de la chaîne de connexion de l'analyseur de requêtes

Dropbox et Exchange

Voici mes chaînes de connexion pour les deux systèmes cibles.

Exchange

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

Boîte de dépôt

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

Nous sommes maintenant prêts à ouvrir visual studio.net et à commencer à mettre en œuvre notre solution d'intégration C#.

4. Présentation de la solution

4.1 Créer une nouvelle demande C#

Il suffit de créer une simple application de console. Notre solution ne nécessite aucune référence externe ni aucun déploiement de package tiers. La solution est basée sur ODBC ; il nous suffit donc d'importer les espaces de noms requis dans notre classe.

en utilisant System.Data ;
en utilisant System.Data.Odbc ;

4.2 Créer et ouvrir une connexion à Exchange

1. Précisez la chaîne de connexion

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

2. Créez et ouvrez la connexion :

en utilisant (connexion OdbcConnection = nouvelle OdbcConnection(connectionString))
{
    connection.Open() ;
    …………………………
}

4.3 Télécharger les pièces jointes à partir de Exchange

1. Téléchargez les ID des e-mails Exchange avec des pièces jointes à une table de données "messageIDs". Nous allons utiliser un DataAdapter "messagesAdapter" pour nous connecter et télécharger les ID.

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

2. Pour chaque ID de courriel dans le tableau "messageIDs", nous obtiendrons une liste de pièces jointes "info only" et les enregistrerons dans une autre table de données "documentsListTable". Nous allons utiliser un autre DataAdapter "documentsListAdapter" pour obtenir cette liste de pièces jointes.

foreach (DataRow messageIDRow dans messageIDs.Rows)
{
     string sqlQueryString = string.Format("EXEC SP_SELECT_ATTACHMENTS '{0}' ;",
                             messageIDRow["ID"]) ;
     en utilisant (OdbcDataAdapter documentsListAdapter = nouveau OdbcDataAdapter
                                                  (sqlQueryString, connexion))
            documentsListAdapter.Fill(documentsListTableau) ;
}

3. Pour chaque pièce jointe dans la "documentsListTable", nous obtiendrons l'adresse et l'utiliserons pour obtenir la pièce jointe proprement dite, puis nous ajouterons cette pièce jointe à une troisième table "documentsTable". Nous allons utiliser un autre DataAdapter "documentsAdapter" pour obtenir les pièces jointes/documents.

foreach (DataRow documentInfoRow dans documentsListTable.Rows)
{
    string sqlQueryString = string.Format("EXEC SP_SAVE_ATTACHMENT '{0}' ;",
                            documentInfoRow [adresse]) ;
    en utilisant (documentsAdapter = nouveau OdbcDataAdapter(sqlQueryString, connexion))
          documentsAdapter.Fill(documentsTableau) ;
}

4. Pour chaque pièce jointe téléchargée avec succès depuis l'échange, affichez un message à l'utilisateur en utilisant le nom du fichier de la pièce jointe.

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

4.4 Fermer la connexion à Exchange

si (connection.State == ConnectionState.Open)
        connexion.fermer() ;

4.5 Créer et ouvrir une connexion à Dropbox

1. Précisez la chaîne de connexion

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

2. Créez et ouvrez la connexion :

en utilisant (connexion OdbcConnection = nouvelle OdbcConnection(connectionString))
{
    connection.Open() ;
    …………………………
}

4.6 Téléchargement des pièces jointes dans la boîte de dépôt

Pour chaque fichier joint dans le "documentsTableau", nous obtiendrons le nom du fichier "OutFileName" et le contenu du dossier "OutBuffer" et enregistrez le fichier à la racine du dossier "/" de la boîte de dépôt.

Nous n'avons pas besoin d'un nouveau DataAdapter, nous avons juste besoin d'une OdbcCommand basée sur "SP_UPLOADFILE"Nous devons y ajouter les paramètres requis, afin de pouvoir transmettre les valeurs requises à la procédure stockée.

foreach (DataRow documentRow dans 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) ? "Uploaded !" :
                          "Not Uploaded !";
       Console.WriteLine("{0} : {1}", documentRow["OutFileName"],
                                      fileUploadStatus) ;
     }
}

4.7 Fermer la connexion au Dropbox

si (connection.State == ConnectionState.Open)
        connexion.fermer() ;

5. Mise en œuvre de la solution

Dropbox et Exchange

Figure 11 : Mise en œuvre de la solution

Dropbox et Exchange

Figure 12 : Contenu de la boîte de dépôt après l'exécution de la solution

6. Notes sur la solution

Nous avons essayé de garder la logique de l'application aussi simple que possible, cependant la logique pourrait être améliorée en sauvegardant les pièces jointes de chaque e-mail d'échange dans un dossier séparé, où le nom du dossier pourrait faire partie de l'ID du message ou de tout autre identifiant unique.

Par souci de simplicité, nous avons ignoré de nombreuses normes de codage essentielles, notamment mais pas exclusivement :

1. Avoir des chaînes de connexion dans un fichier de configuration
2. Hachage et cryptage des mots de passe à l'aide d'un code de hachage et d'un sel
3. Mettre en œuvre des modèles de conception comme le principe de responsabilité unique ou, mieux encore, le principe d'inversion des dépendances

7. Code source complet

en utilisant System ;
Utilisation de System.Data ;
en utilisant System.Data.Odbc ;

espace de noms MySolution
{
    classe Programme
    {
        static void Main(string[] args)
        {
            //fournir la connexion
            string connectionString = string.Empty ;
            string sqlQueryString = string.Empty ;
            Connexion OdbcConnection connection ;
            OdbcCommand command ;
            DataTable documentsTable = new DataTable() ;
            OdbcDataAdapter messagesAdapter, documentsListAdapter, documentsAdapter ;
            DataTable messageIDs = new DataTable() ;
            DataTable documentsListTable = new DataTable() ;

            //création d'une connexion à 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))
            {
                //ouverture de la connexion
                connexion.Open() ;

                //chargement des identifiants des messages avec pièces jointes
                using (messagesAdapter = new OdbcDataAdapter("SELECT ID FROM Message where HasAttachment = true ;", connection))
                {
                    //remplir la table messageIDs avec des messages
                    messagesAdapter.Fill(messageIDs) ;
                }

                //pour chaque message utilisant l'identifiant du message, obtenir la liste des pièces jointes
                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) ;
                }

                //obtient chaque pièce jointe et la sauvegarde dans 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) ;
                }

                //donner un retour à l'utilisateur que ces fichiers ont été téléchargés
                foreach (DataRow documentRow in documentsTable.Rows)
                    Console.WriteLine(string.Format("{0} téléchargés !", documentRow["OutFileName"])) ;

                //fermez la connexion à Exchange
                si (connection.State == ConnectionState.Open)
                    connection.Close() ;
            }

            //création d'une connexion à 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))
            {
                //ouverture de la connexion
                connexion.Open() ;

                //le statut de téléchargement du document est un espace réservé
                string fileUploadStatus = string.Empty ;

                //pour chaque document que nous avons dans notre documentsTable
                foreach (DataRow documentRow in documentsTable.Rows)
                {
                    //appelle une procédure stockée pour télécharger le fichier
                    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"]) ;

                        //vérifier le statut et afficher à l'écran
                        fileUploadStatus = (command.ExecuteNonQuery() > 0) ? "Uploaded !" : "Not Uploaded !";
                        Console.WriteLine("{0} : {1}", documentRow["OutFileName"], fileUploadStatus) ;
                    }
                }

                //fermez la connexion à Dropbox
                si (connection.State == ConnectionState.Open)
                    connection.Close() ;
            }

            //donner un feedback à l'utilisateur
            Console.WriteLine("tout est fait...") ;
            Console.ReadKey() ;
        }
    }
}

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

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