"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で探している内容を指定してください。新規クエリをクリックしたら、左側の接続ブラウザを開きます。Exchangeコネクタ(MGEXPlugin2010)を探し、テーブルオプションが表示されるまで展開します。 スキーマ内に「Message」というテーブルが存在することが確認できます。したがって、クエリを次のように構築できます:SELECT * FROM Message WHERE CreationDate >= “2019-01-01 00:00:00” LIMIT 10;これにより、2019年1月1日以降に作成されたExchangeのメールメッセージリストから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 接続文字列を保持し、これを pyodbc モジュールに渡して ODBC 接続を作成します
• conn は ODBC 接続です
そして、スクリプトの動作は以下の通りです。
• 70行目から78行目では、コマンドライン引数入力から変数connstrとqueryを取得することを目的としています。簡素化のため、pydevのargparseスクリプトテンプレートを使用しました。
• 80行目で、connを使用してデータベースカーソルを開きます
• 82行目では、コマンドラインから取得したSQLクエリを実行します
• 83行目から92行目では、結果をループ処理し、カーソルから行単位で読み込みます。.
•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 Business Central ODataプロトコルを基盤とする両方のコネクタ。あるいはOPC UAコネクタもご覧ください。ええ、まったく異なるユースケースのように思えるのは承知しています…しかし実際には、同じツールでOPC UAサーバーにアクセス可能です。この種の統合がもたらす結果の一例として、Connect Bridgeの事例をご覧ください。 IIoTショーケース.
この記事が皆様のお役に立てれば幸いです。
この他にも、私たちのブログでは、他の統合の可能性について説明しています。
著者について

記入例 アナ・ネト, テクニカルアドバイザー Connecting Softwareにて。
"私は1997年からソフトウェア・エンジニアであり、最近は書くことと人前で話すことが好きです。この記事について質問やコメントはありますか?ご意見・ご感想をお待ちしております!"



