访问多个Outlook帐户的全局地址列表
本文关键字:全局 地址 列表 Outlook 访问 | 更新日期: 2023-09-27 18:03:29
我找了一个小时,想试试运气。
假设Outlook 2010有两个活动帐户:john.doe@company.com, admin.test@company.com。
您需要拉出全球地址列表admin.test@company.com:
using Microsoft.Office.Interop.Outlook;
Application app = new Application();
NameSpace ns = app.GetNamespace("MAPI");
ns.Logon("", "", false, true);
AddressList GAL = ns.AddressLists["Global Address List"];
foreach (AddressEntry oEntry in GAL.AddressEntries)
{
// do something
}
这里的问题是GAL可以属于任何一个帐户,并且至少通过阅读MSDN,您如何指定您真正想要使用的帐户并不明显。
如果我们像这样遍历所有列表:
foreach (AddressList lst in ns.AddressLists)
{
Console.WriteLine("{0}, {1}", lst.Name, lst.Index);
}
我们可以看到有两个条目名为"Global Address List",两个条目名为"Contacts"等,索引不同,但仍然不清楚哪个属于哪个帐户。
对于文件夹,这样做很好,因为你可以使用这样的结构:
ns.Folders["admin.test@company.com"].Folders["Inbox"];
,但我不能找出类似的机制addreslist。
感谢您的帮助。
谢谢。
我使用Account。CurrentUser UID和匹配的AddressList UID选择正确的列表。我不知道是否使用Store是一个更好的方法,但是这个效果很好。
Richard和Dmitry感谢你们的帮助。
Dmitry,我还要感谢你维护了互联网上可用的所有MAPI标签的唯一来源。
代码:using Microsoft.Office.Interop.Outlook;
const string PR_EMSMDB_SECTION_UID = "http://schemas.microsoft.com/mapi/proptag/0x3D150102";
Application app = new Application();
NameSpace ns = app.GetNamespace("MAPI");
ns.Logon("", "", false, true);
string accountName = "admin.test@company.com";
string accountUID = null;
// Get UID for specified account name
foreach (Account acc in ns.Accounts)
{
if (String.Compare(acc.DisplayName, accountName, true) == 0)
{
PropertyAccessor oPAUser = acc.CurrentUser.PropertyAccessor;
accountUID = oPAUser.BinaryToString(oPAUser.GetProperty(PR_EMSMDB_SECTION_UID));
break;
}
}
// Select GAL with matched UID
foreach (AddressList GAL in ns.AddressLists)
{
if (GAL.Name == "Global Address List")
{
PropertyAccessor oPAAddrList = GAL.PropertyAccessor;
if (accountUID == oPAAddrList.BinaryToString(oPAAddrList.GetProperty(PR_EMSMDB_SECTION_UID)))
{
foreach (AddressEntry oEntry in GAL.AddressEntries)
{
// do something
}
break;
}
}
}