2009-01-02 6 views
8

Ich wurde von Modifying Microsoft Outlook contacts from Python inspiriert - Ich versuche zu versuchen, einige meiner lästigen Outlook-Anwendungen mit dem win32com-Paket zu scripten. Ich bin ein Linux-Benutzer, der in einem Windows-Benutzerschrank gefangen ist, daher weiß ich nicht viel über COM.Python Outlook 2007 COM-Primer

Ich bin auf der Suche nach Informationen darüber, ob COM Reflektion über win32com ermöglicht oder ob Dokumentation zu den Outlook 2007 COM-Objekten vorhanden ist. Alle anderen Hinweise, die Sie für hilfreich halten, sind willkommen!

Ich habe Programming Outlook With Python gefunden, aber ich benutze Outlook 2007, also möchte ich einige weitere Informationen darüber, wie viel der Outlook 2000-Informationen noch anwendbar ist.

TIA!

Antwort

6

Um Ihre Frage zu Dokumentation zu beantworten. Hier sind zwei Links, die ich regelmäßig bei der Entwicklung von Outlook-Makros besuche. Während die Seiten hauptsächlich auf die Entwicklung mit MS-Technologien ausgerichtet sind, kann der Großteil des Codes ziemlich einfach in Python übersetzt werden, sobald Sie verstehen, wie man COM benutzt.

6

Im Allgemeinen ältere Verweise auf das Objektmodell sind wahrscheinlich gilt nach wie vor angesichts der Aufmerksamkeit Microsoft rückwärts zahlt -Kompatibilität.

Ob Sie Win32com in Python für Outlook verwenden können, ja, Sie sollten damit in der Lage sein, spät gebundene Aufrufe an das Outlook-Objektmodell zu machen. Hier ist eine Seite, die beschreibt, wie es mit Excel zu tun:

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

Ein Problem, das Ihnen bewusst gemacht werden sollen, ist die Tatsache, dass Outlook einen Sicherheitsdialog hat, die nach oben geworfen wird, wenn externe Programme versuchen, zuzugreifen das Objektmodell und führen Sie Operationen in Outlook aus. Sie sind nicht gehen in der Lage, diesen Dialog zu unterdrücken.

Wenn Sie den Dialog vermeiden möchten, erstellen Sie besser Makros in VBA für Outlook, die in einer Sitzung geladen werden, und fügen Schaltflächen in eine neue Befehlsleiste ein, um sie auszuführen.

+0

Huch - das ist eine traurige Aussicht. Keine Möglichkeit, ein bestimmtes Programm auf die weiße Liste zu setzen? – cdleary

+0

Eine Möglichkeit, Outlook Security-Probleme zu vermeiden, ist die Verwendung von Einlösung. (http://www.dimastr.com/redemption/) Siehe auch diese Seite für andere Methoden (http://www.outlookcode.com/article.aspx?ID=52), um Outlook-Sicherheit zu umgehen. – Zoredache

1

Dies war meine Implementierung vor ein paar Jahren. Ich habe es verwendet, um das Empfangen und Senden von E-Mails zu automatisieren. Ich bin mir nicht sicher, ob das mit 2010 funktionieren wird. Es hängt auch von der Erlösung ab.

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

Ich weiß, das ist alt, aber ich kann es nicht funktionieren lassen. Der Aufruf der dritten Zeile gibt '' 'pywintypes.com_error zurück: (-2147221005, 'Ungültige Klassenzeichenfolge', keine, keine)' ''. Von was ist diese Linie abhängig? Gibt es irgendwelche Ressourcen, die Sie vorschlagen, um darüber zu lernen? – wnnmaw