我有一个使用 Add-In Express 的自定义 Outlook 2013+ 加载项,主功能区上有一个按钮,单击该按钮会更改所选邮件项目的邮件类别(以及其他实际有用的操作)。
这在所有情况下都可以正常工作,除非 Outlook 中当前选择的文件夹是未读邮件文件夹。在此文件夹中保存MailItem
更新MessageClass
的未读项目时,我收到错误消息:
The operation cannot be performed because the message has been changed.
如果通过阅读窗格设置自动阅读项目,也会发生这种情况,但如果在单击按钮之前手动将消息标记为已读,则不会发生这种情况。如果邮件项目的其他不太基本的属性(如主题)以相同的方式修改,则不会发生这种情况。
以下示例说明了该问题(为简洁起见,省略了边界检查/异常处理):
public void ChangeSelectedMailItemMessageClass()
{
var activeExplorer = _outlookApp.ActiveExplorer();
var selection = activeExplorer.Selection;
var item = selection[1] as MailItem;
item.MessageClass = "Some.Valid.Message.Class";
item.Save(); // 'The operation cannot be performed because the message has been changed.'
Plugin.Marshal.ReleaseComObject(item);
Plugin.Marshal.ReleaseComObject(selection);
Plugin.Marshal.ReleaseComObject(activeExplorer);
}
可以看到相同的行为尝试为搜索文件夹中的项目设置自定义用户属性,其条件引用该用户属性,所以我怀疑它与搜索文件夹有关,而不是与未读邮件文件夹有关。
在修改之前释放selection
和activeExplorer
引用MailItem
没有区别,并且MailItem
从读取到修改的生命周期尽可能短(给定上面的片段)。
也许相关信息:
- Outlook 2016 虽然在 2013 年复制
- 尽管怀疑无关,但使用 Add-In Express
- 据我所知,COM 对象将尽快释放
- Outlook 连接到 Exchange
- Online vs Offline模式没有区别,错误是一样的
- 邮件在我自己的收件箱或某个子文件夹中,当时没有其他邮箱连接到 Outlook
是否可以修改MessageClass
未读邮件文件夹中的未读项目而不会遇到错误?
编辑:似乎另一个已安装的加载项在此过程中以某种方式干扰,但目前尚不清楚如何或是否可以对我的加载项进行编码,以免破坏另一个加载项的背面选择MailItem