Outlook VBA关于收件人.Resolve()方法
我正在编写一个函数,试图解析Outlook VBA关于收件人.Resolve()方法,vba,outlook,exchange-server,mapi,rdo,Vba,Outlook,Exchange Server,Mapi,Rdo,我正在编写一个函数,试图解析Recipients。起初,我主要是在调试模式下进入代码,并在VBE局部变量窗口中查看变量。我即将得出结论,Recipient.Resolve()方法是无用的,因为我的Recipient对象及其相应的AddressEntry是在Recipients.Add>或NameSpace.CreateRecipient方法被调用后立即设置的(如果成功解决,则在VBE窗口中将属性设置为错误) 1)在我的测试中,Recipients.Add和NameSpace.CreateReci
Recipient
s。起初,我主要是在调试模式下进入代码,并在VBE局部变量窗口中查看变量。我即将得出结论,Recipient.Resolve()
方法是无用的,因为我的Recipient
对象及其相应的AddressEntry
是在Recipients.Add>或NameSpace.CreateRecipient
方法被调用后立即设置的(如果成功解决,则在VBE窗口中将属性设置为
错误)
1)在我的测试中,Recipients.Add
和NameSpace.CreateRecipient
方法给出了相同的结果,但它们完全相同吗?
,它说
未解析条目是指尚未包含条目的条目
标识符或PR_ENTRYID(pittagentryId)属性
问题是,当找到时,Resolved
属性已经设置为True
,并且还设置了Recipient.EntryID
+Recipient.AddressEntry.ID
。但是后来,我意识到,当我用本地语言扩展我的Recipient
对象时,它们被解析了,因为在这样做之前,Recipient.Name
仍然是搜索中使用的Name
,而不是解析的Recipient.AddressEntry.Name
2)在VBE Locals窗口中扩展Recipient
变量似乎可以解决此问题,这是正常行为吗?
查看通讯簿>工具>选项…>解决我还了解到,就我而言,解决过程目前是这样的:
- 首先,搜索通用地址列表(GAL)通讯簿(不一定要精确匹配,但用作方法参数的
名称的每个部分必须位于预期结果的显示名称中)
- 如果未找到(例如,如果使用了
LASTNAME FirstName(子公司名称)
,而条目Display Name
类似于LASTNAME FirstName(控股公司名称)
,或者存在多个结果(例如同名或匹配的联系人组)),则解析将返回到联系人通讯簿中的搜索(本地Outlook个人通讯簿或PAB)
- 搜索联系人,规则似乎相同(例如,如果存在重复项,如
FirstName-LASTNAME
+LASTNAME-FirstName
,解析将失败)
我看到了这一切:
3)我对MAPI还不是很熟练,因此与我观察到的相比,我无法理解它描述的过程:它是如何工作的,以及PR\u ANR
和PR\u AB\u SEARCH\u PATH
属性是如何涉及的?
4)我知道我不应该使用PR_AB_SEARCH_PATH
,因为它是为MAPI保留的,但它的值是什么?它是容器ID的排序数组吗?
5)是否无法以编程方式更改(在VBA或其他语言中)上图中显示的通讯簿解析顺序设置?
现在让我们假设我在GAL中有两个这样的同音词(但在我的联系人中没有):
LASTNAME FirstName(控股公司名称)
LASTNAME FirstName(控股公司名称)
6)如何在不遍历所有条目的情况下获取第二个Exchange用户(有很多条目的方法)?我尝试了几件事,要么得到了第一件,要么得到了错误的结果)
7)对于EX用户,我无法获取完整的可分辨名称,因为它太长。在我的例子中,它被截断为128个字符:在VBA中(没有CDO或RDO)有没有办法获取完整的DN?我已经尝试了PR\u EMS\u AB\u OBJ\u DIST\u NAME
,但是它给出了与AddressEntry.Address
属性相同的结果
这两种方法都可以自由地自动解析收件人,例如,如果它看到您传递了SMTP地址。没有承诺接收者将无法解决
为什么这很重要?您不应该假设任何特定的行为并调用Resolve
。如果无事可做,它将无所作为。但称之为它并无害处
PR\u ANR
严格来说是MAPI。它与Outlook对象模型和VBA无关。PR_和的处理方式取决于特定的通讯簿提供商。它应该使用任何有意义的搜索算法。例如,在GAL中搜索与在联系人文件夹中搜索不同
它是一个标识符顺序存储的blob。同样,这没有什么区别。这是一个实现细节
它是扩展MAPI(C++或Delphi)或(任何语言)-在赎回中,您可以使用。SearchPath
(返回对象)
如果您指的是不明确的收件人,OOM不会公开任何与他们相关的内容。赎回将公开RDOSession.AddressBook.resolvenamex
和RDOAddressList.ResolveNameE
x,从而重新运行匹配条目的列表
VBA和OOM都不会截断DN。您确定不是您的代码截断它吗
6.同音异义词,请看我在问题7之前的段落。是的,我肯定,我发现一些帖子说这与商店限制有关。。。问题前还有一个链接,请参阅更新的答案。关于7。这可能是服务器端的问题吗?我甚至试图通过bytecomb的Mem_ReadHex实用程序进一步查看内存中的256字节,但没有任何问题。您如何显示数据?MsgBox?它可以截断字符串。