【问题标题】:C# / Outlook - retrieving a specific Global ContactC# / Outlook - 检索特定的全局联系人
【发布时间】:2011-08-06 11:23:27
【问题描述】:

我有两个问题:

1:我们有一个名为 Global Contacts 的公共 Outlook 文件夹,其中包含(您猜对了)服务器上拥有帐户的每个人都可以使用的大量联系人。

我可以使用此代码访问它:

            Microsoft.Office.Interop.Outlook._Application objOutlook; //declare Outlook application
            objOutlook = new Microsoft.Office.Interop.Outlook.Application(); //create it
            Microsoft.Office.Interop.Outlook._NameSpace objNS = objOutlook.Session; //create new session
            Microsoft.Office.Interop.Outlook.MAPIFolder oAllPublicFolders; //what it says on the tin
            Microsoft.Office.Interop.Outlook.MAPIFolder oPublicFolders; // as above
            Microsoft.Office.Interop.Outlook.MAPIFolder objContacts; //as above
            Microsoft.Office.Interop.Outlook.Items itmsFiltered; //the filtered items list
            oPublicFolders = objNS.Folders["Public Folders"];
            oAllPublicFolders = oPublicFolders.Folders["All Public Folders"];
            objContacts = oAllPublicFolders.Folders["Global Contacts"];

            itmsFiltered = objContacts.Items.Restrict(strFilter);//restrict the search to our filter terms

            for (int i = 1; i <= itmsFiltered.Count; i++) //loop through filtered items
            {
                 //do stuff
            }

这一切都很好,花花公子。我还想做一个这样的版本来检索 一个 基于某种唯一 ID 的特定联系人......我该怎么做?

我可以使用某种唯一的 ID 字段来检索联系人吗?还有比 Restrict() 更快的方法(可能会很慢 - 我们有数千个联系人)?

2:有没有办法绕过 Outlook 2003 的“程序正试图访问您存储在 Outlook 中的电子邮件地址。您要允许这样做吗?”每次运行此代码时都会弹出对话框?我知道这是一项安全功能,所以我猜这个答案很可能是“不”,但我还是想问一下。

【问题讨论】:

    标签: c# outlook exchange-server contacts


    【解决方案1】:

    使用蛮力从客户端浏览公共联系人列表永远不会很快。我建议查看Exchange Web Service (EWS) API,以通过服务器的 Web 服务实现您想要的功能。

    您还可以使用 EWS 绕过来自 Outlook 的烦人消息。

    绕过消息的另一种方法是直接使用 MAPI 和there are many examples。但是,MAPI 有我之前提到的同样的问题:使用蛮力从客户端完成任务并不能很快。

    【讨论】:

    • 上面的代码 sn-p 不使用蛮力 - 它调用 Items.Restrict,由服务器上的存储提供程序执行,或者,如果是缓存文件夹,则在本地执行。因此,在最好的情况下(缓存)它会比 EWS 快得多,而在最坏的情况下(在线配置文件)比 EWS 稍快,因为 EWS 是带宽占用 (XML)。同样的论点也适用于 MAPI。
    【解决方案2】:
    1. 如果您知道条目 ID,则只需调用 Namespace.GetItemFromID。否则,可以根据您的自定义唯一 ID 进行搜索。
    2. 您可以使用扩展 MAPI(仅限 C++ 或 Delphi)或 Redemption(任何语言)

    【讨论】:

      【解决方案3】:

      杰斯,

      我知道我遇到了同样的问题:“某个程序正在尝试访问您存储在 Outlook 中的电子邮件地址。您要允许这样做吗?”错误消息,我认为您的问题是以下代码行:

      objOutlook = new Microsoft.Office.Interop.Outlook.Application(); //create it
      

      请尝试将其更改为以下内容

      objOutlook = Globals.ThisAddIn.Application(); //get current Outlook object
      

      我认为这应该可以帮助您避免该错误消息,或者至少,这就是为我解决的问题! :-)

      祝你好运! :-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-31
        • 1970-01-01
        • 1970-01-01
        • 2018-10-29
        • 2010-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多