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を使用することです。ここでは、必要なグループとユーザーを作成することで、MS Exchange 365とDropboxに接続できるように、管理ツールでConnectBridgeサーバーを設定しました。ユーザー名は“マーティン”「パスワード “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 Connectorが提供するテーブルと2つのストアドプロシージャを使用しました。“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#アプリケーションの作成
シンプルなコンソール・アプリケーションを作成するのに十分です。このソリューションでは、外部参照やサード・パーティ・パッケージの導入は必要ありません。したがって、必要な名前空間をクラスにインポートするだけです。.
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をダウンロードする。DataAdapter “messagesAdapter ”を使って接続し、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 ?, ?
コネクション)
{
command.CommandType = CommandType.StoredProcedure.
command.Parameters.AddWithValue("@path", "/").
command.Parameters.AddWithValue("@filename", documentRow["OutFileName"]).
command.Parameters.AddWithValue("@content", documentRow["OutBuffer"]).
fileUploadStatus = (command.ExecuteNonQuery() > 0) ?"アップロードされました!":
"アップロードされていません!"
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.完全なソースコード
システムを使用しています。
System.Data.Odbcを使用しています。
System.Data.Odbcを使用しています。
名前空間 MySolution
{
クラスプログラム
{
static void Main(string[] args)
{
//接続を提供します。
文字列 connectionString = string.Empty.
string sqlQueryString = string.Empty。
OdbcConnection connection.
OdbcCommand コマンド。
DataTable documentsTable = new DataTable().
OdbcDataAdapter messagesAdapter、documentsListAdapter、documentsAdapter。
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テーブルにメッセージを埋めます。
messagesAdapter.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)を使用しています。
}
//各添付ファイルを取得して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)
接続が完了した時点で、接続が完了します。
}
//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.
command.Parameters.AddWithValue("@path", "/").
command.Parameters.AddWithValue("@filename", documentRow["OutFileName"]).
command.Parameters.AddWithValue("@content", documentRow["OutBuffer"]).
//ステータスをチェックして画面に表示する
fileUploadStatus = (command.ExecuteNonQuery() > 0) ?"アップロードされました!": "アップロードされていません!"
Console.WriteLine("{0} : {1}", documentRow["OutFileName"], fileUploadStatus).
}
}
//Dropboxへの接続を閉じる
if (connection.State == ConnectionState.Open)
接続が完了した時点で、接続が完了します。
}
//ユーザーにフィードバックを与える
Console.WriteLine("all done....")。
Console.ReadKey().
}
}
}
