2009-01-02 67 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