【问题标题】:MailItem.Save() error "The operation cannot be performed because the message has been changed"MailItem.Save() 错误“无法执行操作,因为消息已更改”
【发布时间】:2016-03-30 22:54:10
【问题描述】:

在我更改或添加一些属性后,我在 Outlook 插件中保存 mailitem 时遇到问题。代码抛出错误:“由于消息已更改,无法执行操作”。插件的思路是:右键点击邮件,点击新选项“发送到系统”,然后邮件发送,并获得图标作为发送成功的标记。 这是我的代码:

mail.UserProperties.Add("exportedToCompany", OlUserPropertyType.olText, true, OlFormatText.olFormatTextText);
mail.UserProperties["exportedToCompany"].Value = "exported";

try
{
    try
    {
        mail.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/id/{00062008-0000-0000-C000-000000000046}/8582000B", false);
        mail.MessageClass = "IPM.Note.ExportedMail";
        mail.Save(); //throws error
    }
    catch (System.Exception ex) { logger.Error(ex.Message); logger.Error(ex.StackTrace); }
    DeleteUselessMsg(mail);
}
catch (System.Exception ex)
{
    Debug.WriteLine(ex.StackTrace);
    logger.Error(ex.Message); 
    logger.Error(ex.StackTrace);
}

SendMail(GetNextMail());

在调试期间,我无法真正模拟发生这种情况的情况,我只是从客户端获取日志文件,该错误经常发生。 我想知道为什么如此随机,以至于我根本没有得到这个错误,而客户得到了很多,但不是每次都得到它。我的一个想法是 IMAP 在我保存邮件之前会以某种方式更新邮件——这可能吗? 代码执行后出现错误后的其他事情:Outlook 在您尝试关闭程序后要求保存未保存的项目,并且假设程序在草稿文件夹中创建邮件副本(但我不确定它是否与我的问题有关)。我可以以某种方式强制保存 MailItem 吗? 使用 Outlook 2013

【问题讨论】:

    标签: c# vsto outlook-addin


    【解决方案1】:

    该错误表示该消息在您打开它和您调用“保存”之间被修改。作为一般经验法则,请确保在尽可能短的时间内保留对实时 Outlook 项目的引用。

    mail 变量从何而来?尝试存储项目的条目 ID 而不是实时 MailItem 对象:使用 Application.Session.GetItemFromID 通过其条目 ID 打开项目,修改并保存,释放项目。

    【讨论】:

    • mail 变量来自 Explorer.Selection od type MailItem
    • 如您所说,在打开和保存操作之间修改消息时会出现问题,但是我每次添加 UserProperties 时都会修改它,那么它不应该每次都抛出错误吗?
    • 不,底层 MAPI 提供程序只有在保存消息时才会看到冲突。修改消息但从不保存它是完全可以的。
    猜你喜欢
    • 2013-02-05
    • 2012-06-17
    • 2022-07-19
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 2013-04-10
    • 2015-07-12
    • 1970-01-01
    相关资源
    最近更新 更多