2017-01-12 4 views
1

Ich versuche ein Python-Skript zu schreiben, um Daten aus Nachrichten in Outlook 2013-Ordnern zu extrahieren. Verfahren überall beschrieben Outlook zuzugreifen, ist zum ersten Lauf:So stellen Sie eine Verbindung zu einer laufenden Instanz von Outlook aus Python her

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

Dies funktioniert gut, wenn Outlook nicht ausgeführt wird. Aber wenn es ist, wirft dies auf einen Fehler:

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) 

Basierend auf einem ähnlichen Problem für eine andere Anwendung gemeldet, die nicht unterstützt mehrere Instanzen gleichzeitig laufen entweder habe ich versucht, die Anpassung ihrer Lösung:

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

Aber das funktioniert auch nicht. GetActiveObject schlägt nun fehl mit Fehlern:

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) 

Also, was wäre der richtige Weg zu einer laufenden Instanz von Outlook zu verbinden?

Antwort

1

meine eigene Frage zu beantworten:

Die Ursache war, dass ich Python lief in einem Befehlsfenster als Administrator ausgeführt wird.
Wenn ich cmd.exe als normaler Benutzer starte, funktionieren die Dinge ohne Fehler.
Ich wünschte, GetActiveObject() würde in diesem Fall eine aussagekräftigere Fehlermeldung zurückgeben!

Randbemerkung: Vertauschen der beiden Alternativen arbeitet schneller:

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

Outlook ein Singleton ist, also egal, was Sie tun, wird es immer auf die ausgeführte Instanz verbinden. Das einzige Problem (wie Sie festgestellt haben) besteht darin, dass das COM-System es ablehnt, COM-Objekte zwischen den beiden Prozessen zu verwalten, wenn es bereits in einem anderen Sicherheitskontext ausgeführt wird.

Verwandte Themen