2009-01-02 11 views
8

J'ai été inspiré par Modifying Microsoft Outlook contacts from Python - Je cherche à essayer certaines de mes applications Outlook les plus ennuyeuses avec le package win32com. Je suis un utilisateur de Linux piégé dans la cellule d'un utilisateur Windows, donc je ne connais pas grand-chose à COM.Python Outlook 2007 COM primer

Je cherche des informations sur si COM permet la réflexion via win32com ou s'il y a de la documentation sur les objets COM Outlook 2007. Tout autre pointeur que vous pensez utile sera le bienvenu!

J'ai trouvé Programming Outlook With Python, mais j'utilise Outlook 2007 donc j'aimerais avoir plus d'informations sur la quantité d'informations Outlook 2000 qui est toujours applicable.

TIA!

Répondre

6

Pour répondre à votre question sur la documentation. Voici deux liens que je visite régulièrement lors du développement de macros Outlook. Alors que les sites sont principalement axés sur le développement avec des technologies MS, la plupart du code peut être facilement traduit en python une fois que vous avez compris comment utiliser COM.

6

En général, les références plus anciennes au modèle d'objet sont probablement encore valide étant donné l'attention de Microsoft paie à l'envers -compatibilité. Pour savoir si vous pouvez ou non utiliser win32com en python pour Outlook, vous devriez pouvoir l'utiliser pour effectuer des appels en retard sur le modèle d'objet Outlook. Voici une page qui décrit comment le faire avec Excel:

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

Un problème que vous devriez être mis au courant est le fait que Outlook dispose d'une boîte de dialogue de sécurité qui est lancé lorsque les programmes externes tentent d'accéder le modèle objet et effectuer des opérations dans Outlook. Vous êtes pas va être en mesure de supprimer ce dialogue.

Si vous souhaitez éviter la boîte de dialogue, il est préférable de créer des macros dans VBA pour Outlook chargées dans une session et de placer des boutons dans un nouveau CommandBar pour les exécuter.

+0

Yikes - c'est une triste perspective. Pas moyen de mettre en liste blanche un programme donné? – cdleary

+0

Une façon d'éviter les problèmes de sécurité Outlook est d'utiliser la rédemption. (http://www.dimastr.com/redemption/) Voir également cette page pour d'autres méthodes (http://www.outlookcode.com/article.aspx?ID=52) pour contourner la sécurité Outlook. – Zoredache

1

Ceci a été ma mise en œuvre il y a quelques années. Je l'ai utilisé pour automatiser la réception et l'envoi d'e-mails. Je ne sais pas si cela fonctionnera avec 2010. Cela dépend aussi de Redemption.

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

Je sais que c'est vieux, mais je n'arrive pas à le faire fonctionner. L'appel de votre troisième ligne renvoie '' 'pywintypes.com_error: (-2147221005, 'Chaîne de classe non valide', None, None)' '' '. De quoi dépend cette ligne? Y a-t-il des ressources que vous suggérez d'apprendre à ce sujet? – wnnmaw

Questions connexes