VSTO Outlook:如何区分ItemSend事件的手动与自动触发场景
区分Outlook ItemSend事件的手动发送与自动发送
可以通过以下两种核心方法来区分ItemSend事件的触发来源:
检查激活的Inspector撰写窗口
用户手动在撰写窗口发送邮件时,Outlook会存在一个激活的Inspector窗口,且该窗口的CurrentItem就是待发送的邮件对象。而Outlook自动发送场景(如发件箱积压邮件自动发送、延迟邮件到期发送)触发事件时,通常没有激活的Inspector窗口。示例VBA实现代码:
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean) Dim activeInspector As Outlook.Inspector Set activeInspector = Application.ActiveInspector If Not activeInspector Is Nothing Then If activeInspector.CurrentItem Is Item Then ' 触发源:用户手动在撰写窗口发送 Debug.Print "手动发送触发" Else ' 触发源:非撰写窗口的自动/程序发送 Debug.Print "自动发送触发" End If Else ' 触发源:无激活窗口的自动发送 Debug.Print "自动发送触发" End If End Sub结合
Sent属性辅助判断
自动发送的邮件在触发ItemSend事件时,Sent属性通常已被标记为True(Outlook准备发送时会预先设置该属性);而手动发送的邮件在事件触发阶段,Sent属性仍为False,直到发送完成后才会变更。这个方法建议和Inspector检查配合使用,避免特殊场景下的误判。代码片段示例:
If TypeName(Item) = "MailItem" Then If Item.Sent = False Then ' 倾向于手动发送场景 Else ' 倾向于自动发送场景 End If End If
注意:通过VBA代码主动调用Item.Send()触发的事件,不属于上述两种场景,需根据业务需求单独处理。
内容的提问来源于stack exchange,提问作者Willy
相关产品推荐
相关产品推荐

