Run a script rule: Autoreply using a template

Last reviewed on August 13, 2014   —  31 comments

This macro will reply to the person who sent the message. It includes the original message, any text entered by in the macro, plus the content of the template.

Because this is a run a script rule, all messages meeting the condition will be replied to, unlike the autoreply rule which is one message per Outlook session.

If you want to include the original subject, use (or add) item.subject to the .Subject field, otherwise, this should have most of the bases covered and point you in the right direction for things I didn't include. Remove the parts you don't need and you should be good to go....

Keep in mind that the original message is Item, from Item As Outlook.MailItem. oRespond is the message you are sending back. You need to use the Item fields if you want to include fields from the original message in the response.


Sub AutoReplywithTemplate(Item As Outlook.MailItem)
Dim oRespond As Outlook.MailItem

' Use this for a real reply
' Set oRespond = Item.Reply

' This sends a response back using a template
Set oRespond = Application.CreateItemFromTemplate("C:\path\to\template.oft")

With oRespond 
    .Recipients.Add Item.SenderEmailAddress
    .Subject = "Your Subject Goes Here"
    .HTMLBody = "Your reply text goes here." & vbCrLf & _
              "---- original body below ---" & vbCrLf & _ 
               Item.HTMLBody & vbCrLf & _ 
             "---- Template body below ---" & _ 
               vbCrLf & oRespond.HTMLBody

' includes the original message as an attachment
    .Attachments.Add Item

' use this for testing, change to .send once you have it working as desired
    .Display 
End With
Set oRespond = Nothing
End Sub

Reply to a web form generated message

If you want to reply to a person who fills out a web form but the email that is generated is from a generic email address, not their address, you can use RegEx to get the address.

Sub SendNew(Item As Outlook.MailItem)
   Dim Reg1 As Object
    Dim M1 As Object
    Dim M As Object
    Dim strAddress As String

Set Reg1 = CreateObject("VBScript.RegExp")

    With Reg1
       .Pattern = "(([\w-\.]*\@[\w-\.]*)\s*)"
       .IgnoreCase = True
       .Global = False
    End With

If Reg1.Test(Item.Body) Then
     
        Set M1 = Reg1.Execute(Item.Body)
        For Each M In M1
           strAddress = M.SubMatches(1)
        Next
    End If

 Dim objMsg As MailItem
 Set objMsg = Application.CreateItemFromTemplate("C:\path\to\template.oft")

 objMsg.Recipients.Add strAddress

 ' Copy the original message subject
 objMsg.Subject = "Thanks: " & Item.Subject

' use for testing 
 objMsg.display 

 ' objMsg.Send

 End Sub

 

Reply with a template

When you want to reply with a template, you need to "pick up" information from the selected message. This macro works with an open or selected item and needs the GetCurrentItem function found here. If you will only ever use it with selected items (or open items) you can change the code to use current item or selection. More information is available at Outlook VBA: work with open item or selected item.

Sub ReplywithTemplate()
Dim Item As Outlook.MailItem
Dim oRespond As Outlook.MailItem


' need function from http://slipstick.me/e8mio
Set Item = GetCurrentItem()

' This sends a response back using a template
Set oRespond = Application.CreateItemFromTemplate("C:\Test\template.oft")

With oRespond
    .Recipients.Add Item.SenderEmailAddress
    .subject = "Your Subject Goes Here"
    .HTMLBody = oRespond.HTMLBody & vbCrLf & _
              "---- original message below ---" & vbCrLf & _
               Item.HTMLBody & vbCrLf
               
' includes the original message as an attachment
    .Attachments.Add Item

' use this for testing, change to .send once you have it working as desired
    .Display
End With
Set oRespond = Nothing
End Sub

About Diane Poremsky

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.

Please post long or more complicated questions at Outlook forums by Slipstick.com.

31 responses to “Run a script rule: Autoreply using a template”

  1. Marlon

    is there a way to to "reply all" to multiple messages at once?

    1. Diane Poremsky

      You can use a rule and Run Rules Now. I recommend moving the messages you want to reply to, to a new folder and running the rule on that folder. You could also do it using VBA but I don't think I have any code samples that do it, so you'd need to write your own or tweak one I do have.

  2. jimdernie@gmail.com

    can you use a script to send auto replies to people automatically if you have posted an item in your outlook calendar and marked it as out of office?

    1. Diane Poremsky

      Yes, you can use a macro similar to Send an email when you add an appointment to your calendar to do that.

      you'd replace
      Item.Category <> "private" Then
      with
      Item.FreeBusyStatus <> "Out of Office" Then

  3. Avary

    THANK YOU!!!!!!! This helps me so much! I have been trying to figure out how to do this for several months. Your helpful post has helped me accomplish something I have been working on for several months. Thank you so much for this helpful information!

  4. Joseph

    I tried this for the "Out of Office" events but the script does not show up in the rules script selection window.

    1. Diane Poremsky

      Are you in the Out of Office screen or Rules & Alerts? These scripts do not work in Out of Office settings for Exchange Server, only Rules & Alerts.

  5. Joseph

    Rules and Alerts. I've also tried doing it without Rules and Alerts and just having the code in the ThisOutlookSession like you suggested above but that didn't work either.

  6. Joseph

    This is the current code I'm trying without using rules. I was hoping it would work with a calendar event marked at "out of office".

    Private WithEvents Items As Outlook.Items

    Private Sub Application_Startup()
    Dim Ns As Outlook.NameSpace
    Set Ns = Application.GetNamespace("MAPI")
    Set Items = Ns.GetDefaultFolder(olFolderCalendar).Items
    End Sub
    Private Sub Items_ItemAdd(ByVal Item As Object)
    On Error Resume Next

    If Item.Class = olAppointment And _
    Item.FreeBusyStatus = "Out of Office" Then

    Dim objMsg As MailItem
    Set objMsg = Application.CreateItem(olMailItem)

    objMsg.To = Item.SenderEmailAddress
    objMsg.Subject = Item.Subject
    objMsg.Body = "I am currently out of the office."

    'use Display instead of Send if you want to add a note before sending
    objMsg.Send

    Set objMsg = Nothing

    End If

    End Sub

    1. Diane Poremsky

      Did you restart outlook or click in the Application_startup macro and press Run (F8) ? You also need macro security set to low but... this isn't going to work as it applies only when the appointment is added to the calendar. You want to check the calendar and send an OOF without setting enabling the OOF option.

      You could use a rule, enabled by a macro that belongs to an appt marked OOF. Enable or disable an Outlook rule using reminders and VBA.

  7. Joseph

    and I've tried this code with a script in the rules but it did not send auto replies when my calendar event showed me as out of office:

    Sub AutoReplywhenOut(Item As Outlook.MailItem)
    Dim oRespond As Outlook.MailItem
    If Item.Class = olAppointment And _
    Item.Category = "Out of Office" Then

    oRespond
    .Recipients.Add Item.SenderEmailAddress
    .Subject.Add Item.Subject
    .HTMLBody = "I am currently out of the office" & vbCrLf & _
    "---- original body below ---" & vbCrLf & _
    Item.HTMLBody & vbCrLf & _
    "---- Template body below ---" & _
    vbCrLf & oRespond.HTMLBody

    ' use this for testing, change to .send once you have it working as desired
    .Send
    End If
    Set oRespond = Nothing
    End Sub

    1. Diane Poremsky

      This won't work for your purposes either. Sorry. I'll see what i can come up with that is better than using a reminder to turn a rule on.

  8. Joseph

    Rules and Alerts.

  9. Joseph

    Thank you for your help! I'm not sure it is possible at this point. Good luck!

    1. Diane Poremsky

      My initial thought is that it is not possible, but it will be interesting to look into doing it.

  10. Joseph

    Yes, it seems that the rules to send an automatic email when I'm out can not be tied to a calendar event. I guess because the calendar is kind of separate from the mail part of Outlook and they do not communicate.

    1. Diane Poremsky

      Yes, that is more or less correct.

  11. Rod

    Thanks for the great post. I am using your auto-reply with some changes to support our needs. I have verified that the rule is running and at one point it told me a macro was going to run and I chose "enable", so I think it is trying to run. However, it never displays anything and if I try to put a break point in, it doesn't hit it. Here's the code:

    **************
    Sub AutoReplyToLoginRequest(Item As Outlook.MailItem)
    Dim Reg1 As Object
    Dim M1 As Object
    Dim M As Object
    Dim strAddress As String

    Set Reg1 = CreateObject("VBScript.RegExp")

    With Reg1
    .Pattern = "(([\w-\.]*\@[\w-\.]*)\s*)"
    .IgnoreCase = True
    .Global = False
    End With

    If Reg1.Test(Item.Body) Then

    Set M1 = Reg1.Execute(Item.Body)
    For Each M In M1
    strAddress = M.SubMatches(1)
    Next
    End If

    Dim objMsg As MailItem
    Set objMsg = Application.CreateItem(olMailItem)

    objMsg.Recipients.Add strAddress

    ' Copy the original message subject
    objMsg.Subject = "Some Subject"
    objMsg.HTMLBody = "Some message"

    ' use for testing
    objMsg.Display

    'objMsg.Send

    End Sub

    **************
    Thoughts?

    1. Diane Poremsky

      In Outlook 2010 or 2013, go to File, Options, Trust Center - Macro Settings and verify macros are enabled. (Tools, Trust center in Outlook 2007) I think the problem is the permissions - after its working and you no longer need to edit it, you can set sign the macro using selfcert and set the macro security higher.

  12. Rod

    Thanks. That did indeed take care of it.

  13. Tuhin Banerjee

    I receive some 100 mails which i keep in a certain folder. I want to create a macro which will help me to send all the mails to the desired receipients (mails coming from the IDs) keeping a certain bunch of iDs in loop with a predefined templates. Pl help to resolve my query

    1. Diane Poremsky

      So you want to reply with template1 if ID1 and use template2 if from ID2? That is possible. You need to use either an if statement or select case to identify the id and call up the right template.

  14. kyle

    Is it possible to use the script at the top "Auto reply using a template" to only send the template the the person that is CC'd on the received email. In my case, I will get an autogenerated email from a system with the actual requester CC'd on the email, but I only need the template to be sent automatically to the CC'd individual and not the From address.

    I figured the line below is what I need to modify, but I do not know VBA to know what the CC'd area is so I can modify it.

    .Recipients.Add Item.SenderEmailAddress

    1. Diane Poremsky

      You need to up the recipients collection - put this before the With oRespond (i put it before the Set orespond line) and use .Recipients.Add recip
      Dim Recipients As Outlook.Recipients
      Dim oRecip As Recipient
      Dim recip As String

      Set Recipients = Item.Recipients
      For i = Recipients.Count To 1 Step -1
      Set oRecip = Recipients(i)
      If oRecip.Type = olCC Then
      recip = Recipients.Item(i).Address
      End If
      Next

  15. kyle

    Where would I put in the email address of the original sender in the code? I am also getting an error on the last line.
    .Display End With Set oRespond = Nothing End Sub

    Thanks for all the help.

    1. Diane Poremsky

      Replace the recipients.add line with
      .Recipients.Add recip

      What error are you getting?

  16. kyle

    Compile Error: Expected Expression.

    Here is the code I have so far. Like I said, I have not done VBA, but I am trying to learn, so I probalby messed it up pretty good.

    Sub AutoReplywithTemplate(Item As Outlook.MailItem)

    Dim oRespond As Outlook.MailItem
    ' Use this for a real reply
    ' Set oRespond = Item.Reply ' This sends a response back using a template
    Set oRespond = Application.CreateItemFromTemplate("C:\Users\ksmith23\AppData\Roaming\Microsoft\Templates\*.oft")
    .Recipients.Add recip
    Dim Recipients As Outlook.Recipients
    Dim oRecip As Recipient
    Dim recip As String

    Set Recipients = Item.Recipients
    For i = Recipients.Count To 1 Step -1
    Set oRecip = Recipients(i)
    If oRecip.Type = olCC Then
    recip = Recipients.Item(i).Address
    End If
    Next

    With oRespond
    .Recipients.Add Item.SenderEmailAddress
    .Subject = "Your Subject Goes Here"
    .HTMLBody = "Your reply text goes here." & vbCrLf & _
    "---- original body below ---" & vbCrLf & _
    Item.HTMLBody & vbCrLf & _
    "---- Template body below ---" & _
    vbCrLf & oRespond.HTMLBody
    ' includes the original message as an attachment .Attachments.Add Item
    ' use this for testing, change to .send once you have it working as desired
    .Display End With Set oRespond = Nothing End Sub

    1. Diane Poremsky

      It might be due to the missing line breaks here:.Display End With Set oRespond = Nothing End Sub
      it should be 4 lines:
      .Display
      End With
      Set oRespond = Nothing
      End Sub

  17. kyle

    That fixed the error. Thanks.

  18. kyle

    I try to debug the code and it seems it is not working at the .Recipients.add recip

    Here is what I have:

    Sub AutoReplywithTemplate(Item As Outlook.MailItem)

    Dim oRespond As Outlook.MailItem
    ' Use this for a real reply
    ' Set oRespond = Item.Reply
    ' This sends a response back using a template

    Set oRespond = Application.CreateItemFromTemplate("C:\Users\ksmith23\Desktop\RequesterEmail.oft")
    .Recipients.Add recip
    Dim Recipients As Outlook.Recipients
    Dim oRecip As Recipient
    Dim recip As String

    Set Recipients = Item.Recipients

    For i = Recipients.Count To 1 Step -1
    Set oRecip = Recipients(i)
    If oRecip.Type = olCC Then
    recip = Recipients.Item(i).Address
    End If
    Next

    With oRespond
    .Recipients.Add Item.SenderEmailAddress
    .Subject = "Your Subject Goes Here"
    .HTMLBody = "Your reply text goes here." & vbCrLf & _
    "---- original body below ---" & vbCrLf & _
    Item.HTMLBody & vbCrLf & _
    "---- Template body below ---" & _
    vbCrLf & oRespond.HTMLBody
    ' includes the original message as an attachment
    ' .Attachments.Add Item
    ' use this for testing, change to .send once you have it working as desired
    .Send
    End With
    Set oRespond = Nothing
    End Sub

    1. Diane Poremsky

      You need to replace Item.SenderEmailAddress with recip:
      .Recipients.Add Item.SenderEmailAddress
      becomes
      .Recipients.Add recip

Leave a Reply

If the Post Comment button disappears, press your Tab key.

This site uses XenWord.