如何强制将 MailItem 与基础 MAPI 对象同步

How to force synchronize MailItem with underlying MAPI object

我开发了一个VSTO插件。我们在代码中挂钩了 ItemSend 事件。当我尝试发送邮件时,我试图在发送之前删除所有附件。但是,邮件仍然包含所有已删除的附件。我可以在发送文件夹和收件箱中看到它们。

奇怪的是,当我打印附件数量时,它给出的是 0。但是当我使用 MAPI 对象和 API 打印 mime 时,它​​仍然在那里显示附件。 OOM 的 MailItem 对象似乎与 MAPI 对象不同步。

有什么方法可以强制执行此同步。

我写了下面的代码--

                    int numOfAttachments = mailItem.Attachments.Count;
                    for (int index = numOfAttachments; index > 0; --index)
                    {
                        Attachment attachment = mailItem.Attachments[index];
                        attachment.Delete();
                        Marshal.ReleaseComObject(attachment);
                    }
                    PrintInfo("Attachment count - " + 
                              mailItem.Attachments.Count.ToString());
                    mailItem.Save();
                    string mimeSource = MimeParser.GetMimeSource(mailItem);
                    File.WriteAllText("C:\Test\Mime2.txt", mimeSource);
                    Marshal.ReleaseComObject(mailItem);
                    return;

我想 Attachments.Remove 方法会导致相同的结果,对吗?

首先,我建议立即释放所有底层 COM 对象。例如:

int numOfAttachments = mailItem.Attachments.Count;

Attachments 属性 returns Attachments 集合的一个实例,它还活着。您只需释放通过属性和方法从 Outlook 对象模型获取的对象。使用完 Outlook 对象后,使用 System.Runtime.InteropServices.Marshal.ReleaseComObject 释放它。然后在Visual Basic中设置一个变量为Nothing(在C#中为null)来释放对该对象的引用。您可以在 MSDN 的 Systematically Releasing Objects 文章中阅读更多相关信息。

最后,ItemSend 事件处理程序允许通过将 cancel 参数设置为 true 来取消默认操作。因此,您可以进行任何修改并重新发送提交邮件项目。