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.
Figure 1 : Administration des comptes
Figure 2 : Administration des groupes et des utilisateurs
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
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 ".
Figure 5 : Obtenir la liste des identifiants de courrier électronique avec pièces jointes
Figure 6 : Obtenir la liste des pièces jointes à partir d'un courriel
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.
Figure 8 : Téléchargement d'un fichier vers le Dropbox
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
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
Figure 11 : Mise en œuvre de la solution
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() ; } } }