如何在Outlook中删除项目?

时间:2014-06-03 18:41:38

标签: c# outlook

每次在outlook插件中删除约会时,我想获取item对象。问题是ItemRemoveEventHandler委托不会返回与ItemAddEventHandler或ItemChangeEventHandler相反的被删除项。我尝试了一些codes snippets,但没有一个正在运作。一个糟糕的解决方法是在垃圾文件夹(Outlook.OlDefaultFolders.olFolderDeletedItems)上附加ItemAddEventHandler。这不起作用,因为该项目未移至垃圾箱文件夹但已移除/添加:因此EntryID(唯一密钥标识符)不同...

是否有人在删除之前有一段代码来获取该项目?

2 个答案:

答案 0 :(得分:2)

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

如果使用Redemption是一个选项,则可以使用RDOItems。ItemRemove事件 - 它确实传递了PR_INSTANCE_KEY的值作为参数。

PR_INSTANCE_KEY仅在您已为文件夹中的所有项目或至少您感兴趣的项目缓存了该属性的值时才有用。请记住,PR_INSTANCE_KEY无法缓存 - 它是仅对内容表的特定实例(IMAPITable)有效。

另请注意,所有项目事件仅为UI目的而设计,不应用于任何类型的同步。

如果您使用该事件进行同步,您的选项要么使用ItemRemove事件作为提示,您的同步必须尽早运行,并循环遍历商店中的所有项目以确定更改了哪个项目,或者,以防万一在Exchange中,您可以使用增量更改同步API(ICS)。它在Redemption中作为RDOFolderSynchronizer对象公开。

答案 1 :(得分:0)

尝试使用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 event not fired in Outlook when item is deleted on remote machine得到了这个想法。