如何获取已删除的OutlookItem的EntryID?

时间:2016-07-17 19:43:07

标签: c# office-interop outlook-addin

我需要将Outlook联系人与其他服务同步。我可以按如下方式订阅创建,更改和删除事件:

        Outlook.MAPIFolder folderContacts = this.Application.ActiveExplorer().Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderContacts);
        Outlook.Items contacts = folderContacts.Items;

        contacts.ItemAdd += Contacts_ItemAdd;
        contact.ItemChange += Contacts_ItemChange;
        contacts.ItemRemove += Contacts_ItemRemove;

当我在事件处理程序中获取项目时,这非常适合创建和更改:

    private void Contacts_ItemAdd(object Item)
    {
        Outlook.ContactItem contact = (Outlook.ContactItem)Item;
        ...
    }

但是,如果发生删除事件,我将无法获取已删除项目的信息。

    private void Contacts_ItemRemove() {
        // how to get deleted item or at least it's EntryID?
    }

那么如何获取已删除项目的EntryID?我使用此ID来标识其他服务中的项目。

2 个答案:

答案 0 :(得分:1)

在操作已经发生后,将引发所有基于MAPI的通知。当您收到ItemRemove事件时,该消息已经消失。

在扩展MAPI级别(仅限C ++或Delphi)上,当项目被删除时,商店提供商会引发以下fnevTableModified / TABLE_ROW_DELETED通知(您可以在OutlookSpy中看到它如果单击IMAPIFolder按钮并查看GetContentsTable选项卡底部的日志)。只有PR_INSTANCE_KEY属性可用:

ulEventType: fnevTableModified
    tab.ulTableEvent: TABLE_ROW_DELETED
    tab.propIndex: (PR_INSTANCE_KEY, cb:4, lpb: 0F 3E D3 A4 
    tab.propPrior: (PR_NULL, null)
    tab.row: (cValues : 0
    )

您只能通过事先为文件夹中的所有项目检索PR_INSTANCE_KEY来完成此工作,以便您可以映射PR_ENTRYID< - > PR_INSTANCE_KEY。

Outlook对象模型未在PR_INSTANCE_K事件中公开ItemRemove EY。如果使用Redemption是一个选项,则其RDOItemsItemRemove事件会将实例密钥作为参数传递。使用RDOItems.MAPITableExecSQL方法,只需一次通话即可检索文件夹中所有项目的PR_INSTANCE_KEY。

答案 1 :(得分:1)

您需要维护每个文件夹中的项目列表。在ItemRemove事件处理程序中,您可以将现有项目列表与您的列表进行比较。我建议阅读下面的系列文章,它们给出了Outlook中NewMailEx事件的一个示例(有时它根本没有被触发,因此开发人员应该寻找可能的解决方法):