2009-01-02 65 views
8

我受到Modifying Microsoft Outlook contacts from Python的啓發 - 我正在嘗試使用win32com包的腳本編寫一些令人討厭的Outlook使用腳本。我是一位Linux用戶,被困在Windows用戶的臥室裏,所以我對COM不太瞭解。Python Outlook 2007 COM底漆

我正在查找COM是否允許通過win32com進行反射或者是否存在有關Outlook 2007 COM對象的文檔。歡迎任何您認爲有用的其他指針!

我發現Programming Outlook With Python,但我使用的是Outlook 2007,所以我想了解一些有關Outlook 2000信息的多少信息仍然適用的更多信息。

TIA!

回答

6

一般來說,對象模型舊的引用可能仍然有效給予關注微軟支付向後-compatability。

至於你是否可以在python for win中使用win32com,是的,你應該可以使用它來對Outlook對象模型進行後期調用。這裏是一個網頁,介紹如何用Excel做:

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

,你應該知道的一個問題是,Outlook已被拋起來,當外部程序試圖訪問的安全對話的事實對象模型並在Outlook中執行操作。你是而不是能夠抑制這個對話框。

如果您想要避免使用對話框,最好在VBA中爲會話中加載的Outlook創建宏,並將按鈕放在新的CommandBar中以執行它們。

+0

Yikes - 這是一個悲傷的前景。沒有辦法將特定程序列入白名單? – cdleary 2009-01-02 22:07:47

+0

避免Outlook安全問題的一種方法是使用兌換。 (http://www.dimastr.com/redemption/)另請參閱此頁面的其他方法(http://www.outlookcode.com/article.aspx?ID=52)以解決Outlook安全問題。 – Zoredache 2009-01-02 23:10:23

1

這是我幾年前實施的。我用它來自動收發電子郵件。不知道這是否會與2010年一樣。它也取決於贖回。

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