• Outlook User
  • New Outlook app
  • Outlook.com
  • Outlook Mac
  • Outlook & iCloud
  • Developer
  • Microsoft 365 Admin
    • Common Problems
    • Microsoft 365
    • Outlook BCM
    • Utilities & Addins

Delay Delivery of Messages Sent at Specific Times

Slipstick Systems

› Developer › Code Samples › Delay Delivery of Messages Sent at Specific Times

Last reviewed on February 13, 2018     55 Comments

An Outlook user, KT, wanted to defer delivery of messages sent after 6PM, sending them at 7 AM the next day. This is possible to do using an ItemSend macro.
defer messages

If it's after 6PM or before 7AM, the message is held until 7AM, then sent. Because this is an Outlook script, it only works in Outlook. It will not affect messages sent using smartphones or other devices.

"Set a default 'Do not Deliver before' time" and "To delay sending a message in Outlook"

May 6 2017: Edited the macros to properly move early morning messages ahead a few hours, not 1 day and to account for messages sent Sat or Sun.

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)

' If after 6PM
  If Now() > DateSerial(Year(Now), Month(Now), Day(Now)) + #5:59:00 PM# Then
    SendAt = DateSerial(Year(Now), Month(Now), Day(Now) + 1) + #7:00:00 AM#
' If before 7AM
  ElseIf Now() < DateSerial(Year(Now), Month(Now), Day(Now)) + #6:59:00 AM# Then
    SendAt = DateSerial(Year(Now), Month(Now), Day(Now)) + #7:00:00 AM#
  End If
 Item.DeferredDeliveryTime = SendAt

End Sub

If you need to skip weekends (or other days of the week), check the name of the day and add additional time to the SendAt time.

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
Dim dayname As String

' If after 6PM
  If Now() > DateSerial(Year(Now), Month(Now), Day(Now)) + #5:59:00 PM# Then
    sendat = DateSerial(Year(Now), Month(Now), Day(Now) + 1) + #7:00:00 AM#
' If before 7AM
  ElseIf Now() < DateSerial(Year(Now), Month(Now), Day(Now)) + #6:59:00 AM# Then
    sendat = DateSerial(Year(Now), Month(Now), Day(Now)) + #7:00:00 AM#
' We'll test the date of all messages
 ElseIf WeekdayName(Weekday(Now())) = "Saturday" Or WeekdayName(Weekday(Now())) = "Sunday" Then
   ' this will be changed by the next part if a weekend
   sendat = DateSerial(Year(Now), Month(Now), Day(Now)) + #11:00:00 PM#
 End If

dayname = WeekdayName(Weekday(sendat))

Select Case dayname
Case "Saturday"
    sendat = DateSerial(Year(Now), Month(Now), Day(Now) + 2) + #7:00:00 AM#
Case "Sunday"
    sendat = DateSerial(Year(Now), Month(Now), Day(Now) + 1) + #7:00:00 AM#
End Select
    Item.DeferredDeliveryTime = sendat
Debug.Print Now(), dayname, sendat

End Sub

Only Delay message Sent to Specific Addresses

Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)

Const PR_SMTP_ADDRESS As String = "http://schemas.microsoft.com/mapi/proptag/0x39FE001E"

Set recips = Item.Recipients
 For Each recip In recips
 Set pa = recip.PropertyAccessor
 
 Address = LCase(pa.GetProperty(PR_SMTP_ADDRESS))
 lLen = Len(Address) - InStrRev(Address, "@")

 Select Case Right(Address, lLen)
' add additional addresses as neeed, using quotes and comma separator
    Case "mcarnar@domain.com", "bburns@domain.com", "rchildars@domain.com", "curry@domain.com"
         
    Case Else ' remove case else line to be warned when sending to the addresses
     strMsg = strMsg & " " & Address & vbNewLine
 End Select
 Next

' using <> delays these addresses only; 
' use = to delay all but these addresses

If strMsg <> "" Then
' If after 6PM
  If Now() > DateSerial(Year(Now), Month(Now), Day(Now)) + #5:59:00 PM# Then
    SendAt = DateSerial(Year(Now), Month(Now), Day(Now) + 1) + #7:00:00 AM#
' If before 7AM
  ElseIf Now() < DateSerial(Year(Now), Month(Now), Day(Now)) + #6:59:00 AM# Then
    SendAt = DateSerial(Year(Now), Month(Now), Day(Now)) + #7:00:00 AM#
  End If
Item.DeferredDeliveryTime = SendAt
 
End If
End Sub

How to use the macro

First: You will need macro security set to low during testing.

To check your macro security in Outlook 2010 or 2013, go to File, Options, Trust Center and open Trust Center Settings, and change the Macro Settings. In Outlook 2007 and older, it’s at Tools, Macro Security. If Outlook tells you it needs to be restarted, close and reopen Outlook. Note: after you test the macro and see that it works, you can either leave macro security set to low or sign the macro.

Now open the VBA Editor by pressing Alt+F11 on your keyboard.

To use the macro code in ThisOutlookSession:

  1. Expand Project1 and double click on ThisOutlookSession.
  2. Copy then paste the macro into ThisOutlookSession. (Click within the code, Select All using Ctrl+A, Ctrl+C to copy, Ctrl+V to paste.)
    macro in the VBA editor

More information as well as screenshots are at How to use the VBA Editor.

Delay Delivery of Messages Sent at Specific Times was last modified: February 13th, 2018 by Diane Poremsky
Post Views: 71

Related Posts:

  • Set a default 'Do not Deliver before' time
  • Add Attachments and Set Email Fields During a Mail Merge
  • Create Outlook appointments using multiple recurring patterns
  • Create a deferred Birthday message for an Outlook Contact

About Diane Poremsky

A Microsoft Outlook Most Valuable Professional (MVP) since 1999, Diane is the author of several books, including Outlook 2013 Absolute Beginners Book. She also created video training CDs and online training classes for Microsoft Outlook. You can find her helping people online in Outlook Forums as well as in the Microsoft Answers and TechNet forums.

Comments

  1. Victor Ivanidze says

    December 11, 2021 at 12:55 pm

    There exists the add-in for Outlook named OffHours that ensures that emails you write after business hours and on weekends are delayed and will only be sent at the start of the next business day: https://www.ivasoft.com/offhoursaddin.shtml

    Reply
  2. Adam says

    January 8, 2021 at 11:20 am

    This is super - thank you so much! All our student email addresses start with "ST0000". I would like to delay delivery to students only between 3pm-8:30am and at weekends for any emails sent to to addresses beginning with/containing "ST0000". Would this be possible? My knowledge of VBA is relatively basic.

    Reply
  3. Ahmad Banki says

    December 7, 2020 at 2:10 am

    Hi Diane & thanks a lot. Two questions:

    1. I tried the code for deferring the weekends, but it doesn't seem to work. I don't get an error message, but when I send something between 8AM-6PM on a weekend, it still gets sent.
    2. About the recipient not seeing the exact time when I wrote the message, you referred to https://www.slipstick.com/developer/send-email-outlook-reminders-fires/#draft, but is this something to do for every message separately? Or is there a universal formula which would apply to all message? Basically I want the time which appears on the message (to the recipient) to be the 7 AM as opposed to the evening/midnight!

    Thanks again.

    Reply
    • Diane Poremsky says

      December 7, 2020 at 10:14 am

      On the sent time macro - the one in your links sends all drafts when the reminder fires. I have similar macro that would sends drafts at different times. You put the time you want to send them messages in the subject and the macro runs on s schedule - anything with a date older than that will be sent when the macro runs.

      This gives me an idea - instead of looking at the subject, add a defer until time and look at that in the draft. Off to find the macro and tweak it. :)

      Reply
  4. Jean-Marc says

    September 20, 2020 at 4:11 am

    Thank you so much Diane. Your post did exactly what I needed.

    It was a while since Dom asked two years ago about SendAt not being defined. The trick is to define SendAt like this:
    Dim SendAt As Date

    The problem is caused by Option Explicit at the top (which is a good idea and should not be removed according to me)

    Reply
  5. Evaristo says

    July 26, 2020 at 9:33 am

    Would this be a good way to address the issues of sending e-mails on Friday and Saturday from 6PM to 11:59PM?

    Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    Dim dayname As String
     
    ' If Friday after 6PM
    If WeekdayName(Weekday(Now())) = "Friday" And Now() > DateSerial(Year(Now), Month(Now), Day(Now)) + #5:59:00 PM# Then
    sendat = DateSerial(Year(Now), Month(Now), Day(Now) + 3) + #8:00:00 AM#
     
    ' If Saturday
    ElseIf WeekdayName(Weekday(Now())) = "Saturday" Then
    sendat = DateSerial(Year(Now), Month(Now), Day(Now) + 2) + #8:00:00 AM#
     
    ' If Sunday
    ElseIf WeekdayName(Weekday(Now())) = "Sunday" Then
    sendat = DateSerial(Year(Now), Month(Now), Day(Now) + 1) + #8:00:00 AM#
     
    ' If other week days after 6PM
     ElseIf Now() > DateSerial(Year(Now), Month(Now), Day(Now)) + #5:59:00 PM# Then
       sendat = DateSerial(Year(Now), Month(Now), Day(Now) + 1) + #8:00:00 AM#
    ' If other week days before 8AM
     ElseIf Now() < DateSerial(Year(Now), Month(Now), Day(Now)) + #7:59:00 AM# Then
       sendat = DateSerial(Year(Now), Month(Now), Day(Now)) + #8:00:00 AM#
    End If
     
       Item.DeferredDeliveryTime = sendat
     
    End Sub

    Reply
    • Diane Poremsky says

      December 7, 2020 at 8:56 am

      That should work. (I didn't test it though - but it looks good.)

      Reply
  6. Jaime Uribe says

    May 24, 2020 at 9:16 pm

    Hi. It helped me a lot. Thank you

    Reply
  7. Jamie says

    May 23, 2020 at 9:11 am

    Hi Diane, I am just starting out with Macros -- have never had to do this before. This is exactly what I am looking for. I'm using Outlook 2016. Even though I copy/paste this macro into ThisOutlookSession, when I hit play, it brings up the Macros dialog box (with run, cancel, step intro) and there is nothing to select there. I am missing a step somehow. What am I doing wrong?

    Reply
    • Jamie says

      May 24, 2020 at 9:27 am

      THis is my comment- Please reject it because it is awaiting moderation -- it seems to be working now -- I have a different question that I am going to post in your forums, which I just saw now.

      Reply
  8. Andi says

    January 12, 2020 at 2:42 am

    Hi Diane,

    Thanks a lot for the great article. It is a bit older, but I still have a question. I tried your macro and it works perfectly, but the time the email is sent is still the time when I hit send. Meaning the receipient sees the time when I actually sent the message. Is there a way to set the time displayed in the message header to match the time it actually leaves my outbox or at least when the timer expires?

    Thanks a lot,

    Best Regards
    Andreas

    Reply
    • Diane Poremsky says

      January 13, 2020 at 12:47 am

      No, not using this method. If you use an appointment reminder to trigger the send, it will have the current time. The reminder will trigger a macro that sends a draft.

      https://www.slipstick.com/developer/send-email-outlook-reminders-fires/#draft

      Reply
  9. Nanette Kalisvaart says

    November 26, 2019 at 12:55 am

    Hi Diane,

    First off, thanks so much for this article; a huge timesaver!
    My next challenge is that I want to make certain people an exeption, is this possible?

    Thank you in advance.

    Kind regards,
    Nanette Kalisvaart (Netherlands)

    Reply
    • Diane Poremsky says

      November 26, 2019 at 1:25 am

      The macro for 'Only Delay message Sent to Specific Addresses' can be switched around to delay all except those sent to certain people.

      Reply
  10. Daniel says

    December 15, 2018 at 1:15 pm

    Thank you for the macros! I have a questions on how to deal with exceptions. How would I send a macro delayed e-mail immediately if I did not want a particular e-mail to be delayed?

    Reply
    • Diane Poremsky says

      December 15, 2018 at 10:56 pm

      You'd use an IF statement. I usually recommend using a category or keyword in the subject. The importance field works too.

      If item.categories = "Send Now" then
      item.categories =""
      exit sub
      end if
      ' code to set delay here

      to use a keyboard the if would look something like this
      if left(case(item.subject,6) = "[send]" then
      item.subject = right(item.subject, len(item.subject) - 7)
      ' delay macro
      end if

      Reply
  11. Dom says

    November 8, 2018 at 11:08 am

    Hi,
    Sorry to open an old thread but I'm struggling to get this to work

    this is my code:

    Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)

    Dim dayname As String

    If Now() > DateSerial(Year(Now), Month(Now), Day(Now)) + #5:59:00 PM# Then
    SendAt = DateSerial(Year(Now), Month(Now), Day(Now) + 1) + #7:00:00 AM#

    ElseIf Now() < DateSerial(Year(Now), Month(Now), Day(Now)) + #6:59:00 AM# Then SendAt = DateSerial(Year(Now), Month(Now), Day(Now)) + #7:00:00 AM#

    End If

    ' We'll test the date of all messages
    ElseIf WeekdayName(Weekday(Now())) = "Saturday" Or WeekdayName(Weekday(Now())) = "Sunday" Then
    ' this will be changed by the next part if a weekend
    SendAt = DateSerial(Year(Now), Month(Now), Day(Now)) + #11:00:00 PM#
    End If

    dayname = WeekdayName(Weekday(SendAt))

    Select Case dayname
    Case "Saturday"
    SendAt = DateSerial(Year(Now), Month(Now), Day(Now) + 2) + #7:00:00 AM#
    Case "Sunday"
    SendAt = DateSerial(Year(Now), Month(Now), Day(Now) + 1) + #7:00:00 AM#
    End Select

    Debug.Print Now(), dayname, SendAt

    Item.DeferredDeliveryTime = SendAt
    End Sub
    ------------------------------------------------

    Results in:
    Compile Error: Variable not defined

    SendAt =

    ------------------------------------------------

    Reply
    • Diane Poremsky says

      November 10, 2018 at 12:27 am

      add Dim SendAt after dim dayname.

      Reply
      • Dom says

        January 3, 2019 at 9:33 am

        Thanks that helped but now got another issue.
        Whenever I try and send any email I get
        Run-time error '13':
        Type mismatch

        which highlights: "dayname = WeekdayName(Weekday(SendAt))"

      • Diane Poremsky says

        January 8, 2019 at 12:56 am

        did you customize any of the macro? It's working here without an error, which makes it hard to troubleshoot.

        The error appears to say that dayname variable, or possibly sendat, contains the wrong type of data.

      • Dom says

        January 11, 2019 at 1:25 pm

        Hi Diane, I really appreciate the help.
        I have modified slightly as was finding my outlook was thinking today was Saturday when in fact it's Friday so amended to include System Date which when Msgbox shows the correct date.

        My problem now is it now just sends the email regardless. Seems I do 1 thing and it creates another issue.
        (Code attached)

  12. Denise Shitara says

    August 11, 2017 at 5:35 pm

    Is there a way to include e-mails sent on Fridays after 18h in the weekend delay rule?

    Reply
    • Diane Poremsky says

      August 12, 2017 at 12:04 am

      Try
      ElseIf WeekdayName(Weekday(Now())) = "Friday" AND Now() > DateSerial(Year(Now), Month(Now), Day(Now)) + #5:59:00 PM#

      Reply
      • Alba says

        March 22, 2019 at 3:28 pm

        Hi Diane, thanks so much for that useful code, it's amazing. I was also trying to amend the Friday after 6pm thing so email would be sent on Monday morning, and added this:

        ' If Friday after 6PM
        ElseIf WeekdayName(Weekday(Now())) = "Friday" And Now() > DateSerial(Year(Now), Month(Now), Day(Now)) + #5:59:00 PM# Then
        sendat = DateSerial(Year(Now), Month(Now), Day(Now) + 3) + #8:00:00 AM#

        However it does not work, now it's friday after 6 and the emails are deferred until Sat morning. Any hints?

        Thanks in advance!!
        Alba

      • charles ranni says

        March 9, 2020 at 2:23 am

        you couldnt put the friday check as an else if, it would need to go before checking other days. Otherwise the first if that checks whether it's after 6pm fires true and you won't ever get to see the else if for fridays. . . just start with the friday check and make the part that says if say else if now. Easy Peasy.

  13. Bertil says

    July 2, 2017 at 1:34 am

    Hi
    I use mail merge and want each message to be sent with eg15 sec delay.
    First message with 15 sec delay, next with 30 sec delay and so on.
    Is that possible?
    Regards
    Bertil

    Reply
    • Diane Poremsky says

      July 2, 2017 at 11:54 am

      It is if you use a macro to set a deferred delivery time. Send at = now + 15 seconds (needs to be properly formatted ) then update sendat after each message.

      Reply
      • William says

        July 11, 2017 at 4:05 am

        Hi Diane,

        Could you please provide code for this. It would be great helpful for our projecct.

        Regards,
        William

      • Diane Poremsky says

        July 13, 2017 at 1:26 am

        i have a sample somewhere that i tried for my own use - honestly, it doesn't work that great but i will see if i can find it.

      • Diane Poremsky says

        July 13, 2017 at 1:42 am

        this is one way - the only prolem is by the end of the day, the delay will be long. I had a different one that used a random delay from 'now' all it really did was push the pile back - it didn't solve the reason for wanting a delay in the first place.
        Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
        SendAt = Now + delay
        Item.DeferredDeliveryTime = SendAt
        delay = delay + 15 / 86400
        End Sub

  14. PSingh says

    May 6, 2017 at 9:15 am

    Hi Diana,

    Firstly thanks for the macro.

    I am getting this problem where my email is delayed one day further if the emails are sent after 12am. That means the delay is for 1day and 7hrs instead of 7hrs only. could you please help. Also could you please include the weekend delay along with the evening to morning delay. Many thanks

    Reply
    • Diane Poremsky says

      May 6, 2017 at 9:27 am

      oh... is see the problem - if before 6AM, the delay is the same as if after 5pm.
      If Now() > DateSerial(Year(Now), Month(Now), Day(Now)) + #5:59:00 PM# _
      Or Now() < DateSerial(Year(Now), Month(Now), Day(Now)) + #6:59:00 AM# Then
      sendat = DateSerial(Year(Now), Month(Now), Day(Now) + 1) + #7:00:00 AM#
      End If

      Reply
    • Diane Poremsky says

      May 6, 2017 at 9:32 am

      Try this - i thought there was a reason why i OR'd them to gether but don't recall what that was. if it's after 5, it won't be before 6, so it should work. (Can't believe no one asked about that earlier. Thanks)

      If Now() > DateSerial(Year(Now), Month(Now), Day(Now)) + #5:59:00 PM# Then
      SendAt = DateSerial(Year(Now), Month(Now), Day(Now) + 1) + #7:00:00 AM#
      End If

      If Now() < DateSerial(Year(Now), Month(Now), Day(Now)) + #6:59:00 AM# Then SendAt = DateSerial(Year(Now), Month(Now), Day(Now)) + #7:00:00 AM# End If Item.DeferredDeliveryTime = SendAt

      Reply
      • Diane Poremsky says

        May 6, 2017 at 9:37 am

        making the same change to the top of the weekend version would work there too (if it works here) because you check the sendat date after setting it.

        ETA: way too early for me today... the weekend only checks times at either end of the day, not all day. Need to fix that part.

    • Diane Poremsky says

      May 6, 2017 at 9:50 am

      It's fixed now (I think - works here for Sat. in a quickie test)

      Reply
  15. Fais says

    March 19, 2017 at 7:14 pm

    Hi Diane
    Thank you for this great article.
    How i can use this script on a large scale to set an outgoing delay for 5 minutes?
    Thank you

    Reply
    • Diane Poremsky says

      March 19, 2017 at 11:35 pm

      not sure what you mean by large scale, but to delay all mail 5 min, you can use a rule to delay delivery for 5 min (up to 120 min.)

      To use a script, remove the IF lines and set the sendat time to now + 5 minutes:
      SendAt = now + 5/1440 ' or now + 0.003472
      Item.DeferredDeliveryTime = SendAt

      End Sub

      Reply
  16. Lauren Rollins says

    March 2, 2017 at 10:36 pm

    Hi, I was trying to prevent delivery to a list of specific recipients, and I used a combination of the macro you displayed above in the article and a the piece in the comments from Bafocx. My hours are a little different (8PM & 7AM), but when I send an email it still delays the delivery to any recipient. Can you help with the specific user portion of the macro? I am sure I have something entered incorrectly.

    Sub UOL()
    Dim objMsg As MailItem

    Set objMsg = Application.CreateItem(olMailItem)

    With objMsg
    .To = "mcarnar@domain.com"
    .CC = "mcarnar@domain.com"
    .BCC = "mcarnar@domain.com"
    .To = "bburns@domain.com"
    .CC = "bburns@domain.com"
    .BCC = "bburns@domain.com"
    .To = "rchildars@domain.com"
    .CC = "rchildars@domain.com"
    .BCC = "rchildars@domain.com"
    .To = "acrawford@domain.com"
    .CC = "acrawford@domain.com"
    .BCC = "acrawford@domain.com"
    .To = "acurry@domain.com"
    .CC = "acurry@domain.com"
    .BCC = "acurry@domain.com"
    .To = "fharnanda@domain.com"
    .CC = "fharnanda@domain.com"
    .BCC = "fharnanda@domain.com"
    .To = "bburawic@domain.com"
    .CC = "bburawic@domain.com"
    .BCC = "bburawic@domain.com"
    .Display
    End With

    Set objMsg = Nothing

    End Sub

    Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)

    If Now() > DateSerial(Year(Now), Month(Now), Day(Now)) + #7:59:00 PM# _
    Or Now() < DateSerial(Year(Now), Month(Now), Day(Now)) + #6:59:00 AM# Then
    SendAt = DateSerial(Year(Now), Month(Now), Day(Now) + 1) + #7:00:00 AM#
    Item.DeferredDeliveryTime = SendAt
    End If

    End Sub

    Reply
    • Diane Poremsky says

      March 6, 2017 at 1:10 am

      This - is just creating a new message with those addresses.
      With objMsg
      .To = "mcarnar@domain.com"
      .CC = "mcarnar@domain.com"
      -- snip --

      add this to that macro, right before display, to delay the message. This will apply to every message you create using this macro.
      -- snip --
      SendAt = DateSerial(Year(Now), Month(Now) + 1, Day(5)) + #10:00:00 AM#
      .DeferredDeliveryTime = SendAt
      .Display
      End With

      if you want to delay all messages EXCEPT those sent to certain addresses, you need to change the address in the ItemSend macro. It will use a method similar to what is used in macros on this page - https://www.slipstick.com/how-to-outlook/prevent-sending-messages-to-wrong-email-address but because you have several addresses to check, it will be easier to use an arrary (unless that is everyone in your company, then you just check for domain).

      This should work -

      Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)

      Const PR_SMTP_ADDRESS As String = "http://schemas.microsoft.com/mapi/proptag/0x39FE001E"

      Set recips = Item.Recipients
      For Each recip In recips
      Set pa = recip.PropertyAccessor

      Address = LCase(pa.GetProperty(PR_SMTP_ADDRESS))
      lLen = Len(Address) - InStrRev(Address, "@")

      Select Case Right(Address, lLen)
      Case "mcarnar@domain.com", "bburns@domain.com", "rchildars@domain.com", "curry@domain.com"

      Case Else ' remove case else line to be warned when sending to the addresses
      strMsg = strMsg & " " & Address & vbNewLine
      End Select
      Next

      ' delays these addresses only;
      ' use = to delay all but these addresses

      If strMsg <> "" Then
      If Now() > DateSerial(Year(Now), Month(Now), Day(Now)) + #7:59:00 PM# _
      Or Now() < DateSerial(Year(Now), Month(Now), Day(Now)) + #6:59:00 AM# Then SendAt = DateSerial(Year(Now), Month(Now), Day(Now) + 1) + #7:00:00 AM# Item.DeferredDeliveryTime = SendAt End If End If End Sub

      Reply
  17. Kevin says

    November 12, 2016 at 6:49 pm

    I am trying to use the second macro so that, as I understand, all emails after 6 will be delayed to the next day and all emails on the weekend will be delayed to Monday. When I paste the macro in VBA and press the run button, a window pops up and request the macro name. i cannot figure out how to get past this point and the delay is not working.

    Reply
    • Diane Poremsky says

      February 6, 2017 at 1:23 am

      This macro isn't run manually. It's an automatic macro that runs when you hit send.

      Reply
  18. Heather says

    October 22, 2016 at 12:34 am

    First off thank you SO much!!! I love the delay from the evening to the morning!!! I was wondering is there a way to only send on the next morning for weekdays? I'm trying to reduce the stress from my staff by not having emails show up on a weekend if possible. Thank you in advance for your guidance! You're help is SO much appreciated

    Reply
    • Diane Poremsky says

      October 22, 2016 at 1:14 am

      I added a second macro to the page that includes a day of week check and moves it forward to monday.

      Reply
  19. Magnus says

    August 17, 2016 at 1:16 am

    First of all, thank you. Secondly I have an issue with emails sent in the morning using this macro. An email i try to send 06:00 AM is stuck in Draft until the next day at 07:00 AM. Did some testing and figured out it is because of the Day(Now) + 1 in the SendAt line but I am far too inexperienced to know if I can just remove + 1 or is there a better solution?

    Reply
    • Diane Poremsky says

      August 17, 2016 at 1:22 am

      Oh... I missed that (the person who wanted it was more concerned about evenings) - If you remove the 1, evening messages won't send the next day. it needs to be split into two sets of If statements.

      If Now() > DateSerial(Year(Now), Month(Now), Day(Now)) + #5:59:00 PM# then
      SendAt = DateSerial(Year(Now), Month(Now), Day(Now) + 1) + #7:00:00 AM#
      elseif Now() < DateSerial(Year(Now), Month(Now), Day(Now)) + #6:59:00 AM# Then SendAt = DateSerial(Year(Now), Month(Now), Day(Now)) + #7:00:00 AM# end if

      Reply
  20. Bafocx says

    June 27, 2016 at 1:19 pm

    Is there a way to create an email and delay it for a period of time? I'm trying to use your code but it's for all new messages.
    I'm using this macro but I want to be applied only on the email I choose.

    Sub UOL()
    Dim objMsg As MailItem

    Set objMsg = Application.CreateItem(olMailItem)

    With objMsg
    .To = "thebestboy_10@hotmail.com"
    .CC = "thebestboy_10@hotmail.com"
    .BCC = "thebestboy_10@hotmail.com"
    .Display
    End With

    Set objMsg = Nothing

    End Sub
    Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)

    If Now() > DateSerial(Year(Now), Month(Now), Day(Now)) Then
    SendAt = DateSerial(Year(Now), Month(Now) + 1, Day(5)) + #10:00:00 AM#
    Item.DeferredDeliveryTime = SendAt
    End If

    End Sub

    Thanks in advance

    Reply
    • Diane Poremsky says

      July 6, 2016 at 10:22 am

      add .DeferredDeliveryTime before .display in the first macro - this will send the message created by the UOL macro at 10AM on the 5th of next month.


      SendAt = DateSerial(Year(Now), Month(Now) + 1, Day(5)) + #10:00:00 AM#
      .DeferredDeliveryTime = SendAt

      Reply
  21. Bafocx says

    June 25, 2016 at 2:00 pm

    Can this be programm for an specific day an hour? what should I change?

    Reply
    • Diane Poremsky says

      July 6, 2016 at 2:37 pm

      Yes, it can use a specific day and hour - this should work -
      SendAt = #7/15/2016 7:00:00 AM#

      Reply
  22. Jim says

    May 24, 2016 at 10:33 am

    Can this be used with Outlook.com so I don't have to leave my computer on to send the mail? I have mail that goes out at 3 a.m. and would prefer not to leave it on while I travel. Thanks.

    Reply
    • Diane Poremsky says

      June 19, 2016 at 12:50 am

      No, you cant use it with outlook.com and turn the computer off as outlook.com doesn't use online mode, only cached mode. Cached mode requires you to keep outlook open to hand off the message.

      Reply
  23. len raphael says

    April 7, 2016 at 1:15 pm

    Unrelated but related to timing of sending: created a rule to delay sending all emails for one minute to give me time to reconsider hasty emailing. Amazing how we've all come to expect instant emails. The one minute minimum delay is way too long for in house emails and even too long for outsiders. Is there a way to create say a 15 second delay?

    Reply
    • Diane Poremsky says

      April 7, 2016 at 5:12 pm

      try this on test messages - .00015 should be about 15 seconds. when you are happy with the setting, remove the item.subject and item.save lines - they just make it easier to check the timing.
      Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)

      sendat = Now + 0.00015
      Item.Subject = Item.Subject & " Defer:" & sendat & " Now:" & Now
      Item.Save
      Item.DeferredDeliveryTime = sendat

      End Sub

      Reply
      • Diane Poremsky says

        April 7, 2016 at 5:30 pm

        btw, I've never timed the one minute rule with a stop watch, but the 15 sec delay takes anywhere from 2 seconds to 1 minute to send on my test exchange mailbox. I suspect Outlook ignores the seconds and sends it when the next minute rolls over. This might be a little faster than the minute rule, but not by much.

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Visit Slipstick Forums.
What's New at Slipstick.com

Latest EMO: Vol. 31 Issue 7

Subscribe to Exchange Messaging Outlook






Support Services

Do you need help setting up Outlook, moving your email to a new computer, migrating or configuring Office 365, or just need some one-on-one assistance?

Our Sponsors

CompanionLink
ReliefJet
  • Popular
  • Latest
  • Week Month All
  • Use Classic Outlook, not New Outlook
  • How to Remove the Primary Account from Outlook
  • Reset the New Outlook Profile
  • Disable "Always ask before opening" Dialog
  • This operation has been cancelled due to restrictions
  • Change Outlook's Programmatic Access Options
  • How to Hide or Delete Outlook's Default Folders
  • Removing Suggested Accounts in New Outlook
  • Shared Mailboxes and the Default 'Send From' Account
  • Use Public Folders In new Outlook
  • Sync Issues and Errors with Gmail and Yahoo accounts
  • Error Opening iCloud Appointments in Classic Outlook
  • Opt out of Microsoft 365 Companion Apps
  • Mail Templates in Outlook for Windows (and Web)
  • Urban legend: Microsoft Deletes Old Outlook.com Messages
  • Buttons in the New Message Notifications
  • Move Deleted Items to Another Folder Automatically
  • Open Outlook Templates using PowerShell
  • Count and List Folders in Classic Outlook
  • Google Workspace and Outlook with POP Mail
Ajax spinner

Recent Bugs List

Microsoft keeps a running list of issues affecting recently released updates at Fixes or workarounds for recent issues in classic Outlook (Windows).

For new Outlook for Windows: Fixes or workarounds for recent issues in new Outlook for Windows .

Outlook for Mac Recent issues: Fixes or workarounds for recent issues in Outlook for Mac

Outlook.com Recent issues: Fixes or workarounds for recent issues on Outlook.com

Office Update History

Update history for supported Office versions is at Update history for Office

Outlook Suggestions and Feedback

Outlook Feedback covers Outlook as an email client, including Outlook Android, iOS, Mac, and Windows clients, as well as the browser extension (PWA) and Outlook on the web.

Outlook (new) Feedback. Use this for feedback and suggestions for Outlook (new).

Use Outlook.com Feedback for suggestions or feedback about Outlook.com accounts.

Other Microsoft 365 applications and services




New Outlook Articles

Sync Issues and Errors with Gmail and Yahoo accounts

Error Opening iCloud Appointments in Classic Outlook

Opt out of Microsoft 365 Companion Apps

Mail Templates in Outlook for Windows (and Web)

Urban legend: Microsoft Deletes Old Outlook.com Messages

Buttons in the New Message Notifications

Move Deleted Items to Another Folder Automatically

Open Outlook Templates using PowerShell

Count and List Folders in Classic Outlook

Google Workspace and Outlook with POP Mail

Newest Code Samples

Open Outlook Templates using PowerShell

Count and List Folders in Classic Outlook

Insert Word Document into Email using VBA

Warn Before Deleting a Contact

Use PowerShell to Delete Attachments

Remove RE:, FWD:, and Other Prefixes from Subject Line

Change the Mailing Address Using PowerShell

Categorize @Mentioned Messages

Send an Email When You Open Outlook

Delete Old Calendar Events using VBA

VBA Basics

How to use the VBA Editor

Work with open item or selected item

Working with All Items in a Folder or Selected Items

VBA and non-default Outlook Folders

Backup and save your Outlook VBA macros

Get text using Left, Right, Mid, Len, InStr

Using Arrays in Outlook macros

Use RegEx to extract message text

Paste clipboard contents

Windows Folder Picker

Custom Forms

Designing Microsoft Outlook Forms

Set a custom form as default

Developer Resources

Developer Resources

Developer Tools

VBOffice.net samples

SlovakTech.com

Outlook MVP David Lee

Repair PST

Convert an OST to PST

Repair damaged PST file

Repair large PST File

Remove password from PST

Merge Two Data Files

Sync & Share Outlook Data

  • Share Calendar & Contacts
  • Synchronize two computers
  • Sync Calendar and Contacts Using Outlook.com
  • Sync Outlook & Android Devices
  • Sync Google Calendar with Outlook
  • Access Folders in Other Users Mailboxes

Diane Poremsky [Outlook MVP]

Make a donation

Mail Tools

Sending and Retrieval Tools

Mass Mail Tools

Compose Tools

Duplicate Remover Tools

Mail Tools for Outlook

Online Services

Calendar Tools

Schedule Management

Calendar Printing Tools

Calendar Reminder Tools

Calendar Dates & Data

Time and Billing Tools

Meeting Productivity Tools

Duplicate Remover Tools

Productivity

Productivity Tools

Automatic Message Processing Tools

Special Function Automatic Processing Tools

Housekeeping and Message Management

Task Tools

Project and Business Management Tools

Choosing the Folder to Save a Sent Message In

Run Rules on messages after reading

Help & Suggestions

Submit Outlook Feature Requests

Slipstick Support Services

Buy Microsoft 365 Office Software and Services

Visit Slipstick Forums.

What's New at Slipstick.com

Home | Outlook User | Exchange Administrator | Office 365 | Outlook.com | Outlook Developer
Outlook for Mac | Common Problems | Utilities & Addins | Tutorials
Outlook & iCloud Issues | Outlook Apps
EMO Archives | About Slipstick | Slipstick Forums
Submit New or Updated Outlook and Exchange Server Utilities

Send comments using our Feedback page
Copyright © 2026 Slipstick Systems. All rights reserved.
Slipstick Systems is not affiliated with Microsoft Corporation.