【问题标题】:Outlook VSTO add-in changing sent item attributes get overwritten by Exchange sync更改已发送项目属性的 Outlook VSTO 加载项被 Exchange 同步覆盖
【发布时间】:2020-05-12 02:03:05
【问题描述】:

我有一个 VSTO Outlook 加载项,它侦听“已发送邮件”文件夹并为用户提供一些选项,以 (1) 将已发送邮件的副本保存到某处(例如文件系统)和 (2) 应用Outlook 中项目的一些属性(例如,将后续标志设置为完成,向主题添加文本)。

这是代码 - 请注意,传递给此子的对象是包含元数据的自定义对象,特别是 ItemToSave 是包含项目 GUID 的结构,不是本身的引用到 Outlook 对象模型对象。

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_Startup() 包含以下内容:

       ...
       m_olSentFolder = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail)
       m_olSentFolderEvents = m_olSentFolder.Items
       ...
    
  2. ThisAddin 包含一个方法 Private Sub m_olSentFolderEvents_ItemAdd(ByVal Item As Object) Handles m_olSentFolderEvents.ItemAdd,它从 Item 对象中解析出信息,并将其在结构中传递给 WPF 对话框供用户进行选择。

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

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

一些用户报告说正在应用对 Outlook 中项目的更改,但显然随后与 Exchange 的项目同步会覆盖这些更改。其中一些用户会看到类似“您已对此项目的副本进行了更改...”这样的消息,并且我的加载项所做的预期更改是在项目的先前“版本”中。

如果用户稍等片刻,然后应用我的加载项中的选项,它们是最新版本,不会被与 Exchange 同步。大概此时已与 Exchange 同步。

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

【问题讨论】:

  • 你现在用什么代码?
  • @EugeneAstafiev 我们开始,添加代码。
  • 不清楚何时何地调用CleanUpThisEmail方法。
  • 感谢@EugeneAstafiev,您非常有耐心。我已经添加了调用序列。
  • 您需要使用作为参数传递给ItemAdd事件的项目。

标签: outlook office365 vsto exchange-server


【解决方案1】:

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

那是因为使用物品的方式如下:

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

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

【讨论】:

  • 好的,谢谢 - 通过下游方法传递我在 ItemAdd 事件中获得的项目是否安全?
  • 我想我可以从链接文档(关于 VBA)概括为 .net (VSTO) 就我而言?
  • Outlook 对象模型适用于各种应用程序。
【解决方案2】:

这是 Outlook 优化提交过程的方式的副作用 - 它将邮件交给 Exchange 并将其移动到本地已发送邮件文件夹。 Exchange 完成提交后,会将邮件移动到“已发送邮件”文件夹的联机副本。 Outlook 不会同步这两条消息,因为它知道它们应该是相同的(至少对最终用户而言)。如果稍后进行更改,它将同步两者。 尝试使用计时器(使用 Forms 命名空间中的 Timer 类,因为它使用主线程)稍后更新消息。

【讨论】:

  • 呃,计时器?真的吗?我还没有考虑过使用原始项目(根据@Eugene 的回复)......你认为这不会绕过这个问题吗?
猜你喜欢
  • 1970-01-01
  • 2017-11-04
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多