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