1.序章
1.1 はじめに
Dropbox、Exchange、その他多くのシステム間の統合ソリューションを開発したいC#の開発者のために、短いブログを書くことにしました。このような統合がどのように簡単に実現できるかをデモするためのサンプルアプリケーションを作成しました。 Connect Bridge プラットフォームを使用しています。
1.2 前提条件
記事をスキャンすることで、Connect Bridgeプラットフォームのコンセプトを理解することができます。さらに、ご自身で遊んでみたい場合に備えて、ご要望に応じてソフトウェアの無料トライアルライセンスもご用意しています。
2.シナリオ要件
ここで求められる統合シナリオは Exchangeメールの添付ファイルからDropboxフォルダにバックアップを作成します。 バックアップがあると便利かもしれませんし、交換の使用量を最小限に抑えるためにも、他の理由でも使えます。
3.基本的なワークフロー
どのような統合ソリューションを導入する必要があるかに関わらず、基本的には簡単に実行できる3つのステップがあります。これらのステップについては、次に説明します。
3.1 CB クエリアナライザの設定
最初のステップは、ターゲット・システム(今回のシナリオではExchangeとDropbox)に接続できることを確認することです。これを行う最も簡単な方法は、CB Query Analyzerを使用する方法です。ここでは、管理ツールからConnectBridgeサーバーを設定し、必要なグループとユーザーを作成して、MS Exchange 365とDropboxに接続するようにしました。私は、""というユーザー名を作成しました。マーティン" パスワード付き "1234”.このユーザーはExchange365とDropboxへの接続権限を持っています。これでQuery Analyzerから各ターゲットシステムに2つの接続を作成し、正常に接続できることを確認します。
図1:アカウント管理
図2:グループとユーザーの管理
図 3.クエリアナライザの接続
3.2 あなたの発言をテストする
上記のように、両方のターゲットシステムへの設定と接続が成功しました。これで、ステートメントをテストすることができます。
3.2.1.Exchangeからの添付ファイルのダウンロード
私の交換アカウントでは、以下のように添付ファイルがあるメールは3通だけです。
図 4: Exchange の電子メール
Exchangeから添付ファイルをダウンロードするには、3つのステップを実行する必要があります。
1.添付ファイル付きのメールIDのリストを取得します。
上の図4に示すように、添付ファイルを持つメールが3つしかないので、以下のステートメントを実行すると3つのIDが得られます。テストのために、私は2つの添付ファイルを持つ電子メールのIDを取るつもりです。
SELECT ID FROM Message WHERE HasAttachment = true.
以下の図5は、上記の文を実行した場合の出力を示す図である。
2.各メールから添付ファイルのリストを取得します。
以下のステートメントを実行すると、上の図4に示すように、readme.txtとlogo.jpgの2つの行が表示されます。各添付ファイルにはアドレスと呼ばれるフィールドがあり、これは次のステップで添付ファイルをダウンロードするために使用されます。
EXEC SP_SELECT_ATTACHMENTS 'AAMkADljZGY4ZjYzLWY2MDUtN............'。
以下の図6は、上記の文を実行した場合の出力を示す図である。
3.添付ファイルを取得します。
さて、私は前のステップで取得したそのアドレスを使用して、ロゴ.jpgの添付ファイルをダウンロードします。
EXEC SP_SAVE_ATTACHMENT 'AAMkADljZGY4ZjYzLWY2MDUtNDBjOC0.......'。
以下の図7は、上記の文を実行した場合の出力を示す図である。
Exchangeコネクタが提供するテーブルと2つのストアドプロシージャを使用していますが、コネクタが提供するテーブルとストアドプロシージャの詳細については、「Exchangeコネクタのテーブルとストアドプロシージャ」を参照してください。Exchange コネクタリファレンス" ドキュメント。
図5:添付ファイル付きのメールIDのリストの取得
図 6: 電子メールからの添付ファイルのリストの取得
図 7: 添付ファイルの取得
3.2.2 Dropboxにファイルをアップロードする
これは一通りの手順です。Dropboxにファイルをアップロードするには、ファイルをアップロードするためにDropbox上で必要なAPIを呼び出すストアド プロシージャ「SP_UPLOADFILE」を実行します。簡単のために、ここではテキストファイルをアップロードします。
SP_UPLOADFILEです。
EXEC SP_UPLOADFILE '@path', '@filename', '@content'.
上記のストアドプロシージャは、ファイルの内容をバイト単位で期待しています。
というテキストファイルをアップロードしたいと思います。ファースト・テキスト"をDropboxのルートディレクトリにコピーします。ファイルの内容は、"Hello World "となります。同意した通り、"Hello World "というメッセージを、あなた自身のコードまたは任意のオンラインコンバータを介してバイトに変換する必要があります。
EXEC SP_UPLOADFILE '/', 'first.txt', 'SGVsbG8gV29ybGQ='.
注: Dropbox コネクタが提供するテーブルとストアド プロシージャの詳細については、"Dropbox コネクタのリファレンス" ドキュメント。
以下、図8および図9を参照して、上記ストアドプロシージャの実行および出力について説明する。
図8:Dropboxへのファイルのアップロード
図9:アップロードされたファイル
3.3 コピー接続とステートメント
これで、Exchangeから添付ファイルをダウンロードできることがわかりましたし、Dropboxに文書をアップロードできることもわかりました。また、SQL文のテストも行いました。ここで必要なのは、Query Analyzerからの接続文字列とテスト済みのステートメントをC#アプリケーションにコピーすることです。
クエリ・アナライザーから接続をコピーするには、接続を右クリックし、[編集]をクリックして[詳細]タブに移動し、図10に示すように、そこからテキストをコピーする必要があります。
図 10: Query Analyzer からの接続文字列のコピー
以下は両方のターゲットシステムの接続文字列です。
Exchange
Driver={Media Gateway ODBC Driver};impl='CORBA';host='localhost';port='8087';acc='ACC_EXCH365_CU7';uid='martin';pwd='1234'
ドロップボックス
Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_DRBX_CBD';UID='martin';PWD='1234'
これでVisual Studio.netを開き、C#統合ソリューションの実装を開始する準備が整いました。
4.ソリューション・ウォークスルー
4.1 新しいC#アプリケーションの作成
シンプルなコンソールアプリケーションを作成するだけで十分です。私たちのソリューションは、外部参照やサードパーティのパッケージ展開を必要としません。このソリューションは ODBC をベースにしているので、必要な名前空間をクラスにインポートするだけです。
System.Data.Odbcを使用しています。 System.Data.Odbcを使用しています。
4.2 Exchangeへの接続の作成とオープン
1.接続文字列を指定します。
string connectionString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_EXCH365_CU7';UID='martin';PWD='1234'" "。
2.接続を作成し、開く。
using (OdbcConnection connection = new OdbcConnection(connectionString)) { connection.Open()。 ………………………… }
4.3 Exchangeからの添付ファイルのダウンロード
1.DataTable「messageIDs」に添付ファイル付きのExchangeメールのIDをダウンロードします。
using (OdbcDataAdapter messagesAdapter = new OdbcDataAdapter("SELECT ID FROM Message where HasAttachment = true;", connection)) { messagesAdapter.Fill(messageIDs)。 }
2.messageIDs」テーブルの各メールIDについて、添付ファイルのリスト「info only」を取得し、別のDataTable「documentsListTable」に保存します。この添付ファイルのリストを取得するために、別のDataAdapter「documentsListAdapter」を使用します。
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.documentsListTable」の各添付ファイルについて、アドレスを取得してそれを使って実際の添付ファイルを取得し、その添付ファイルを3つ目のテーブル「documentsTable」に追加します。添付ファイル/ドキュメントを取得するために、別のDataAdapter「documentsAdapter」を使用します。
foreach (DataRow documentInfoRow in documentsListTable.Rows) { string sqlQueryString = string.Format("EXEC SP_SAVE_ATTACHMENT '{0}';". documentInfoRow["住所"])を使用しています。) using (documentsAdapter = new OdbcDataAdapter(sqlQueryString, connection)) documentsAdapter.Fill(documentsTable). }
4.4. exchange からの添付ファイルのダウンロードに成功するごとに、添付ファイル名を使用してユーザーにメッセージを表示します。
foreach (DataRow documentRow in documentsTable.Rows) Console.WriteLine(string.Format("{0} downloaded! documentRow["OutFileName"]))。
4.4 Exchange との接続を閉じる
if (connection.State == ConnectionState.Open) connection.Close()。
4.5 Dropboxへの接続を作成し開く
1.接続文字列を指定します。
string connectionString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_DRBX_CBD';UID='martin';PWD='1234'" "。
2.接続を作成し、開く。
using (OdbcConnection connection = new OdbcConnection(connectionString)) { connection.Open()。 ………………………… }
4.6 Dropboxに添付ファイルをアップロードする
の各添付ファイルに対して文書表"というファイル名を取得します。アウトファイル名"とファイルの内容 "アウトバッファ"と入力し、Dropboxのフォルダ「/」のルートに保存します。
新しい DataAdapter は必要ありません。SP_UPLOADFILE先ほど説明した " ストアドプロシージャに必要なパラメータを追加する必要があるので、必要な値をストアドプロシージャに渡すことができます。
foreach (DataRow documentRow in documentsTable.Rows) { using (OdbcCommand command = new OdbcCommand("Exec SP_UploadFile ?, ?, ?", connection)) { command.CommandType = CommandType.StoredProcedure.CommandType(コマンドタイプ) command.Parameters.AddWithValue("@path", "/"); command.Parameters.AddWithValue("@filename", documentRow["OutFileName"]); command.Parameters.AddWithValue("@filename", documentRow["OutFileName"]); command.Parameters.AddWithValue("@content", documentRow["OutBuffer"]); command.Parameters.AddWithValue("@content", documentRow["OutBuffer"]); fileUploadStatus = (command.ExecuteNonQuery() > 0) ?"アップロードされました!": "Not Uploaded! Console.WriteLine("{0} : {1}", documentRow["OutFileName"], fileUploadStatus); } }
4.7 Dropboxへの接続を閉じる
if (connection.State == ConnectionState.Open) connection.Close()。
5.ソリューションの実行
図 11: ソリューションの実行
図12:ソリューション実行後のDropboxの内容
6.解答の注意点
アプリケーションのロジックをできるだけシンプルに保つようにしましたが、各交換メールからの添付ファイルを別のフォルダに保存し、フォルダ名をメッセージIDや他のユニークな識別子の一部にすることで、ロジックを改善することができました。
シンプルにするために、以下を含むがこれに限定されない多くの本質的なコーディング標準を無視しました。
1.設定ファイルに接続文字列を持つ
2.ハッシュコードとソルトを使ったパスワードのハッシュ化と暗号化
3.単一の責任の原則またはよりよい依存性の逆転の原則のような設計パターンの実装
7.完全なソースコード
using System.Data using System.Data.Odbc; using System.Data.Odbc using System.Data.Odbc; 名前空間 MySolution { クラス Program { 静的 void Main(string[] args) { //接続を提供する string connectionString = string.Empty; 文字列 sqlQueryString = string.Empty; OdbcConnection 接続。 OdbcCommandコマンド。 DataTable documentsTable = new DataTable(); OdbcDataAdapter messagesAdapter, documentsListAdapter, documentsAdapter.DataTable messageIDs = new DataTable(); OdbcDataAdapter messagesAdapter, documentsListAdapter; DataTable messageIDs = new DataTable(); DataTable documentsListTable = new DataTable(); //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)) { //接続を開く connection.Open()を実行します。 //添付ファイル付きメッセージのメッセージIDを読み込む using (messagesAdapter = new OdbcDataAdapter("SELECT ID FROM Message where HasAttachment = true;", connection)). { // messageIDs テーブルをメッセージで埋めます messageAdapter.Fill(messageIDs); } //メッセージ ID を使って各メッセージの添付ファイルのリストを取得します. 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).Fill(documentsListTable)を実行します。 //各添付ファイルを取得し、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)。 //それらのファイルがダウンロードされたことをユーザにフィードバックする foreach (DataRow documentRow in documentsTable.Rows) Console.WriteLine(string.Format("{0} downloaded!", documentRow["OutFileName"])); //Exchangeとの接続を終了 if (connection.State == ConnectionState.Open) connection.Close()を実行します。 } //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)) { //接続を開く connection.Open()を実行します。 //ドキュメントアップロード状況プレースホルダ string fileUploadStatus = string.Empty; //documentsTableに格納されている各文書について foreach (DataRow documentRow in documentsTable.Rows) { //ストアドプロシージャを呼び出し、ファイルをアップロードします。 using (command = new OdbcCommand("Exec SP_UploadFile ?, ?, ?", connection)) { command.CommandType = CommandType.StoredProcedure.CommandType(コマンドタイプ) command.Parameters.AddWithValue("@path", "/"); command.Parameters.AddWithValue("@filename", documentRow["OutFileName"]); command.Parameters.AddWithValue("@filename", documentRow["OutFileName"]); command.Parameters.AddWithValue("@content", documentRow["OutBuffer"]); command.Parameters.AddWithValue("@content", documentRow["OutBuffer"]); //ステータスを確認し、画面に表示する fileUploadStatus = (command.ExecuteNonQuery() > 0) ?"アップロードされました!": "アップロードされていません!"; Console.WriteLine("{0} : {1}", documentRow["OutFileName"], fileUploadStatus); } } //Dropbox への接続を閉じる if (connection.State == ConnectionState.Open) connection.Close() を実行します。 //ユーザーへのフィードバックを行う Console.WriteLine("すべて完了しました..."); Console.ReadKey()を実行します。 } } }