0

经过一小时的搜索,在这里试试运气。

假设您的 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"];

但我无法为地址列表找出类似的机制。

任何帮助表示赞赏。

谢谢你。

4

2 回答 2

0

来自不同服务器的 GAL 需要使用配置文件 (IProfAdmin) 和帐户管理 API (IOlkAccountManager) 与相应的商店和帐户相关联。这些接口只能在 C++ 或 Delphi 中访问。您将需要从存储 (IMsgSTore) 和地址簿对象 (IABContainer) 中读取 PR_EMSMDB_SECTION_UID。如果您需要将其与帐户匹配,则在 IOlkAccount 对象的 PROP_MAPI_EMSMDB_SECTION_UID (0x20070102) 属性中将提供相同的值 -如果单击 IOlkAccountManager 按钮并双击 Exchange 帐户,您可以在OutlookSpy中看到它。

如果可以选择使用Redemption,则可以使用RDOExchangeAccount对象,该对象公开 GAL、AllAddressLists、PrimaryStore、PublicFolders 等属性。

于 2013-03-12T20:07:48.710 回答
0

我使用 Account.CurrentUser UID 和匹配的 AddressList UID 来选择正确的列表。我不知道使用 Store 是否是一种更好的方法,但是这个方法很好用。

理查德和德米特里感谢您的帮助。

此外,Dmitry 我要感谢您维护 Internet 上所有 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;
        }
    }
}
于 2013-03-13T16:17:26.410 回答