![](/img/trans.png)
[英]How to clear the AttributeError for win32com of "object has no attribute '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.