python com outlook outlook-2007

Cebador COM de Python Outlook 2007



outlook-2007 (3)

Me inspiré en la modificación de los contactos de Microsoft Outlook desde Python . Estoy buscando intentar crear algunos de los usos más molestos de Outlook con el paquete win32com . Soy un usuario de Linux atrapado en un cubículo de usuarios de Windows, por lo que no sé mucho sobre COM.

Estoy buscando información sobre si COM permite la reflexión a través de win32com o si hay documentación sobre los objetos COM de Outlook 2007. ¡Cualquier otro indicador que piense que será útil es bienvenido!

Encontré Outlook de programación con Python , pero estoy usando Outlook 2007, por lo que me gustaría obtener más información sobre qué parte de la información de Outlook 2000 aún es aplicable.

TIA!


En general, las referencias más antiguas al modelo de objetos probablemente todavía sean válidas dada la atención que Microsoft paga por la compatibilidad con versiones anteriores.

En cuanto a si podrá o no usar win32com en python para Outlook, sí, debería poder usarlo para realizar llamadas con destino tardío al modelo de objetos de Outlook. Aquí hay una página que describe cómo hacerlo con Excel:

http://oreilly.com/catalog/pythonwin32/chapter/ch12.html

Un problema que debe tenerse en cuenta es el hecho de que Outlook tiene un cuadro de diálogo de seguridad que se lanza cuando los programas externos intentan acceder al modelo de objetos y realizar operaciones en Outlook. No podrá suprimir este diálogo.

Si desea evitar el diálogo, es mejor que cree macros en VBA para Outlook que se cargan en una sesión y coloque botones en una nueva CommandBar para ejecutarlos.


Para responder a su pregunta sobre la documentación. Aquí hay dos enlaces que visito regularmente al desarrollar macros de Outlook. Si bien los sitios se centran principalmente en el desarrollo con tecnologías de MS, la mayoría del código se puede traducir fácilmente a python una vez que comprenda cómo usar COM.


Esta fue mi implementación de hace un par de años. Lo usé para automatizar la recepción y el envío de correo electrónico. No estoy seguro de si esto funcionará en 2010. Depende también de la redención.

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