代码之家  ›  专栏  ›  技术社区  ›  sasfrog

Outlook VSTO加载项更改已发送项目属性被Exchange同步覆盖

  •  0
  • sasfrog  · 技术社区  · 5 年前

    我有一个VSTO Outlook外接程序,它侦听Sent Items文件夹,并为用户提供一些选项(1)将已发送项目的副本保存到某个地方(如文件系统)和(2)在Outlook中对项目应用一些属性(如将follow-up标志设置为complete,向主题添加文本)。

    下面是代码—请注意,传递给此子对象的对象是包含元数据的自定义对象,特别是 ItemToSave 是包含项的GUID的结构,并且 不是吗

    Public Sub CleanUpThisEmail(ByRef item As ItemToSave,
                                ByRef postSaveOptions As PostSaveOptions)
    
        If item.SaveSuccess = True Then
            Try
                Dim oItem As Outlook.MailItem = Globals.ThisAddIn.Application.GetNamespace("MAPI").GetItemFromID(item.GUID)
    
                ' Stuff to do to the item in Outlook
                With oItem
                    If postSaveOptions.FlagCompleted = True Then .FlagStatus = Outlook.OlFlagStatus.olFlagComplete
                    If postSaveOptions.AppendToSubject = True Then .Subject = String.Format("{0} {1}", .Subject, DateTimeStringHelper.ParseTextWithDatesAndTimes(postSaveOptions.SubjectAppendOption, DateTime.Now()))
                    .Save()
                End With
    
                item.CleanupSuccess = True
            Catch ex As Exception
                ThisAddIn.log.ErrorFormat("CleanUpThisEmail: Error while applying options and/or deleting email in Outlook: {0}", ex.Message)
                ThisAddIn.log.Error(ex.StackTrace)
                item.CleanupSuccess = False
            End Try
    
            ThisAddIn.log.InfoFormat("CleanUpThisEmail: Finished processing")
        Else
            ThisAddIn.log.WarnFormat("CleanupThisEmail: Skipping processing of an email that failed to save correctly.")
        End If
    
    End Sub
    

    如何调用上述方法:

    1. ThisAddin\u Startup()包含以下内容:

         ...
         m_olSentFolder = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail)
         m_olSentFolderEvents = m_olSentFolder.Items
         ...
      
    2. Private Sub m_olSentFolderEvents_ItemAdd(ByVal Item As Object) Handles m_olSentFolderEvents.ItemAdd Item 对象,并将其在结构中传递给WPF对话框,供用户进行选择。

    3. 该对话框有一个“Save”按钮,该按钮的事件随后将项结构和保存详细信息传递给WPF对话框中工作线程上的方法

    4. worker方法调用我展示的“CleanUpThisEmail”方法。

    如果用户等待一段时间 然后 应用我的加载项中的选项,它们 与Exchange同步不会覆盖最新版本和。可能此时已经发生了与Exchange的同步。

    有没有一种方法可以确保对Outlook中的项目所做的更改的应用方式使Exchange sync将其识别为最新版本?似乎我可能需要添加一个背景线程或其他东西的等待时间,但这似乎脆弱和不雅。

    0 回复  |  直到 5 年前
        1
  •  0
  •   Eugene Astafiev    5 年前

    其中一些用户会看到这样的消息:“您已对此项目的副本进行了更改…”

    这是因为使用项目的方式如下:

    Globals.ThisAddIn.Application.GetNamespace("MAPI").GetItemFromID(item.GUID)
    

    要避免此类警告消息,需要使用作为参数传递给事件处理程序的项。例如 ItemAdd 事件将已添加到集合/文件夹中的项作为参数传递。

        2
  •  0
  •   Dmitry Streblechenko    5 年前

    尝试使用计时器(使用窗体命名空间中的计时器类,因为它使用主线程)稍后更新消息。