解析收件人姓名

适用于:Outlook 2013 | Outlook 2016

对邮件进行寻址时,将生成一个收件人列表,其中包含与每个收件人相关的属性。 在发送邮件时,这些属性之一必须是收件人的长期条目标识符。 若要确保每个收件人包含 PR_ENTRYID (PidTagEntryId) 属性,请在调用 IAddrBook::ResolveName 时传递描述 lpAdrList 参数内容中的收件人列表的 ADRLIST 结构。

ResolveName 通过忽略 ADRLIST 结构中已解析的条目开始处理,如相应 ADRENTRY 结构的 SPropValue 数组中存在条目标识符所示。 接下来, ResolveName 自动将一次性条目标识符分配给两种类型的收件人:

  • 地址格式为 Internet 地址的收件人

  • 地址格式如下的收件人:

    displayname[address type:email address]

对于剩余的所有条目, ResolveName 在通讯簿中搜索显示名称的完全匹配项。 ResolveName 使用 PR_AB_SEARCH_PATH (PidTagAbSearchPath) 属性来确定要搜索的容器集和搜索顺序。 MAPI 调用每个容器的 IABContainer::ResolveNames 方法,以尝试解析所有名称。 由于某些容器不支持 ResolveNames,因此如果容器返回MAPI_E_NO_SUPPORT,MAPI 将对其内容表应用 PR_ANR (PidTagAnr) 属性限制。 需要所有通讯簿容器才能支持具有此限制的名称解析。 解析所有名称后,不再进行容器调用。 如果已调用所有容器,但名称不明确或未解析,MAPI 将显示一个对话框(如果可能),提示用户解析剩余的名称。

PR_ANR限制将 PR_ANR 属性的值与 ADRLIST 结构中的显示名称相匹配。 使用 PR_ANR 属性限制限制容器的内容表的视图会导致通讯簿提供程序执行“最佳猜测”类型的搜索,与对提供程序有意义的属性进行匹配。 例如,一个通讯簿提供程序可能始终将收件人列表中的姓名与 PR_DISPLAY_NAME (PidTagDisplayName) 匹配,而另一个通讯簿提供程序可能允许管理员选择属性。

对通讯簿容器的内容表设置PR_ANR属性限制

  1. 创建 SRestriction 结构,如以下代码所示:
SRestriction SRestrict;
SRestrict.rt = RES_PROPERTY;
SRestrict.res.resProperty.relop = RELOP_EQ;
SRestrict.res.resProperty.ulPropTag = PR_ANR;
SRestrict.res.resProperty.lpProp->ulPropTag = PR_ANR;
SRestrict.res.resProperty.lpProp->Value.LPSZ = lpszName;
 
  1. 调用内容表的 IMAPITable::Restrict 方法,将 SRestriction 结构作为 lpRestriction 参数传递。