Pregunta

Me inspiré en Modificando los contactos de Microsoft Outlook desde Python - - Estoy tratando de probar con secuencias de comandos algunos de mis usos de Outlook más molestos 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 creas que te será útil es bienvenido!

He encontrado Outlook de programación con Python , pero estoy usando Outlook 2007, así que me gustaría obtener más información sobre cuánta información de Outlook 2000 sigue siendo aplicable.

TIA!

¿Fue útil?

Solución

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 MS, la mayoría del código se puede traducir fácilmente a Python una vez que entienda cómo usar COM.

Otros consejos

En general, las referencias más antiguas al modelo de objetos probablemente sigan siendo válidas, dada la atención que Microsoft presta a la compatibilidad con versiones anteriores.

En cuanto a si podrá o no usar win32com en Python para Outlook, sí, debería poder usar eso para hacer llamadas vinculadas tardías 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 conocer es el hecho de que Outlook tiene un cuadro de diálogo de seguridad que aparece cuando los programas externos intentan acceder al modelo de objetos y realizar operaciones en Outlook. Usted no podrá suprimir este cuadro de 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 los botones en una nueva barra de comandos para ejecutarlos.

Esta fue mi implementación de hace un par de años. Lo utilicé para automatizar la recepción y envío de correo electrónico. No estoy seguro de si esto funcionará con 2010. También depende 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top