Exchangeサーバからメールを読む方法 - Connect Bridgeを使ったPythonチュートリアル

アナ・ネト 会社情報, コネクタ, 技術的なこと コメントを残す

"あなたの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サービスを介して任意のソフトウェアを接続することができます...接続しようとしているプログラムのAPIを勉強したり学んだりする必要はありません!

この記事では、Microsoft Exchangeに接続するためにConnect Bridgeを使用していますが、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のアカウントを追加します。アカウントの追加は、コネクタMGEXPlugin2010を選択し、1.の認証情報を使用します。

5.2. New Query オプションを開き、Connection Browser を開きます。Exchange コネクタを見つけ、DefaultConnection が表示されるまで展開します。DefaultConnection を右クリックし、Get Connection string を選択します。ODBC 接続文字列をスクリプトに渡すために必要なので、コピーします。

5.3. Exchangeで必要なものにアクセスするクエリをテストするには、新しいクエリオプションを使用します。

ここではクエリの例を示しますが、Exchangeで何を探しているのかを入力します。新しいクエリ] をクリックしたら、左側の [接続ブラウザ] を開きます。Exchange Connector (MGEXPlugin2010)を探し、Tablesオプションが表示されるまで開きます。スキーマに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接続文字列を保持し、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 Connector (MGEXPlugin2010)を見つけて、「ストアド プロシージャ」オプションが表示されるまで展開します。繰り返しになりますが、これらのストアドプロシージャはConnect BridgeのAPI統合であり、実際のデータベースのストアドプロシージャではありません。しかし、それらを使った作業方法は同じです。

このスクリーンショットでは、利用可能なストアド プロシージャのいくつかが表示されています。

SP_SELECT_DEFAULT_FOLDER_INBOX を参照すると、単純なストアドプロシージャ(必須パラメータはありません)が、 SP_SEND_MESSAGE を参照すると、もう少し複雑なストアドプロシージャが得られます。

制約

Connect Bridgeツールは、ODBC Linuxクライアントライブラリが利用できないため、Windowsオペレーティングシステムでのみ利用可能です。そのため、これを動作させるにはWindowsマシンが必要です。

結論

PythonでExchangeのデータにアクセスするには、Connect Bridgeの統合プラットフォームを使うと簡単にできることを見てきました。この記事で見てきたことが、Microsoft Dynamics CRM と Microsoft Exchange でも可能だと想像してみてください。はい、Connect Bridgeを使えば可能ですし、やり方も似ています。

Connect Bridgeで現在販売されているコネクタをお探しの方は、以下のサイトをご覧ください。 https://www.connecting-software.com/connect-bridge-connectors/

このビッグセットの中で、どれが最新のコネクタなのか気になる方は、Connect Bridgesの Dynamics 365 ファイナンス&オペレーション そして Dynamics 365 ビジネスセントラル コネクタ、両方とも OData プロトコル上に構築されています。 または、OPC UA コネクタをご覧ください。はい、私はそれが全く別のユースケースのように見えることを知っています...。しかし、実際には同じツールを使ってOPC UAサーバーにアクセスすることができます。このタイプの統合がどのような結果をもたらすかのアイデアを提供するために、Connect Bridgeの IIoTショーケース.

この記事がお役に立てれば幸いですここでは、他の統合の可能性について議論しているブログの記事をいくつか紹介します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です