"PythonスクリプトをExchangeサーバーに接続する必要がありますか?Connect Bridgeと呼ばれるツールを使った簡単な方法を紹介します。"
序章
この記事では、PythonをExchangeに接続させる方法、つまり、MicrosoftのExchangeサーバ(Exchange 2010, 2013, 2016, 2019, Online)からPython言語スクリプトを使ってメールを読み取る方法を説明します。
データの転送はODBCレイヤーを介して行われるので、スクリプト側から見れば、Microsoft SQL ServerやODBC経由でデータベースにアクセスするためにPythonを使用しているのと全く同じです。単に パイodbcモジュール (Pythonバージョン3.7とpyodbcバージョン4.0.26を使用しました)。実際のAPI統合はConnect Bridgeというツールで行い、Pythonスクリプト上ではデータベースを読むようにデータを読み込んでいます。
Connect Bridgeは市販品ですのでご注意ください。あなたは、以下のことができます。 無料体験を受ける のために、この方法を無料で試してみることができます。
この「Connect Bridge」って何?
Connect Bridge は、Connecting Softwareが開発した統合プラットフォームです。ODBCドライバ、JDBCドライバ、Webサービスを通じて、あなたのスクリプトがあらゆるソフトウェアに接続できるようになります。
この記事では、Connect Bridgeを使ってMicrosoft Exchangeに接続していますが、Microsoft SharePointやSalesforceやDynamicsなどのCRMからデータを取得することも可能です。また、データの転送は、実は双方向に行うことができます。つまり、今回はデータを読み取ることに焦点を当てますが、これらのシステムにデータを入れることも可能です。
何から始めればいいの?
私たちの目標は、Exchangeサーバにアクセスしてそこから電子メールを読み取るシンプルなPythonスクリプトを作成することです。ここでは、Exchangeのインスタンスが既に存在すると仮定しています。以下の手順は簡単です。
1. Exchangeのログイン認証情報が手元にあることを確認してください。
2. Connect Bridgeの無料トライアルとインストールを依頼する
3. Windows版Pythonをインストールします。3.7+.スクリプトの記述にはお好みのエディタを使用します。
4. pyodbcモジュール4.0.26+をインストールします。
5. Connect Bridge Management Studio を実行します。
5.1. Exchange のアカウントを追加します(Accounts - Add account)。アカウントの追加には、コネクタMGEXPlugin2010を選択し、ポイント1で述べた認証情報を使用する必要があります。
5.2. New Query オプションを開き、Connection Browser を開きます。Exchange コネクタを見つけ、DefaultConnection が表示されるまで展開します。DefaultConnection を右クリックし、Get Connection string を選択します。ODBC 接続文字列をスクリプトに渡すために必要なので、コピーします。
5.3. Exchangeで必要なものにアクセスするクエリをテストするには、新しいクエリオプションを使用します。
ここではクエリの例を紹介しますが、ここではExchangeで探しているものを入力してください。New Query」をクリックした後、左側の「Connection Browser」を開きます。Exchange コネクタ(MGEXPlugin2010)を見つけ、「Tables」オプションが表示されるまで開きます。スキーマに「Message」という「テーブル」が含まれていることがわかるので、SELECT * FROM Message WHERE CreationDate >= '2019-01-01 00:00:00' LIMIT 10; というクエリを作成して、Exchangeのメールメッセージリストから、2019年1月1日以降に作成された10件のエントリを選択します。繰り返しになりますが、あたかもデータベースを直接使用しているように見えますが、そうではないことに注意してください。Connect BridgeがAPIにアクセスして、あたかもデータベースであるかのように提示しているのです。クエリを作成したら、それをコピーして、スクリプトに渡す必要があります。
ハンズオンスクリプト!
私たちのソリューションには1つのファイルしかありません。CBExchange.pyです。完全なソースコードは以下の通りです。70~92行目に注目してください。このスクリプトがどのように動作するかの完全な説明は以下の通りです。
#!/usr/local/bin/python3.7 # encoding: utf-8 ''' CBExchange -- query data from, write data to Exchange CBExchange is a script that allows to read Exchange mail using SQL queries via Connect Bridge's ODBC driver @author: Ana Neto @copyright: 2019 @contact: ana@connecting-software.com @deffield updated: 22.07.2019 ''' import sys import os import pyodbc from argparse import ArgumentParser from argparse import RawDescriptionHelpFormatter __all__ = [] __version__ = 0.2 __date__ = '2019-07-22' __updated__ = '2019-07-22' DEBUG = 1 TESTRUN = 0 PROFILE = 0 class CLIError(Exception): '''Generic exception to raise and log different fatal errors.''' def __init__(self, msg): super(CLIError).__init__(type(self)) self.msg = "E: %s" % msg def __str__(self): return self.msg def __unicode__(self): return self.msg def main(argv=None): # IGNORE:C0111 '''Command line options.''' if argv is None: argv = sys.argv else: sys.argv.extend(argv) program_name = os.path.basename(sys.argv[0]) program_version = "v%s" % __version__ program_build_date = str(__updated__) program_version_message = '%%(prog)s %s (%s)' % (program_version, program_build_date) program_shortdesc = __import__('__main__').__doc__.split("n")[1] program_license = '''%s Created by Ana Neto on %s. Licensed under the Apache License 2.0 http://www.apache.org/licenses/LICENSE-2.0 Distributed on an "AS IS" basis without warranties or conditions of any kind, either express or implied. USAGE ''' % (program_shortdesc, str(__date__)) try: # Setup argument parser parser = ArgumentParser(description=program_license, formatter_class=RawDescriptionHelpFormatter) parser.add_argument('connstr') parser.add_argument('query') # Process arguments args = parser.parse_args() query = args.query connstr = args.connstr conn = pyodbc.connect(connstr) cursor = conn.cursor() cursor.execute(query) while 1: row = None try: row = cursor.fetchone() except: print(sys.exc_info()[1]) break if not row: break print(row) except KeyboardInterrupt: ### handle keyboard interrupt ### return 0 except: print(sys.exc_info()[1]) #indent = len(program_name) * " " #sys.stderr.write(program_name + ": " + repr(e) + "n") #sys.stderr.write(indent + " for help use --help") return 2 if __name__ == "__main__": if TESTRUN: import doctest doctest.testmod() if PROFILE: import cProfile import pstats profile_filename = 'CBExchange_profile.txt' cProfile.run('main()', profile_filename) statsfile = open("profile_stats.txt", "wb") p = pstats.Stats(profile_filename, stream=statsfile) stats = p.strip_dirs().sort_stats('cumulative') stats.print_stats() statsfile.close() sys.exit(0) sys.exit(main())
ここでは、私たちが使用している変数について少しご紹介します。
- パーサはコマンドラインから取得した引数を解析するために使用されます。
- argsはそれらの引数を保持します。
- は実行したいクエリを保持しており、引数として入ってきます。
- connstrは引数として入ってくるODBC接続文字列を保持し、ODBC接続を作成するためにpyodbcモジュールに渡します。
- conn は ODBC 接続です。
そして、スクリプトの動作は以下の通りです。
- 70行目から78行目では、コマンドラインの引数入力から変数connstrとqueryを取得することを目的としています。
- 80行目では、connを使用してデータベースカーソルを開きます。
- 82行目では、コマンドラインから取得したSQLクエリを実行します。
- 83行目から92行目までは、結果をループしてカーソルの行から1行ずつ読み込んでいます。
-cursor.fetchoneがNoneを返すときは、ループを解除します。
- ODBC フェッチ中に例外が発生した場合は、ループを解除して問題を出力します。
- fetchoneメソッドが成功してデータ行を返した場合、生のデータ行をそのまま出力に出力します。これはデモ目的ではこれで十分ですが、実際の状況では当然ながら xml、json、csv... やその他のデータ交換フォーマットとしてフォーマットすることができます。あるいは、単に生データの行オブジェクトを使用して、後続のコードでカスタムタスクを実行することもできます。
CBExchange.pyスクリプトを実行するには?
CBExchange.pyスクリプトは2つの位置コマンドライン引数、connstrとqueryを受け付けます。
上記で説明したように、Connect Bridge Management Studioからこれらをコピーする必要があります(ポイント5.2)。手元にコピーしたものがあれば、コマンドラインを開き、スクリプトを保存したフォルダに cd し、次のようにします。 Python スクリプトを実行します。 に2つのパラメータを渡します。
他に何ができる?さらなる探求を...
前述したように、より洗練されたクエリを構築して、必要なメールを取得できるようにすることができます。例えば、添付ファイルと特定の作成日を指定したメールのみを取得したい場合、クエリは次のようになります。
SELECT * FROM メッセージ
WHERE [HasAttachment] = true and [CreationDate] >= '2019-07-01 00:00:00';
また、「ストアド・プロシージャ」を利用することもできます。Exchange コネクタ(MGEXPlugin2010)を見つけて、「ストアド・プロシージャ」が表示されるまで展開してください。繰り返しになりますが、これらのストアド・プロシージャは、Connect BridgeのAPI統合であり、実際のデータベースのストアド・プロシージャではありません。しかし、その扱い方は、ストアドプロシージャがある場合と同じです。
このスクリーンショットでは、利用可能なストアド プロシージャのいくつかが表示されています。
制約
Connect Bridgeツールは、ODBC Linuxクライアントライブラリが利用できないため、Windowsオペレーティングシステムでのみ利用可能です。そのため、これを動作させるにはWindowsマシンが必要です。
結論
Connect Bridge 統合プラットフォームを使用して、Python で Exchange データにアクセスする方法を見てきました。この記事で見たことが、Microsoft Dynamics CRM と Microsoft Exchange でも可能であることを想像してみてください。Connect Bridgeを使えば、このようなことが可能で、その方法も似ています...必要なソフトウェアのコネクタを選択して、それに従うだけです。
Connect Bridgeで現在販売されているコネクタをお探しの方は、以下のサイトをご覧ください。 https://www.connecting-software.com/connectors/
このビッグセットの中で、どれが最新のコネクタなのか気になる方は、Connect Bridgesの Dynamics 365 ファイナンス&オペレーション そして Dynamics 365 ビジネスセントラル コネクタは、ODataプロトコルに基づいて構築されています。 また、OPC UAコネクタもご覧いただけます。そうですね、まったく別の用途のように思われるかもしれませんが....しかし、実際には、同じツールを使ってOPC UAサーバーにアクセスすることができます。この種の統合がどのような結果をもたらすかについては、Connect Bridgeの例をご覧ください。 IIoTショーケース.
この記事が皆様のお役に立てれば幸いです。
この他にも、私たちのブログでは、他の統合の可能性について説明しています。