【问题标题】:How can an outlook addin detect when an email is deletedOutlook插件如何检测电子邮件何时被删除
【发布时间】:2022-05-01 03:25:36
【问题描述】:

我创建了一个处理附件的 Outlook 插件。将附件添加到邮件项目时,我正在处理它并添加包含有关附件信息的用户属性。我有一个项目发送事件处理程序,它在发送邮件之前对附件进行最后处理。

此时我的主要问题是我需要检测邮件项目何时被删除,以便我可以删除关联的资源,尤其是在它从未发送过的情况下。 before delete 事件处理程序似乎是显而易见的选择,但似乎没有被调用。

谁能告诉我如何检测邮件项目何时被删除?我想我可能需要做的是检测它何时从“已删除项目”文件夹中删除并被删除,而不是仅仅被移动到另一个文件夹。

【问题讨论】:

  • 假设电子邮件已从 Outlook 外部(例如手机)删除。在这种情况下,您希望会发生什么?

标签: c# outlook-addin


【解决方案1】:

Outlook 项目的BeforeDelete 事件确实是您正在寻找的。

 Public WithEvents myItem As Outlook.MailItem 

 Public Sub DeleteMail() 
   Const strCancelEvent = "Application-defined or object-defined error" 
   On Error GoTo ErrHandler 
   Set myItem = Application.ActiveInspector.CurrentItem 
   myItem.Delete 
 Exit Sub 

 ErrHandler: 
   MsgBox Err.Description 
   If Err.Description = strCancelEvent Then 
     MsgBox "The event was cancelled." 
   End If 
   'If you want to execute the next instruction 
   Resume Next 
  'Otherwise it will finish here 
 End Sub 

 Private Sub myItem_BeforeDelete(ByVal Item As Object, Cancel As Boolean) 
   'Prompts the user before deleting an item 
   Dim strPrompt As String 
   'Prompt the user for a response 
   strPrompt = "Are you sure you want to delete the item?" 
   If MsgBox(strPrompt, vbYesNo + vbQuestion) = vbNo Then 
     'Don't delete the item 
     Cancel = True 
   End If 
 End Sub

要区分移动到已删除邮件文件夹和永久删除,您可以将ItemAdd 事件添加到已删除邮件文件夹。

【讨论】:

    【解决方案2】:

    没有办法轻松捕获与消息删除相关的任何内容。 BeforeDelete 不能可靠地工作,而且当您的代码未运行时(例如,当用户从另一台计算机/电话/等中删除它时),项目可能会被删除。

    另外请记住,所有 MAPI 事件都是异步的,因此当您收到一个事件时,该项目已经消失了。在 MAPI 级别,文件夹内容表会引发 TABLE_ROW_DELETED 通知,但由于消息已经消失,您只能获得 PR_INSTANCE_KEY 属性的值。仅当您已经知道特定消息的PR_INSTANCE_KEY 或者如果您拥有文件夹中所有消息的PR_INSTANCE_KEY 列表时,它才会有用。您可以在OutlookSpy 中看到事件触发(我是它的作者 - 单击 IMAPIFolder 按钮,转到 GetContentsTable 选项卡,查看窗口底部的日志)。如果 MAPI(C++ 或 Delphi)不是一个选项,Redemption(我也是它的作者)公开RDOItems.ItemRemove 事件,该事件将PR_INSTANCE_KEY 作为参数传递。

    Exchange Server 下的另一个选项是Incremental Change Synchronization API。同样,它是纯 MAPI,需要 C++ 或 Delphi。 Redemption 通过RDOFolderSynchronizer 对象公开它。

    唯一的通用选项是定期扫描文件夹中的邮件,并根据您自己的列表检查它们,看看是否缺少任何项目。这可能是一个性能瓶颈,即使您通过使用 Outlook.Table 对象在一次调用中检索多个项目的属性来对其进行优化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      • 1970-01-01
      相关资源
      最近更新 更多