如何强制将 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 来取消默认操作。因此,您可以进行任何修改并重新发送提交邮件项目。
我开发了一个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 来取消默认操作。因此,您可以进行任何修改并重新发送提交邮件项目。