我创建了一个处理附件的Outlook插件。将附件添加到邮件项目时,我正在处理它并添加包含有关附件信息的用户属性。我有一个项目发送事件处理程序,它在发送邮件之前对附件进行最终处理。
此时我的主要问题是我需要检测邮件项何时被删除,以便我可以删除相关资源,特别是如果它从未发送过。前删除事件处理程序似乎是明显的选择,但似乎没有被调用。
有人可以告诉我如何删除邮件项目时的检测情况吗?我想我可能需要做的是检测何时将其从"删除的项目中删除"文件夹和已删除,而不仅仅是移动到其他文件夹。
答案 0 :(得分:0)
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
事件添加到“已删除邮件”文件夹中。
答案 1 :(得分:0)
无法轻易捕捉与删除邮件相关的任何内容。 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对象在单个调用中从多个项检索属性来优化它。