如何获得项目刚刚在Outlook中删除

本文关键字:删除 Outlook 项目 何获得 | 更新日期: 2023-09-27 18:06:35

我想在outlook插件中每次删除约会时获取项目对象。问题是ItemRemoveEventHandler委托不返回被删除的项目,与ItemAddEventHandler或ItemChangeEventHandler相反。我试过一些代码片段,但没有一个是工作的。一个糟糕的解决方案是在垃圾桶文件夹(Outlook.OlDefaultFolders.olFolderDeletedItems)上附加一个ItemAddEventHandler。这也不工作,因为项目没有移动到垃圾文件夹,但删除/添加:所以EntryID(唯一密钥标识符)是不一样的…

有没有人有一段代码在被删除之前获得项目?

如何获得项目刚刚在Outlook中删除

这些事件异步触发,所以当ItemRemove事件触发时,项目已经消失了。即使在MAPI级别上,当文件夹内容表触发fnevTableModified | TABLE_ROW_DELETED通知时,它只提供PR_INSTANCE_KEY属性的值(您可以在OutlookSpy中看到它-我是它的作者-单击IMAPIFolder,转到GetContentsTable表,当您删除一个项目时,查看页面底部的日志)。

如果可以使用Redemption(我也是它的作者),则可以使用RDOItems。ItemRemove事件——它传递PR_INSTANCE_KEY的值作为参数。

PR_INSTANCE_KEY只有在您已经缓存了文件夹中所有项的属性值,或者至少是您感兴趣的项的属性值时才有用。请记住,PR_INSTANCE_KEY不能被缓存——它只对内容表(IMAPITable)的一个特定实例有效。

还要记住,所有的item事件都是为UI目的而设计的,它们不应该用于任何类型的同步。

如果您使用事件进行同步,您的选择是使用ItemRemove事件作为您的同步必须尽快运行的提示,并循环遍历存储中的所有项目以找出哪个项目更改了,或者,在Exchange的情况下,您可以使用增量更改同步API (ICS)。它公开为Redemption中的RDOFolderSynchronizer对象

尝试使用Folder.BeforeItemMove并检查参数MoveTo的值,这是一个MAPIFolderMoveTo.StoreID应该与删除项的默认文件夹相同。对于shift + delete(永久删除),MoveTo应该等于null

private void BeforeItemMove(object Item, MAPIFolder MoveTo, ref bool Cancel)
{
    AppointmentItem appointment = (AppointmentItem)Item;  
    Folder deletedItemsFolder = 
        (Folder)Application
            .Session
            .GetDefaultFolder(OlDefaultFolders.olFolderDeletedItems);

    if(MoveTo == null || MoveTo.StoreID == deletedItemsFolder.StoreID)
    {
        // Do something...
    }
    Marshal.ReleaseComObject(deletedItemsFolder);
    deletedItemsFolder = null;
    Marshal.ReleaseComObject(appointment);
    appointment = null;
}

我得到了这个想法从问题BeforeItemMove事件没有在Outlook中触发当项目被删除在远程机器上