我尝试使用Outlook全局地址列表查找某人的电子邮件地址。这是我用来做的VBA代码。
'Snip
If firstName <> "" Then
Dim o, AddressList, AddressEntry
Dim AddressName, Address, Address2 As String
Set o = CreateObject("Outlook.Application")
Set AddressList = o.Session.AddressLists("Global Address List")
AddressName = firstName
For Each AddressEntry In AddressList.AddressEntries
If AddressEntry.Name = AddressName Then
Address = AddressEntry.GetExchangeUser.PrimarySmtpAddress
Exit For
End If
Next AddressEntry
End If
'Snip
变量&#34; firstName&#34;格式为姓氏,名字。这似乎只有一半的时间我尝试使用它。例如,如果我把自己的名字放在其中,每次工作都很好,但是如果我输入我的同事的名字,我会从Outlook中得到一个小小的弹出泡泡说&#34; outlook正试图从中检索数据Microsoft Exchange服务器* .com&#34;然后我得到一个自动化错误。我找不到那些不起作用的名字和那些名字相同的名字之间的任何共同点。非常感谢任何帮助。
编辑:我刚才想到的另一个注意事项是,当我在错误窗口点击调试时,会突出显示&#34; Next AddressEntry&#34;线。答案 0 :(得分:1)
不要循环遍历GAL中的所有项目 - 某些GAL包含数万个条目,您将无法遍历它们。
致电Application.Session.CreateRecipient
(返回Recipient
个对象),致电Recipient.Resolve
,然后使用Recipient.AddressEntry.GetExchangeUser
。
<强>更新强>:
如果名称不明确,您将从Recipient.Resolve
返回错误 - Outlook对象模型不允许您从中恢复 - 无法获取匹配列表并选择所需的匹配项。如果使用Redemption是一个选项,则可以使用is RDOAddressBook。ResolveNameEx
方法 - 它返回匹配列表(如果名称不明确,则返回一个条目)。如果您只想解决某个特定容器(例如GAL),也可以使用RDIAddressList。ResolveName
/ ResolveNameEx
。
Set o = CreateObject("Outlook.Application")
...
set Session = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = o.Session.MAPIOBJECT
set AdrrEntries = Session.AddressBook.ResolveNameEx("John")
MsgBox AdrrEntries.Count & " names were returned by ResolveNameEx:"
for each AE in AdrrEntries
MsgBox AE.Name
next