我认为您遇到的问题是您的程序永远不会得到“项目”。
所以你的过程被定义为
Sub delay_delivery(ByVal item As Object)
但是当你运行它时,“item”参数永远不会进入过程。我还没有测试你的代码,但我很惊讶它在你运行它时没有抛出某种错误。
有几种方法可以做你想做的事,但每种方法都有自己的问题。
请注意,用户需要在 Outlook 中启用宏才能正常工作,并且每次打开 Outlook 时都可能会收到提示。
第一个要简单得多,但不允许您使用宏,并且每次用户发送消息时都会提示。这需要放在“ThisOutlookSession”中
Private Sub Application_ItemSend(ByVal olItem As Object, Cancel As Boolean)
Dim response As Integer
response = MsgBox("Would you like to send this in an hour?", vbYesNo)
If response = vbYes Then
olItem.DeferredDeliveryTime = DateAdd("n", 90, Now)
End If
End Sub
这会捕获电子邮件的发送事件,如果用户选择在消息框中,则会将延迟发送属性放在电子邮件上。
第二种方式将允许该人使用宏,但是,如果该人打开了多封电子邮件,在其中一个中选择宏,然后先发送另一个,它会将延迟发送属性放在哪个上选择宏后发送项目。它确实在发送电子邮件后将延迟交付重置为 false。为此,将以下代码添加到“ThisOutlookSession”
Option Explicit
Private DelaySend As Boolean 'To store whether user wishes to delay
Private Sub Application_Startup()
DelaySend = False 'Set delaysend initially to false
End Sub
Sub delay_delivery()
DelaySend = True 'Set delay send when user clicks macro.
End Sub
Private Sub Application_ItemSend(ByVal olItem As Object, Cancel As Boolean)
If DelaySend = True Then 'Check if user set delay_send
olItem.DeferredDeliveryTime = DateAdd("n", 90, Now)
End If
DelaySend = False 'Reset DelaySend to False
End Sub
如果您想做其他事情,可以考虑使用此处显示的过程捕获新电子邮件:Capture New Emails
然后您将能够想出一些方法来存储已打开的电子邮件以及它们是否已设置为“延迟发送”状态,但是像这样功能齐全的应用程序超出了此答案的范围。
编辑:查看此问题以了解如何与当前打开的电子邮件Current Email 进行交互,然后修改以设置延迟传递标志。