MailItem.Save()错误"由于邮件已被更改,因此无法执行操作"

时间:2016-03-30 14:01:37

标签: c# vsto outlook-addin

在我更改或添加一些属性后,我在Outlook插件中保存mailitem时出现问题。代码抛出错误:"由于消息已被更改,因此无法执行操作"。加载项的想法是:右键单击Mail,单击新选项"发送到系统",然后发送邮件,它会获得图标作为成功发送的标记。 这是我的代码:

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

1 个答案:

答案 0 :(得分:0)

错误表示邮件在您打开它和您调用Save之间被修改。作为一般经验法则,请确保在尽可能短的时间内保持对实时Outlook项目的引用。

邮件变量来自哪里?尝试存储项目的条目ID而不是实时MailItem对象:使用Application.Session.GetItemFromID按条目ID打开项目,修改并保存,释放项目。