【发布时间】: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
上述方法是如何调用的:
-
ThisAddin_Startup() 包含以下内容:
... m_olSentFolder = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail) m_olSentFolderEvents = m_olSentFolder.Items ... ThisAddin 包含一个方法
Private Sub m_olSentFolderEvents_ItemAdd(ByVal Item As Object) Handles m_olSentFolderEvents.ItemAdd,它从Item对象中解析出信息,并将其在结构中传递给 WPF 对话框供用户进行选择。对话框有一个“保存”按钮,然后该按钮的事件将项结构和保存详细信息传递给 WPF 对话框中工作线程上的方法
worker 方法调用我展示的“CleanUpThisEmail”方法。
一些用户报告说正在应用对 Outlook 中项目的更改,但显然随后与 Exchange 的项目同步会覆盖这些更改。其中一些用户会看到类似“您已对此项目的副本进行了更改...”这样的消息,并且我的加载项所做的预期更改是在项目的先前“版本”中。
如果用户稍等片刻,然后应用我的加载项中的选项,它们是最新版本,不会被与 Exchange 同步。大概此时已与 Exchange 同步。
有没有一种方法可以确保我对 Outlook 中的项目所做的更改以 Exchange 同步将其识别为最新版本的方式应用?似乎我可能需要在后台线程或其他东西上添加等待时间,但这似乎很脆弱且不优雅。
【问题讨论】:
-
你现在用什么代码?
-
@EugeneAstafiev 我们开始,添加代码。
-
不清楚何时何地调用
CleanUpThisEmail方法。 -
感谢@EugeneAstafiev,您非常有耐心。我已经添加了调用序列。
-
您需要使用作为参数传递给
ItemAdd事件的项目。
标签: outlook office365 vsto exchange-server