在Outlook地址簿的“Alias”列中搜索用户ID
我正在尝试获取Outlook地址簿对给定用户名返回的结果。基本上,当我提供用户名时,脚本必须返回该用户的电子邮件地址。
下面的脚本在解析收件人后只有一个结果时工作得很好。但是也存在Outlook返回两个或更多结果的情况,我们必须手动选择想要的那个。
我并不确定如何检索resolve() 函数返回的所有结果。
import win32com.client
import sys
def get_user_email(username: str) -> str | None:
outlook = win32com.client.Dispatch("Outlook.Application")
namespace = outlook.GetNamespace("MAPI")
recipient = namespace.CreateRecipient(username)
recipient.Resolve()
if recipient.Resolved:
exchange_user = recipient.AddressEntry.GetExchangeUser()
if exchange_user:
return exchange_user.PrimarySmtpAddress
return None
if __name__ == "__main__":
username = sys.argv[1] if len(sys.argv) > 1 else input("Enter username: ")
email = get_user_email(username)
print(email if email else "None")
在查看Outlook的地址簿时,我看到一个名为 "All Users" 的地址簿。我想如图所示,使用 "Alias" 字段进行高级搜索。这种搜索方式因为字符串唯一,返回的只有一个结果。这样做是否可能?
解决方案
在Extended MAPI级别(仅限C++或 Delphi)可以在某个地址簿容器(例如GAL)的内容表上创建一个 PR_ANR 限制。这正是Outlook在解析你在 To 编辑框中输入的名称时所做的——它会遍历搜索路径中的所有容器并应用 PR_ANR 限制。如果找到多个匹配项,就会显示一个对话框列出结果。如果只有一个匹配项,就返回该项并停止搜索,否则它会继续搜索路径中的下一个容器。
Outlook对象模型不暴露此功能。如果使用 Redemption(我是其作者;该库可以在任何语言中使用)作为一个选项,它暴露 RDOAddressBook.ResolveNameEx 和 RDOAddressList.ResolveNameEx,它们返回匹配项的列表。
set Session = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = Application.Session.MAPIOBJECT
set AdrrEntries = Session.AddressBook.ResolveNameEx(username)
Debug.Print AdrrEntries.Count & " names were returned by ResolveNameEx:"
Debug.Print "------------"
for each AE in AdrrEntries
Debug.Print AE.Name
next
Debug.Print "------------"
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。
