访问多个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。

感谢您的帮助。

谢谢。

访问多个Outlook帐户的全局地址列表

我使用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;
        }
    }
}