2009-01-02 39 views
8

Me he inspirado en Modifying Microsoft Outlook contacts from Python - Estoy tratando de probar algunas de mis más molestas aplicaciones 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.Python Outlook 2007 primer COM

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

He encontrado Programming Outlook With Python, pero estoy usando Outlook 2007, así que me gustaría obtener más información sobre la cantidad de información de Outlook 2000 que todavía se aplica.

TIA!

Respuesta

6

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.

6

En general, las referencias más antiguas al modelo de objetos son probablemente todavía válida dada la atención Microsoft paga a revés -compatibilidad.

En cuanto a si podrá o no usar win32com en python para Outlook, sí, debería ser capaz de 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 usted debe tomarla en cuenta es el hecho de que Outlook tiene un diálogo de seguridad que se produce cuando los programas externos tratan de Acceso el modelo de objetos y realizar operaciones en outlook. Usted es no que va a poder 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 botones en una nueva CommandBar para ejecutarlos.

+0

Yikes - eso es una perspectiva triste. ¿No hay forma de incluir en la lista blanca un programa determinado? – cdleary

+0

Una forma de evitar los problemas de seguridad de Outlook es utilizar el canje. (http://www.dimastr.com/redemption/) Consulte también esta página para conocer otros métodos (http://www.outlookcode.com/article.aspx?ID=52) para evitar la seguridad de Outlook. – Zoredache

1

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 
+0

Sé que esto es viejo, pero parece que no puedo hacer que funcione. Llamar a su tercera línea devuelve '' 'pywintypes.com_error: (-2147221005, 'Cadena de clase inválida', Ninguno, Ninguno)' ''. ¿De qué depende esa línea? ¿Hay algún recurso que sugiera para aprender sobre eso? – wnnmaw

Cuestiones relacionadas