【问题标题】:Delay Sending Mail延迟发送邮件
【发布时间】:2016-01-05 05:52:13
【问题描述】:

我正在尝试在“发送”按钮下设置 Outlook 宏,将 DeferredDeliveryTime 设置为当前时间加上 60 分钟。

我按了 Alt+F11,创建了一个模块并将其放在一个子中:

Sub delay_delivery(ByVal item As Object)
    Dim mailItem As MailFormat
    Set mailItem = item
    mailItem.DeferredDeliveryTime = DateAdd("n", 90, Now)
End Sub

并在快速访问工具栏中添加了指向宏的链接,但没有任何反应。

【问题讨论】:

    标签: vba outlook


    【解决方案1】:

    我认为您遇到的问题是您的程序永远不会得到“项目”。

    所以你的过程被定义为

     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 进行交互,然后修改以设置延迟传递标志。

    【讨论】:

    • 感谢 OpiesDad - 非常感谢。我选择了第一个选项,它很有魅力。弹出窗口支持键盘快捷键,因此发送电子邮件所需的额外时间最少。
    【解决方案2】:

    您不能将您的代码按原样放在 QAT 上。您必须在传递项目时调用此代码。

    在这个 Outlook 会话中:

    Private Sub Application_ItemSend(ByVal Item As Object, cancel As Boolean)
       Item.DeferredDeliveryTime = DateAdd("n", 60, Now)
    End Sub
    

    当您按下发送按钮时,正在发送的项目将是所需的参数。

    【讨论】:

    • 感谢您的回答 - 这解释了我遇到的问题和一个很好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 2012-06-26
    • 2018-01-17
    • 2010-10-08
    • 2011-07-01
    • 1970-01-01
    相关资源
    最近更新 更多