繁体   English   中英

win32com Outlook 客户端没有属性“GetNameSpace”

[英]win32com Outlook client has no attribute 'GetNameSpace'

我使用GetNameSpace('MAPI')工作得很好,但我写了一个 ActiveState 代码: 使用 win32com 导入 Outlook 联系人GetNameSpace不再有用。

现在代码已更改:有用GetNamespace('MAPI') 为什么会发生这种情况以及如何返回GetNameSpace('MAPI')

import win32com.client as client
outlook = client.Dispatch('Outlook.Application')
namespace = outlook.GetNameSpace('MAPI')
drafts = namespace.GetDefaultFolder(16)
contacts = namespace.GetDefaultFolder(10)
inbox = namespace.GetDefaultFolder(6)

结果:

AttributeError: '<win32com.gen_py.Microsoft Outlook 16.0 Object Library._Application
  instance at 0x2538077068688>' object has no attribute 'GetNameSpace'

我正在研究 VSCode。

到目前为止,Outlook object model 没有任何改变。 Session属性和GetNamespace方法可以互换使用,以获得当前 session 的NameSpace object。 两个成员都有相同的目的。 例如,以下语句执行相同的 function:

Set objNamespace = Application.GetNamespace("MAPI") 

Set objSession = Application.Session

请注意,有时,当您在 Outlook 中配置了多个配置文件时,您可能需要使用GetNamespace方法的Logon方法。

在基本层面上,问题是GetNameSpace上的拼写错误,它应该有一个小写的 's'。

这是MS文档

所以这段代码有效:

import win32com.client as wc

ol = wc.gencache.EnsureDispatch('Outlook.Application')
namespace = ol.GetNamespace('MAPI')

但这不会:

import win32com.client as wc

ol = wc.gencache.EnsureDispatch('Outlook.Application')
namespace = ol.GetNameSpace('MAPI')

在更深层次上,这不那么微不足道,因为在其他情况下,您可能会逃脱任何一种情况:

此代码有效:

import win32com.client as wc

ol = wc.dynamic.Dispatch('Outlook.Application')
namespace = ol.GetNameSpace('MAPI')

甚至微软自己也在他们的文档中在“s”和“S”之间切换。 差异来自 COM object 的早期与晚期结合。

如果您之前调用win32com.client.gencache('Outlook.Application')作为 OP 引用的 ActiveState 示例,那么win32com将/可能已经从 Outlook 类型库创建了一个早期绑定包装器。 此包装器区分大小写并保持不变,以便可用于其他应用程序。 当您调用win32com.Dispatch('Outlook.Application')时, win32com package 将尝试使用此包装器(如果可用)。 如果您使用的是 VBA 这类似于包含 Outlook 作为您的代码的参考,并使用Dim ol As Outlook.Application

但是,如果您之前没有调用 gencache, win32com.Dispatch('Outlook.Application')将使用后期绑定和 IDispatch 接口(类似于调用win32com.dynamic.Dispatch() ),其中查找方法和属性名称在运行时动态地,通过低级IDispatch::GetIDsOfNames() 调用 此查找不区分大小写(请参阅文档中的注释),因此不区分“s”和“S”。 如果您使用Dim ol as Object ,则在 VBA 中也是如此,没有引用 Outlook 类型库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM