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?它可以截断字符串。