You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VSTO中取消MeetingItem的Send事件时,如何阻止收件箱会议邀请被删除?

阻止编辑会议响应后取消发送时原邀请被删除的方法

核心思路

在「编辑响应后再发送」的场景中,Outlook会在创建响应邮件时提前将原会议标记为已处理并准备移除收件箱——即使你在Send事件中取消发送,这个移除操作仍会执行。因此需要同时处理Send事件和收件箱Items的移除事件,双管齐下阻止原邀请被删除。

具体实现步骤

1. 在Send事件中恢复原会议邀请的状态

当触发MeetingResponseItem的Send事件并设置cancel=true时,找到对应的原MeetingItem,将其响应状态重置为未响应,并保存修改:

private void MeetingResponseItem_Send(ref bool Cancel)
{
    // 获取对应的原会议邀请
    MeetingItem originalMeeting = (MeetingItem)this.MeetingResponse.GetAssociatedAppointment(true).GetAssociatedMeetingItem();
    
    if (originalMeeting != null)
    {
        // 重置响应状态为未响应
        originalMeeting.MeetingResponseStatus = OlMeetingResponseStatus.olMeetingResponseNone;
        // 如果原会议已被标记为删除,取消删除标记
        if (originalMeeting.Deleted)
        {
            originalMeeting.UnDelete();
        }
        // 保存修改
        originalMeeting.Save();
    }
    
    Cancel = true;
}

2. 监听收件箱的Items.ItemRemove事件,拦截原邀请的移除

在Add-in启动时,为收件箱的Items集合注册ItemRemove事件,当检测到被移除的是目标会议邀请时,将其恢复到收件箱:

private Items inboxItems;

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    MAPIFolder inbox = Application.Session.GetDefaultFolder(OlDefaultFolders.olFolderInbox);
    inboxItems = inbox.Items;
    inboxItems.ItemRemove += InboxItems_ItemRemove;
}

private void InboxItems_ItemRemove()
{
    // 由于ItemRemove事件无法直接获取被移除的对象,通过最近的已删除邮件恢复
    MAPIFolder deletedItems = Application.Session.GetDefaultFolder(OlDefaultFolders.olFolderDeletedItems);
    if (deletedItems.Items.Count > 0)
    {
        object lastDeleted = deletedItems.Items[1];
        if (lastDeleted is MeetingItem meetingItem)
        {
            // 通过时间窗口、响应状态筛选目标会议邀请
            if (meetingItem.MeetingResponseStatus == OlMeetingResponseStatus.olMeetingResponseAccepted 
                && DateTime.Now.Subtract(meetingItem.LastModificationTime).TotalSeconds < 5)
            {
                // 移回收件箱
                meetingItem.Move(Application.Session.GetDefaultFolder(OlDefaultFolders.olFolderInbox));
                // 重置响应状态
                meetingItem.MeetingResponseStatus = OlMeetingResponseStatus.olMeetingResponseNone;
                meetingItem.Save();
            }
        }
    }
}

注意事项

  • ItemRemove事件无法直接获取被移除的Item对象,只能通过已删除邮件文件夹取最近删除的项判断,需添加时间窗口、响应状态等筛选条件避免误操作。
  • 处理原MeetingItem时,建议使用GetAssociatedMeetingItem方法准确关联原邀请,确保对象未被释放。
  • 需在不同版本的Outlook中测试,确保行为一致。

内容的提问来源于stack exchange,提问作者DomBat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 08:35:16