Python Outlook 2007 COM入门

时间:2009-01-02 21:12:51

标签: python com outlook outlook-2007

我受到Modifying Microsoft Outlook contacts from Python的启发 - 我正在尝试使用win32com软件包编写一些令人讨厌的Outlook使用的脚本。我是一个困在Windows用户小隔间的Linux用户,所以我对COM不太了解。

我正在寻找有关COM是否允许通过win32com进行反射的信息,或者是否有关于Outlook 2007 COM对象的文档。欢迎您认为有用的任何其他指示!

我找到了Programming Outlook With Python,但我正在使用Outlook 2007,因此我想了解更多有关Outlook 2000信息仍然适用的信息。

TIA!

3 个答案:

答案 0 :(得分:6)

回答有关文档的问题。以下是我在开发Outlook宏时经常访问的两个链接。虽然这些网站主要专注于使用MS技术进行开发,但一旦您了解了如何使用COM,大部分代码都可以很容易地转换为python。

答案 1 :(得分:6)

一般而言,对于对象模型的旧引用可能仍然有效,因为微软支持向后兼容性。

至于你是否可以在python for Outlook中使用win32com,是的,你应该可以使用它来对Outlook对象模型进行后期绑定调用。这是一个描述如何使用Excel执行此操作的页面:

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

您应该了解的一个问题是Outlook有一个安全对话框,当外部程序尝试访问对象模型并在Outlook中执行操作时,该对话框会被抛出。您将能够取消此对话框。

如果要避免使用该对话框,最好在会话中加载的VBA for Outlook中创建宏,并将按钮放在新的CommandBar上以执行它们。

答案 2 :(得分: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