如何获取已删除OutlookItem的EntryID

本文关键字:删除 OutlookItem EntryID 何获取 获取 | 更新日期: 2023-09-27 17:57:26

我需要将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来识别其他服务中的项目。

如何获取已删除OutlookItem的EntryID

您需要维护每个文件夹中的项目列表。在ItemRemove事件处理程序中,您可以将现有项的列表与您的进行比较。我建议阅读以下一系列文章,这些文章为Outlook中的NewMailEx事件提供了一个例子(有时它根本没有被触发,所以开发人员应该寻找类似的可能解决方案):

  • Outlook NewMail事件释放:挑战(NewMail、NewMailEx、ItemAdd)
  • Outlook NewMail事件:解决方案选项
  • Outlook NewMail事件和扩展MAPI:C#示例
  • Outlook NewMail发布:编写一个有效的解决方案(C#示例)

所有基于MAPI的通知都是在操作发生后引发的。当您收到ItemRemove事件时,消息已经不见了。

在Extended MAPI级别(仅限C++或Delphi)上,删除项目时,存储提供程序会发出以下fnevTableModified/TABLE_ROW_DELETED通知(如果单击IMAPIFolder按钮并查看GetContentsTable选项卡底部的日志,则可以在OutlookSpy(我是它的作者)中看到它)。只有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&lt->PR_INSTANCE_KEY

Outlook对象模型不会在ItemRemove事件中公开PR_INSTANCE_KEY。如果使用Redemption是一个选项(我也是它的作者),那么它的RDOItems。ItemRemove事件将实例键作为参数进行传递。可以使用CCD_ 13在单个调用中预先缓存文件夹中所有项目的CCD_。ExecSQL方法。