2017-01-12 5 views
1

Outlook 2013フォルダのメッセージからデータを抽出するPythonスクリプトを作成しようとしています。 Outlookをアクセスするためにどこにでも説明 方法は、最初に実行することです:Outlookが実行されていない場合Pythonから実行中のOutlookインスタンスに接続する方法

import win32com.client 
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") 

これが正常に動作します。しかし、それがある場合、これはエラーがスローされます。どちらか同時に複数のインスタンスを実行することはできません別のアプリケーションのために報告された同様の問題に基づいて

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Program Files\Python27\lib\site-packages\win32com\client\__init__.py", line 95, in Dispatch 
    dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx) 
    File "C:\Program Files\Python27\lib\site-packages\win32com\client\dynamic.py", line 114, in _GetGoodDispatchAndUserName 
    return (_GetGoodDispatch(IDispatch, clsctx), userName) 
    File "C:\Program Files\Python27\lib\site-packages\win32com\client\dynamic.py", line 91, in _GetGoodDispatch 
    IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch) 
pywintypes.com_error: (-2146959355, 'Server execution failed', None, None) 

、私は彼らのソリューションを適応しようとした:

try: 
    app = win32com.client.Dispatch('Outlook.Application') 
except: 
    app = win32com.client.GetActiveObject('Outlook.Application') 

しかし、これはうまくいきません。 GetActiveObjectは今のエラーで失敗します。

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Program Files\Python27\lib\site-packages\win32com\client\__init__.py", line 79, in GetActiveObject 
    dispatch = pythoncom.GetActiveObject(resultCLSID) 
pywintypes.com_error: (-2147221021, 'Operation unavailable', None, None) 

だから何がOutlookの実行中のインスタンスに接続するための正しい方法でしょうか?自分の質問に答える

答えて

1

根本的な原因は、私が管理者として実行するコマンドウィンドウでのPythonを実行していたということでした。
通常のユーザーとしてcmd.exeを起動すると、エラーは発生しません。
この場合、GetActiveObject()はより意味のあるエラーメッセージを返します。

サイドノート:二つの選択肢を逆にすると、より高速に動作します:

try: 
    outlook = win32com.client.GetActiveObject('Outlook.Application') 
except: 
    outlook = win32com.client.Dispatch('Outlook.Application') 
0

Outlookはシングルトンですので、あなたが何で、それは常に実行中のインスタンスに接続しないでしょう。あなたが発見した唯一の問題は、既に別のセキュリティコンテキストで実行されている場合、COMシステムは2つのプロセス間でCOMオブジェクトをマーシャリングすることを拒否することです。

関連する問題