【问题标题】:Python Outlook 2007 COM primerPython Outlook 2007 COM 入门
【发布时间】:2010-09-29 07:30:42
【问题描述】:

我受到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!

【问题讨论】:

    标签: python com outlook outlook-2007


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      一般来说,考虑到 Microsoft 对向后兼容性的关注,对对象模型的旧引用可能仍然有效。

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

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

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

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

      【讨论】:

      【解决方案3】:

      这是我几年前的实现。我用它来自动接收和发送电子邮件。不确定这是否适用于 2010。这也取决于 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
      

      【讨论】:

      • 我知道这是旧的,但我似乎无法让它工作。调用第三行返回pywintypes.com_error: (-2147221005, 'Invalid class string', None, None)。那条线取决于什么?你有什么资源可以用来学习吗?
      猜你喜欢
      • 2011-03-25
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多