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 est de s'assurer que vous pouvez vous connecter au système cible (Exchange & Dropbox dans notre scénario) ; la façon la plus simple de le faire est via CB Query Analyzer. Ici, j'ai déjà configuré mon serveur ConnectBridge via l'outil d'administration pour se connecter à MS Exchange 365 et à ma Dropbox en créant les groupes et les utilisateurs nécessaires. J'ai créé un nom d'utilisateur appelé “martin”avec le mot de passe “1234”. Cet utilisateur a le droit de se connecter à Exchange365 et à Dropbox. Maintenant, à partir de Query Analyzer, je vais créer 2 connexions à 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 section “Référence du connecteur Exchange” 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

Il s'agit d'une étape simple. Pour télécharger un fichier vers 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 simplifier, 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”dans le répertoire racine de Dropbox. Le contenu du fichier sera “Hello World” ; comme convenu, nous devons convertir ce message “Hello World” en octets à l'aide de votre propre code ou d'un convertisseur en ligne.

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

Note : Pour plus d'informations sur les tables et les procédures stockées offertes par le connecteur Dropbox, veuillez vous référer à la section “Référence du connecteur de la boîte de dépôt” 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 console. Notre solution ne nécessite aucune référence externe ni aucun déploiement de paquetage tiers. La solution est basée sur ODBC ; par conséquent, nous avons juste besoin 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éer et ouvrir la connexion :

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

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

1. Téléchargez les identifiants des courriels Exchange avec pièces jointes dans un tableau de données “messageIDs”. Nous allons utiliser un DataAdapter “messagesAdapter” pour nous connecter et télécharger les identifiants.

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

2. Pour chaque identifiant de courrier électronique figurant dans le tableau “messageIDs”, nous obtiendrons une liste de pièces jointes “info only” et les enregistrerons dans un autre tableau 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 figurant dans le tableau “documentsListTable”, nous obtiendrons l'adresse et l'utiliserons pour obtenir la pièce jointe proprement dite, puis nous ajouterons cette pièce jointe à un troisième tableau “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 à la boîte de dépôt

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éer et ouvrir la connexion :

using (OdbcConnection connection = new 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 fichier “documentsTableau”nous obtiendrons le nom du fichier “OutFileName”et le contenu du fichier “OutBuffer”et enregistrez le fichier à la racine du dossier Dropbox “/”.

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

foreach (DataRow documentRow in documentsTable.Rows)
{
     en utilisant (commande OdbcCommand = nouvelle OdbcCommand("Exec SP_UploadFile ?, ?, ?",
           connexion))
     {
       command.CommandType = CommandType.StoredProcedure ;
       command.Parameters.AddWithValue("@path", "/") ;
       command.Parameters.AddWithValue("@nomdufichier", documentRow["OutFileName"]) ;
       command.Parameters.AddWithValue("@contenu", documentRow["OutBuffer"]) ;
       fileUploadStatus = (command.ExecuteNonQuery() > 0) ? "Uploaded !" :
                          "Non 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 le système ;
en utilisant System.Data ;
en utilisant System.Data.Odbc ;

espace de noms MySolution
{
    Programme de la classe
    {
        static void Main(string[] args)
        {
            //fournir une connexion
            string connectionString = string.Empty ;
            string sqlQueryString = string.Empty ;
            OdbcConnexion connection ;
            Commande OdbcCommand ;
            DataTable documentsTable = new DataTable() ;
            OdbcDataAdapter messagesAdapter, documentsListAdapter, documentsAdapter ;
            DataTable messageIDs = new DataTable() ;
            DataTable documentsListTable = nouvelle 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'" ;
            en utilisant (connection = nouvelle OdbcConnection(connectionString))
            {
                //ouverture de la connexion
                connection.Open() ;

                //charger les identifiants de message pour les messages avec pièces jointes
                en utilisant (messagesAdapter = nouveau OdbcDataAdapter("SELECT ID FROM Message where HasAttachment = true ;", connection))
                {
                    //fill messageIDs table with messages
                    messagesAdapter.Fill(messageIDs) ;
                }

                // pour chaque message utilisant l'identifiant du message, obtenir la liste des pièces jointes
                foreach (DataRow messageIDRow dans messageIDs.Rows)
                {
                    sqlQueryString = string.Format("EXEC SP_SELECT_ATTACHMENTS '{0}' ;", messageIDRow["ID"]) ;
                    en utilisant (documentsListAdapter = nouveau OdbcDataAdapter(sqlQueryString, connexion))
                        documentsListAdapter.Fill(documentsListTableau) ;
                }

                // obtenir chaque pièce jointe et l'enregistrer dans les documentsTableau
                foreach (DataRow documentInfoRow dans documentsListTable.Rows)
                {
                    sqlQueryString = string.Format("EXEC SP_SAVE_ATTACHMENT '{0}' ;", documentInfoRow["Adresse"]) ;
                    utilisation (documentsAdapter = nouveau OdbcDataAdapter(sqlQueryString, connexion))
                        documentsAdapter.Fill(documentsTableau) ;
                }

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

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

            //créer une connexion avec DropBox
            connectionString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_DRBX_CBD';UID='martin';PWD='1234'" ;
            en utilisant (connection = nouvelle OdbcConnection(connectionString))
            {
                //ouverture de la connexion
                connection.Open() ;

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

                // pour chaque document que nous avons dans nos documentsTableau
                foreach (DataRow documentRow in documentsTable.Rows)
                {
                    // appeler une procédure stockée pour télécharger le fichier
                    en utilisant (commande = nouvelle OdbcCommand("Exec SP_UploadFile ?, ?, ?", connexion))
                    {
                        command.CommandType = CommandType.StoredProcedure ;
                        command.Parameters.AddWithValue("@path", "/") ;
                        command.Parameters.AddWithValue("@nomdufichier", documentRow["OutFileName"]) ;
                        command.Parameters.AddWithValue("@contenu", documentRow["OutBuffer"]) ;

                        //contrôler le statut et l'affichage à l'écran
                        fileUploadStatus = (command.ExecuteNonQuery() > 0) ? "Uploaded !" : "Non Uploaded !";
                        Console.WriteLine("{0} : {1}", documentRow["OutFileName"], fileUploadStatus) ;
                    }
                }

                // fermer la connexion à la boîte de dépôt
                si (connection.State == ConnectionState.Open)
                    connexion.fermer() ;
            }

            // donner un retour d'information à 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.