MailItem.Save исключение для учетной записи IMAP: «Операция не может быть выполнена, поскольку сообщение было изменено» - PullRequest
1 голос
/ 14 марта 2019

Это исключение возникает для учетной записи IMAP, если я собираюсь сохранить почтовый элемент в надстройке Outlook.Это происходит, когда я изменяю пользовательские свойства предыдущих сообщений в цепочке во время пересылки / ответа на почту.

Я прошел через это https://answers.microsoft.com/en-us/msoffice/forum/msoffice_outlook-mso_win10-mso_2016/the-operation-cannot-be-performed-because-the/ba4fa59e-0813-4874-b122-10bcf6e586af?page=1 и попробовал решения @Vijay_Verma, но это не такработа для меня.

Вот мой код:

 private void DraftItems_ItemAdd(object Item)
    {
        try
        {
            Outlook.MailItem mailItem = Item as Outlook.MailItem;

            Outlook.UserProperty mailUserProperty = mailItem.UserProperties?.Find("ABC");

            Outlook.Folder mailItemfolder = mailItem.Parent as Outlook.Folder;

            string emailId = mailItemfolder.Store.DisplayName;

            List<string> entryIdsInConvn = GetEmailsInConversation(mailItem.ConversationID, emailId);

            if (entryIdsInConvn != null && entryIdsInConvn.Count > 0)
            {
                Outlook.Folder inboxFolder = null;
                Outlook.NameSpace nameSpace = null;

                if (mailItemfolder != null)
                {
                    nameSpace = Application.GetNamespace("MAPI");
                    inboxFolder = mailItemfolder.Store.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder;

                    foreach (string entryId in entryIdsInConvn)
                    {
                        Outlook.MailItem mi = null;
                        try
                        {
                            mi = nameSpace.GetItemFromID(entryId, inboxFolder.StoreID) as Outlook.MailItem;
                            if (mi != null)
                            {
                                AddUserProperty(mi, mailUserProperty.Value);
                            }
                        }
                        finally
                        {
                            if (mi != null)
                                Marshal.ReleaseComObject(mi);
                        }
                    }
                    if (inboxFolder != null)
                        Marshal.ReleaseComObject(inboxFolder);
                    if (nameSpace != null)
                        Marshal.ReleaseComObject(nameSpace);
                }
            }

            if (mailUserProperty != null)
                Marshal.ReleaseComObject(mailUserProperty);
        }
        catch (Exception ex)
        { }
    }

    public void AddUserProperty(Outlook.MailItem mailItem, string Id)
    {
        Outlook.UserProperties mailUserProperties = null;
        Outlook.UserProperty mailUserProperty = null;

        try
        {
            mailUserProperties = mailItem.UserProperties;
            mailUserProperty = mailUserProperties.Find("ABC");

            if (null == mailUserProperty)
            {
                mailUserProperty = mailUserProperties.Add("ABC", Outlook.OlUserPropertyType.olText, false, 1);
            }

            mailUserProperty.Value = Id;
            mailItem.Save(); //Exception here
        }
        catch (Exception ex)
        {
             //The operation cannot be performed because the message has been changed
        }
        finally
        {
            if (mailUserProperty != null)
            {
                Marshal.ReleaseComObject(mailUserProperty);
            }

            if (mailUserProperties != null)
            {
                Marshal.ReleaseComObject(mailUserProperties);
            }
        }
    }

здесь я отвечаю на почту, затем добавляю свойство пользователя и сохраняю его и на событие DraftItemAdd, добавляю свойства пользователя в другие письмав разговоре.

Может кто-нибудь сказать мне, что может быть причиной этого исключения?Заранее спасибо!

...