搜索全局地址列表/簿

6

我正在开发一款应用程序,让用户可以查看他们可以访问的收件箱内容。我在尝试寻找一种方法来搜索全局通讯录,除了

AddressEntries entries = global.AddressEntries;
AddressEntry entry = entries["search value"];

这个代码可以运行,但只返回第一个找到的实例。如果有多个结果,我想向用户提供一个列表。其次,当我使用这个代码查看联系人详细信息时,会出现问题。
ContactItem contact = entry.GetContact();

它总是返回null,我认为这是因为它正在查看当前用户的联系人个人列表

我猜我正在尝试创建Outlook中全局通讯簿窗口的简单版本,如果有意义的话。

无论如何,如果有人有任何想法或参考资料,我会非常感激!

谢谢 Patrick

3个回答

6
您应该能够像下面展示的那样从当前配置文件获取全局地址列表。
Outlook.AddressLists addrLists = Application.Session.AddressLists;
Outlook.AddressList gal = addrLists["Global Address List"];

然后,您可以枚举和显示该AddressList的成员。

这里有另一种方法在MSDN上描述

如何:枚举全局地址列表中的条目


嗨,谢谢你的提示。我让它工作了,但是只是有点。我差不多处理了1万条记录,然后就抛出一个错误,不确定是什么,因为没有明确指出。我知道必须有更好的方法来查询GAL,而不是枚举整个列表(将近90k)。 - Patrick
@Patrick - 一种游标或书签API会很有用,以允许分块处理 - 不知道Outlook是如何如此快速地完成这项工作的。正如你所指出的,肯定不是这种方式。 - Steve Townsend
我遇到了一个错误,应用程序中没有Session的定义。在这种情况下我该怎么做? - GSandro_Strongs
MSDN的示例代码仍然存在,所以我猜测你要么没有包含“Application”类,要么选择了错误的类? - Steve Townsend

5
string[] names;
Outlook.AddressLists addrLists = Application.Session.AddressLists; 
Outlook.AddressList gal = addrLists["Global Address List"];

//for a distrubution list do this...
Outlook.AddressEntry entry = gal.AddressEntries["distribution list"];
Outlook.ExchangeDistributionList exchDL = entry.GetExchangeDistributionList();
Outlook.AddressEntries addrEntries = exchDL.GetExchangeDistributionListMembers();

names = new string[addrEntries.Count];

for (int i = 0; i < addrEntries.Count; i++)
{
    Outlook.AddressEntry exchDLMember = addrEntries[i];
    names[i] = exchDLMember.Name;
}

return names;

//for an individual you could do something like this...
Outlook.AddressEntry entry = gal.AddressEntries["contact nickname"];

Outlook.ContactItem contact = entry.GetContact();
string name = contact.NickName;
string email = contact.Email1Address;

0
  1. 安装 Outlook Interop 包 Install-Package Microsoft.Office.Interop.Outlook
  2. 这是代码(来自 MSDN)
using Microsoft.Office.Interop.Outlook;

var application = new Application();
            AddressList gal = application.Session.GetGlobalAddressList();
            if (gal != null)
            {
                for (int i = 1; i < gal.AddressEntries.Count - 1; i++)
                {
                    AddressEntry addrEntry = gal.AddressEntries[i];

                    if (addrEntry.AddressEntryUserType == OlAddressEntryUserType.olExchangeUserAddressEntry || 
                        addrEntry.AddressEntryUserType == OlAddressEntryUserType.olExchangeRemoteUserAddressEntry)
                    {
                        ExchangeUser exchUser = addrEntry.GetExchangeUser();
                        Console.WriteLine($"{ exchUser.Name } { exchUser.PrimarySmtpAddress }");
                    }
                    if (addrEntry.AddressEntryUserType == OlAddressEntryUserType.olExchangeDistributionListAddressEntry)
                    {
                        ExchangeDistributionList exchDL = addrEntry.GetExchangeDistributionList();
                        Console.WriteLine($"{ exchDL.Name } { exchDL.PrimarySmtpAddress }");
                    }
                }
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接