Python Outlook 2007 COM-Primer
-
03-07-2019 - |
Frage
Ich habe von inspiriert Ändern Microsoft Outlook-Kontakte aus Python - - ich bin auf der Suche scripting einige meiner ärgerlichen Outlook versuche, sich mit dem win32com
Paket. Ich bin in einer Windows-Benutzer Kabine gefangen Linux-Benutzer, so dass ich weiß nicht viel über COM.
Ich suche nach Informationen darüber, ob COM für die Reflexion über win32com
ermöglicht oder ob es Unterlagen über die Outlook 2007 COM-Objekte. Alle anderen Hinweise, die Sie denken, wird hilfreich sind willkommen!
ich gefunden habe Programmieren von Outlook mit Python , aber ich bin mit Outlook 2007 so würde ich auf einige weitere Informationen, wie sehr der Outlook 2000 Informationen noch anwendbar ist.
TIA!
Lösung
Um Ihre Frage zu beantworten Dokumentation. Hier sind zwei Links, die ich regelmäßig besuchen, wenn Outlook-Makros zu entwickeln. Während die Seiten in erster Linie mit MS-Technologien auf die Entwicklung konzentrieren sich die meisten der Code ziemlich leicht zu Python übersetzt werden kann, wenn Sie verstehen, wie COM verwenden.
Andere Tipps
In der Regel ältere Verweise auf das Objektmodell sind wahrscheinlich immer noch gültig angesichts der Aufmerksamkeit Microsoft rückwärts-Kompatibilität zahlt.
Was, ob Sie win32com in Python zu verwenden, in der Lage, für Outlook, ja, sollten Sie in der Lage sein, das verwenden, um spät gebundenen Aufrufe an das Outlook-Objektmodell zu machen. Hier ist eine Seite, die beschreibt, wie es mit Excel zu tun:
http://oreilly.com/catalog/pythonwin32/chapter/ch12.html
Ein Problem, das Ihnen bewusst gemacht werden sollen, ist die Tatsache, dass Outlook einen Sicherheitsdialog hat, die nach oben geworfen wird, wenn externe Programme versuchen, das Objektmodell zuzugreifen und Operationen in Outlook durchführen. Sie sind nicht in der Lage sein um diesen Dialog zu unterdrücken.
Wenn Sie den Dialog vermeiden wollen, sind Sie besser dran Makros in VBA für Outlook erstellen, die in einer Sitzung geladen werden, und setzen Tasten auf einem neuen CommandBar, um sie auszuführen.
Dies war meine Implementierung von vor ein paar Jahren. Ich benutzte es, das Senden und Empfangen von E-Mail zu automatisieren. Nicht sicher, ob dies mit 2010 arbeiten wird es auf Rückzahlung hängt auch.
import win32com.client,os,re
from utils.autoencode import autoencode
generated='2D5E2D34-BED5-4B9F-9793-A31E26E6806Ex0x4x7.py'
mapi_utils=win32com.client.Dispatch('Redemption.MAPIUtils')
olFolderDeletedItems=3
olFolderOutbox=4
olFolderSentItems=5
olFolderInbox=6
olFolderCalendar=9
olFolderContacts=10
olFolderJournal=11
olFolderNotes=12
olFolderTasks=13
class Attachment:
def __init__(self,CreationTime,attachement):
self.CreationTime=CreationTime
self.attachement=attachement
self.FileName=attachement.FileName
self.FileSize=attachement.FileSize
self.text=self.attachement.AsText
def Save(self,folder,filename=None,group=True):
if group:
folderGroup=re.sub('\\W','',str(self.CreationTime))
subfolder=os.path.join(folder,folderGroup)
if not os.path.isdir(subfolder):
os.mkdir(subfolder)
else:
folderGroup=''
if filename:
path=os.path.join(folder,folderGroup,filename)
else:
path=os.path.join(folder,folderGroup,self.FileName)
if os.path.isdir(folder):
self.attachement.SaveAsFile(path.replace('/','\\'))
return path
class Attachments:
def __init__(self,CreationTime,Attachments):
self.CreationTime=CreationTime
self.Attachments=Attachments
def __iter__(self):
return self.next()
def next(self):
for idx in range(self.Attachments.Count):
idx+=1
yield Attachment(self.CreationTime,self.Attachments.Item(idx))
class Message:
def __init__(self,store,folder,msg):
self.store=store
self.folder=folder
self.msg=msg
self.Attachments=Attachments(self.msg.CreationTime,msg.Attachments)
self.body=msg.Body
self.body_format=msg.BodyFormat
self.html=msg.HTMLBody
self.subject=msg.Subject
self.unread=msg.UnRead
self.id=msg.EntryID
def __str__(self):
return str('%s-%s-%s'%(self.store.Name,self.folder, self.msg))
def read(self,bool=True):
status=bool==False
self.msg.UnRead=status
class Inbox:
def __init__(self,session,store,folder,wantedFolder=None):
self.session=session
self.store=store
self.folder=folder
self.wantedFolder=wantedFolder
self.Name=folder.Name
def __getitem__(self,name):
self.wantedFolder=name
return self.next()
def __str__(self):
return '%s-%s'%(self.store.Name,self.Name)
def __iter__(self):
return self.next()
def subFolder(self,name):
self.wantedFolder=name
return self.next()
def next(self):
if self.wantedFolder:
subFolders=self.folder.Folders
for idx in range(subFolders.Count):
idx+=1
subfolder=subFolders.Item(idx)
if subfolder.Name==self.wantedFolder:
for msg in subfolder.Items:
yield Message(self.store,self.folder,msg)
else:
for msg in self.folder.Items:
yield Message(self.store,self.folder,msg)
class Store:
def __init__(self,session,store):
self.session=session
self.store=store
self.Name=store.Name
self.Inbox=Inbox(self.session,self.store,self.session.GetDefaultFolder(olFolderInbox))
def __str__(self):
return self.Name
def __iter__(self):
return self.next()
def next(self,folder=None):
pass
class rdo:
def __init__(self):
'''Outlook Redemption RDO wrapper'''
self.session = win32com.client.gencache.EnsureDispatch("Redemption.RDOSession")
self.session.Logon()
self.stores={}
for store in self.session.Stores:
self.stores[store.Name]=Store(self.session,store)
self.default_store=self.session.Stores.DefaultStore.Name
def __getitem__(self,name):
if self.stores.has_key(name):
return self.stores[name]
def __iter__(self):
return self.next()
def next(self):
stores=self.stores.keys()
yield self.stores[stores.pop(stores.index(self.default_store))]
for store in stores:
yield self.stores[store]
def getStore(self,name):
if self.stores.has_key(name):
return self.stores[name]
else:
return False
def getSharedMailbox(self,name):
try:
return Store(self.session,self.session.GetSharedMailbox(name))
except Exception,e:
if 'Could not resolve in GAL' in e.args[2][2]:
raise Exception('Mailbox could not be found')
else:
raise Exception ('Unknown error: %s'%e.args[2][2])
if __name__=='__main__':
r=rdo()
inbox = r.getStore('Mailbox - Foo').Inbox
for msg in inbox.subFolder('test'):
print msg.subject,msg.id