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
Autoreply to Reply To Address, Not Sender
If you use a web form that comes from a generic address with a Reply to address set, you can use a simple macro to Reply to the message. Unlike the autoreply rule which replies to the sender, this reply is the same as hitting the Reply button yourself.
Sub ReplytoReplyTo(Item As Outlook.MailItem) Dim oRespond As Outlook.MailItem Set oRespond = Item.Reply ' use for testing oRespond.Display ' oRespond.Send 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 and their address is not in the Reply to field, you can use RegEx to get the address from the message body.
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 fromhttp://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
Testing a Run a Script macro
To test the macros without sending yourself messages, select a message and run this macro. Don't forget to change YourMacroName to the macro name first.
Sub RunScript() Dim objApp As Outlook.Application Dim objItem As Object ' MailItem Set objApp = Application Set objItem = objApp.ActiveExplorer.Selection.Item(1) 'macro name you want to run goes here YourMacroName objItem End Sub
More Information
More Run a Script Samples:
- Autoaccept a Meeting Request using Rules
- Automatically Add a Category to Accepted Meetings
- Blocking Mail From New Top-Level Domains
- Convert RTF Messages to Plain Text Format
- Create a rule to delete mail after a number of days
- Create a Task from an Email using a Rule
- Create an Outlook Appointment from a Message
- Create Appointment From Email Automatically
- Delegates, Meeting Requests, and Rules
- Delete attachments from messages
- Forward meeting details to another address
- How to Change the Font used for Outlook's RSS Feeds
- How to Process Mail After Business Hours
- Keep Canceled Meetings on Outlook's Calendar
- Macro to Print Outlook email attachments as they arrive
- Move messages CC'd to an address
- Open All Hyperlinks in an Outlook Email Message
- Outlook AutoReplies: One Script, Many Responses
- Outlook's Rules and Alerts: Run a Script
- Process messages received on a day of the week
- Read Outlook Messages using Plain Text
- Receive a Reminder When a Message Doesn't Arrive?
- Run a script rule: Autoreply using a template
- Run a script rule: Reply to a message
- Run a Script Rule: Send a New Message when a Message Arrives
- Run Rules Now using a Macro
- Run-a-Script Rules Missing in Outlook
- Save all incoming messages to the hard drive
- Save and Rename Outlook Email Attachments
- Save Attachments to the Hard Drive
- Save Outlook Email as a PDF
- Sort messages by Sender domain
- Talking Reminders
- To create a rule with wildcards
- Use a Macro to Copy Data in an Email to Excel
- Use a Rule to delete older messages as new ones arrive
- Use a run a script rule to mark messages read
- Use VBA to move messages with attachments
Dan schwartz says
fantastic solutions. All I need now is specifying the email account to auto respond to?
Diane Poremsky says
Do you mean the which of your accounts in Outlook or which sender? Either can be controlled by a conditions in a rule.
alex says
Hey. How to make an auto reply to an email in the message body.
need to send to the mail where the field: EMAIL:
From: no-reply@test.com
Sent: Friday, September 13, 2009 12:11 PM
To: HR
Subject: summary job
Name: Alex
Телефон: 88002000600
Email: global@mail.com "they are always different"
Sripathi says
Hi,
Is it possible to do auto forward a mail when outlook is off (system is shutdown) based on some conditions? Not all the mails.
Thanks
Diane Poremsky says
Only if you use an Exchange mailbox and can set up a server side rule to handle it.
Vishal says
Hi, I am trying to retrieve "date" from the Subject Line.
For Ex : if the subject line reads like the one in below :
PPT | Planned Maintenance Work | Check | 22:00 - 23:59 Jan 24, 2018 GMT+7 || Viao
Firstly, want to retrieve the date from the subject line and then, I want to check if the date "Jan 24,2018" is less than 10 days from Today.
If yes, I want to trigger a template autoreply. Is this a feasible task ?
Looking out for the leads.
Thanks !
Diane Poremsky says
it is feasible. Will they all begin with ppt or be from the same sender - some way to filter them out from other messages?
using the macro at https://www.slipstick.com/developer/code-samples/create-appointment-email-automatically/ as an example,
If InStr(1, LCase(Item.Subject), "ppt") Then
Dim apptArray() As String
'split the subject
apptArray() = Split(Item.Subject, "|")
use the values:
strDate = apptArray(4) ' it might be 3
you'll need to convert it to a date and test it. I don't have the correct code to convert "22:00 - 23:59 Jan 24, 2018 GMT+7" to a date committed to memory (or published here) though. Even better is if the date and time have a separator, so they are split into separate fields.
The other option is using regex instead of an array - it would look for the date format and extract it. That actually might be better, especially if the month is always 3 letters - but if you need to use values from the subject, the array grabs them for you. A macro example using regex is here: https://www.slipstick.com/developer/regex-parse-message-text/
Vishal says
Diane, thanks for the kind reply.
Yes, "ppt" is common in the subject line. However, the date "Jan 24,2018" will be appearing in the text format like the one stated above after the time "22:00-23:59". How do I make sure I run a formula of finding the date difference between system date .i.e today with the date in the subject line and then if it is less than 10 days, make a rule to move it to a specified folder "<10days".
Diane Poremsky says
As long as the date format is the same, regex can find it. you'd use a pattern something like ((\w)[3]\s(\d)[1,2],\s(\d)[4] VBA can convert it to a date value, which is subtracted from today's date.
You'd use this code or similar: https://www.slipstick.com/developer/run-a-script-rule-autoreply-using-a-template/#webform
Although used for other purposes, there are regex samples at https://www.slipstick.com/developer/regex-parse-message-text/
(I'm not good at writing regex off the top of my head, so it might not be exactly correct, but will be similar.)
Aaron Rizo says
Hello all!
I need a bit of help with a script from this page. Essentially, I'm trying to set up a script in Outlook that will take an email that I'm receiving from a "No Reply" and use the email address in the body to reply to it instead with a template. The script I'm using is from the "Reply to a web form generated message" and I keep getting an error when it's running that states "Object required: Error 424." Any help would be much appreciated!
Diane Poremsky says
Do you know which line it dies on? Are you properly referring to the reply message?
Set oRespond = Item.Reply
oRespond.to strAddress 'replaces the reply address with strAddress value
Ashish says
Hi Diane, I am trying out your code for 'Reply to a web form generated message' and it does not work for me. I changed the .Display to .Send but nothing happens. I tried to run the rule manually several times & upon receiving a new message but the AutoSend does not send any reply. Can you please confirm anything to be configured in addition to the script? Thank you.
Diane Poremsky says
Does it display the message all properly filled out and formatted, when you have it set to .display?
Channing Workman says
Diane,
Thank you for your excellent example! It has been very helpful to me.
I'm struggling a tad on a regex expression.
I would like to extract an email address from the Emails body
--Formatted as such--
Email Address: test@gmail.com
The email address is a blue link when I open the email and I'm not sure that may have something to do with it.
This is my expression:
.Pattern = "(Email Address[:]([w-s]*)s*)n"
.Global = False
Any thoughts?
Thank you!
Channing
Diane Poremsky says
Sorry i missed this, i thought I replied before. :( As long as the address is on one line, you can use
I've also used ((.*)@(.*)) for the address.
Ernst says
Hi Diane,
I am trying to use your "Autoreply to Reply To Address, Not Sender" script to create a rule sending a server-side response to people who've filled a form on my website. Outlook apparently needs to be running for this rule to function, do you confirm? Is there a workaround? I am setting this rule on a noreply address which I do not open via Outlook.
Thanks for your support.
Ernst
john holstein says
Your autoreplywithtemplate worked fine for me for well over a year. Something changed outside of the code (no modifications were made to the VB code to make it stop working) now, when it finishes, after a few minutes, the reply goes into "Drafts" (rather than sending, as it did for a year or more) and I then have to manually go into Drafts, open it, hit the send button and away it goes.
Any idea how this happened or a fix? I figured it was an automatic update to my Outlook (Office 2007).
/john
Diane Poremsky says
The macro is using .Send, not .Save? Send should send it... Any idea when (what month might be close enough), it stopped sending?
Prabhu Jambulingam says
Hello Diane,
I am using this autoreply script of yours and it has been working well until I upgraded to outlook 2016. Once its upgarded to 2016 - it stopped working. Could you pls help me out to fix this in outlook 2016.
Thanks,
Prabhu.
Diane Poremsky says
Is macro security set to low? This is the usual cause.
Any error messages? (If not, comment out any on error resume next lines so errors come up)
Joana Villas-Boas says
Hello Diane, Reply to a web form generated message was just what I was looking for and it worked fine in my PC but I cant find the same option on Outlook 11 for Mac. Do you know how to do the same on a Mac?
Diane Poremsky says
AFAIK, you can't do this on mac. VBA definitely won't work... the only hope is if you can do it using apple script, although I'm not an apple script expert by any means.
Leon C says
Hi Diane,
I have another question for "reply with a template" code. My template has screenshots in between the text. Those screenshots were not available when I use "reply with a template" code. Is it possible to have those screenshots (not as separated attachment) within the text? do you know the code to achieve that.
Thanks!
Leon
Diane Poremsky says
If they are embedded in the html, it should work. Or put them on a webserver and link to them.
Leon C says
Diane, thanks for replying. The screenshots are actually inside of mytemplate.oft file. The screenshots became empty white box with error message inside and it said "the linked image cannot be displayed. The file may have been moved, renamed, or deleted. Verify that the link points to the correct file and location."
I can sent my code to you if you want to take a look.
thanks
Leon
Diane Poremsky says
The source code would be great, especially for the new message. I'm guessing the images are linked using file://c:/something/picture.png and when it opens as a template, the path becomes file://c:/temp folder/picture.png... I'll look into it.
Leon C says
Diane, I went back to your code and studied it. I figured out where I made the mistake...
However, it seems the code "Reply with a template" will reply with images from template but not from the original body. Could you please verify that?
Thanks
Liang
Diane Poremsky says
Correct, when you use reply with template, the template replaces the original message body.
Leon C says
Is there a way to keep both (images from the template and images from the original body), Diane?
Diane Poremsky says
possibly - are they embeded in HTML or attached? If attached, it's not difficult to reattach the to the new message. If they are embedded, you need to copy and paste the body - into the new message.
Leon C says
HI Diane, they are embedded. So, "copy and paste the body", is there a way to express it with VBA?
Diane Poremsky says
it would be .htmlbody = .htmlbody & item.htmlbody (item. is the orginial message object)
Leon C says
sorry to get back this late, Diane. I got caught up on other projects.
Could you please explain how to use this line of code as "Copy and Paste"? the reason I asked because this line of code is similar to "Reply with a template" code which you demonstrated. The results are the same, the original email pictures in the body did not show.
"Copy and Paste" code
.htmlbody = .htmlbody & item.htmlbody
"Reply with a template" code
HTMLBody = oRespond.HTMLBody & vbCrLf & _
"---- original message below ---" & vbCrLf & _
Item.HTMLBody & vbCrLf
Thanks
Liang
Diane Poremsky says
Sorry I just saw this...
HTMLBody copies the formatting - but depending on how the pictures are inserted (as a link to the picture online or embedded), the pictures won't be included. It might work to use word's object model to copy the and paste the body to preserve the image. There is an example here that uses word objects: https://www.slipstick.com/developer/code-samples/paste-clipboard-contents-vba/#word
Diane Poremsky says
BTW, how did you insert the images? If you open the template manually, are the images missing?
Leon C says
Hi Diane, If the template open manually from the outlook, it will have the images. I will post my code. stay tune. Thanks for looking into it!
Leon C says
Dear Diane,
I like the "Reply with a template" code. However, is it possible to have a header that include From: Sent: To: CC: and Subject:?
It will be just like when you reply an email manually using outlook, it has something like that below:
bbb,
Good luck on your appointment.
-Leon
From: EXT-aaa, bbb
Sent: Friday, April 22, 2016 10:10 AM
To: DL Operations Team
Cc: something, Thuy T; else, Bernard S
Subject: OOO this afternoon for appt
OOO this afternoon for appointment. Will check back online later.
Regards,
ext-aaa,bbb
Diane Poremsky says
You can create a text string using fields in the original message then insert it at the top of the message.
InsertBefore code sample is here - https://www.slipstick.com/developer/code-samples/add-attachments-names-to-message-before-sending/
David N says
Diane,
Do you know of any issues with this macro working with Outlook 2016? I just upgraded and the client rule to run this macro isn't working, however, if I were to add this as a button to my ribbon, it works fine.
Diane Poremsky says
No, it should work fine. It was tested more than once in Outlook 2016 32-bit. It should work in 64-bit too. Which one are you using in the rule?
Jose says
Reply to a web form generated message- How can use this macros plus add the original email that I received?
Diane Poremsky says
If not a macro on this page, then one of the other run a script macros i have. If you don't want to reply with a template, you can change this line:
Set objMsg = Application.CreateItemFromTemplate("C:\path\to\template.oft")
with Set objMsg = Application.CreateItem(olMailItem) to create a new message or set objmsg = Item.Forward
Jim says
Hello Diane, I was wondering if you were aware of a good tutorial that would cover the following event flow: create a custom template, save it to disk, email auto generated by a tool that lists a user profile, regex and assign profile to a variable, assign variable to a new email or even forward the one that arrived in the auto generation process, send email. I don't mind reading books but I hope to get some guidance as my focus is not in VBS but other areas of computing. thanks. Jim
Chris says
Hi Diane--I get 6-10 emails each night indicating some sort of order has been placed. They all come from another internal employee and are sent to the external customer with me CC'd. What I would like to set up is a delayed auto-response ONLY to the external customer using a saved email template. How can I grab and reply only to the "To" field and use an oft file stored on my computer? It would be ideal if this script ran in the morning when I logged into my outlook client (Outlook 2013 via exchange server) rather than at 2 in the morning when the emails arrive. Thanks for any tips you can offer!
Diane Poremsky says
A script will only run when outlook is running, so the timing wont be a problem if you don't leave outlook open all night, but even if you did, we could work around that.
The address is not a problem either, just change a line to remove the sender address and add the to.
With oRespond
.to Item.to
darxter says
Thanks a lot. It works.
darxter says
Is it possible to include multiple recipients in .Recipients.Add.
I tried with "name@domain.com;name2@domain.com" and "name@domain.com,name2@domain.com" but without luck.
What is correct syntax?
Thanks in advance
Diane Poremsky says
no, you'll need to use one line for each or use .to - if you use the to field you'll replace existing recipients while Add adds to the list.
.Recipients.Add "maryc"
.Recipients.Add "billy@smith.com"
John DeCastro says
Diane,
I need to create a script for Outlook 2010 that will auto reply to all messages that come in when the office is closed. This would be set to run from 6pm-8am each day Mon-Thursday and 6pm to 8am continuously from Friday-Mon. I cannot seem to find a script to specify days and times. Can you help?
Justin says
Would it be possible to reply with the senders name or email in the reply body as well as the subject line from the originating email using code similar to the one in your original post?
Diane Poremsky says
Yes, you can get the sender's display name and /or email address. Sender's name is item.sendername, but it could look goofy if they use last, first format as their display name.
.HTMLBody = "Your reply text goes here." & item.senderemailaddress & vbCrLf & _
"---- original body below ---" & vbCrLf & _
Item.HTMLBody & vbCrLf & _
"---- Template body below ---" & _
vbCrLf & oRespond.HTMLBody
Scott says
Also, I thought I should include the actual script:
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\snissenbaum\desktop\VC Response.oft")
With oRespond
.Recipients.Add "snissenbaum@htgc.com"
.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
Thanks again!
Scott
Scott says
Hi Diane,
I have been experiencing some trouble with all my scripts, none of them have sent even though I have included ".send" The parameters for the rule I am using are: Apply this rule after the message arrives, from invitations@linkedin.com, run Project1.AutoReplywithTemplate (my script) and mark it as read.
Any ideas of what to do? Any script I use won't send, no matter what. I'll keep trying different scripts, but as of now nothing works. Thanks in advance.
Scott
Diane Poremsky says
Don't use the mark as read action - put item.unread = false in the code. I usually put it at the end so if the macro errors, it won't be marked as read. Actions in run a script rules often fail - everything needs to be in the script. It's usually rhe action that fails, so I don't think this is the causing it not to send.
Is it doing everything but sending? Does it open a message form if you change it to display?
Is macro security set to low?
Ricky Gomez says
Hi I created a rule to run this code and it works except when including the original body (Item.HTMLBody) which is blank.
Is anybody else having this problem?
I googled it and it seems a lot of people are having this problem with no solution.
This happens if I create a rule and assign it this macro. The funny thing is that it works well if I run the rule manually once the item is in the inbox.
But when it runs automatically when an item arrives it does not work and always puts a bland body.
When I debug the code the body looks like this:
Some of the solutions online stated to add .Save before .Send but it doesn't fix it
Diane Poremsky says
I'll do some testing and see if i can figure out why it might be failing. I know too much mail, too fast can cause rules to fail, including too many messages that use the script. Passing the work load off to a second rule often works. This example passes everything off but you could do some stuff in the first script before handing it off. It really depends on what all you are doing.
Sub SendNew(Item As Outlook.MailItem)
processmessage item
end sub
private sub processmessage(item as mailitem)
' do whatever
end sub
Jen Epstein says
Hi there, thanks for the VERY helpful post!
I've added the VBA code for "Reply to a web form generated message" and it works, but I have to manually send out this message.
Is there any way to have VBA code to auto-reply to a web form generated message?
So when I receive an email, the script would extract the email in the body and then auto-reply.
Again, thanks for your help!
-Jen
Diane Poremsky says
Change .Display to .Send - use .Display for testing so you can see it's working properly, then change it to .Send to fully automate it.
Nand says
I am brand new to script writing and have absolutely no experience in writing any form of code. Please forgive my questions that are very basic.
1. Can you please tell me if the script written at the very top of the page under "reply with a template" will send a message using both the senders name and the actual email sent to. In other words, when I normally (manually) reply to an email in Outlook 2010 - the senders name and email address is in the To box. This makes it easier to find previous emails sent to an individual in the past. Can (should) -
.Recipients.Add Item.SenderEmailAddress
be changed to add (or substitute) the senders name and email?
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
2. In the .subject = "Your Subject Goes Here" - I assume this can be changed to
.subject = item.subject
if one wants to keep the original subject line?
3. If one wants to keep the original message in the reply (and not as an attachment) then should the
.Attachments.Add Item
line be removed from the code?
4. Does the following remain unchanged if the original email content is to be included at the bottom of the reply email (in order to be able to see the original email in the reply email)
.HTMLBody = oRespond.HTMLBody & vbCrLf & _
"---- original message below ---" & vbCrLf & _
Item.HTMLBody & vbCrLf
5. My ultimate aim is to be able to make a rule that includes this script and
a. manually run the rule on a folder with a collection of emails that need to be responded to using the SAME response template (I would like to be able to change and update the template.oft file from time to time - and I am aware how to do so. The template is in HTML format and I would want to maintain that). Otherwise everything I want to do can be otherwise done using a shortcut key with QuickSteps - which does not do HTML!!
b. The reply email will have the original senders name and email address in the To box - making it easier to find the previously emails to an individual
Any help you can provide is deeply appreciated. Thank you.
Diane Poremsky says
To manually run these macros on a selected message, use this code, replacing the macro-name as needed.
Public Sub RunManaully()
Dim objItem
Set objItem = Application.ActiveExplorer.Selection.Item(1)
AutoReplywithTemplate Item
End Sub
Nos says
I want this to run automatically without a macro... (Thanks for above though.)
Where should I save/write the code:
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:\Program Files\Microsoft Office\Templates\1033\MAIL.oft")
With oRespond
.Recipients.Add Item.SenderEmailAddress
.Subject = "RECEIPT CONFIRMATION"
.HTMLBody = "Thank you " & vbCrLf & _
Recipients.Add & vbCrLf & _
" for your e-mail about " vbCrLf & _
Item.Subject & vbCrLf & _
". The matter raised will be attended to by officials relevant to this matter." & 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
Steps I followed was:
1. I had the idea of sending a reply message everytime I receive a message.
2. I've created/set a rule for, after receiving a mail, send reply message using a saved template: at the moment just my e-mail signature. I wish to make this message more 'personal' and want to add the recipients name.
3. Then browsed for help and found your help: I learned that Outlook will only sent this reply once per session. Founding your code seemed beter than what Outlook offers.
4. I then opened Microsoft Outlook | Developer | Visual Basic and created a "module 1". (I wish I could sent a screenshot to you!) Is this the right place? A blank screen opened where I've written the code above...
5. I don't know programming. I "run" the program and it's asking to create a macro..? I don't want a macro. So, did I save this incorrectly?/Tried the coding at the incorrect place?
Nos says
Hallo Diane. I still don't have this script running... (I wish I could enrol for a VBA programming course!)
I refer to your comment before mine above (March 27, 2015 at 10:05 am):
I came to realise that I don't know what a VBA macro is... (what it "looks" like) And therefor did not understand the said comment the way you might have liked me to understand it. You've provided code for manually checking the script. Unfortunately I don't even know whether that must be at the bottom of the script I already have or above!? I also don't know how to replace "the macro-name as needed"... I have then again tried to run the script in such a way to display: I've aked a colleague to send me mail, but I do not view (the reason for .display I guess) the proposed mail that will be sent to him... I've made the rule run from "run rules now" and an error message appeared:
RULES IN ERROR
Rule (name): where my name is in the To box
Error: The script "" doesn't exist or is invalid.
Which way will be better to help me: manually run the macro in order to preview the mail that will be sent (as written per script) or through .Display? Please help me...
Diane Poremsky says
This error :
RULES IN ERROR
Rule (name): where my name is in the To box
Error: The script "" doesn't exist or is invalid.
Means it is looking for a script named something like this but is not finding it.
Sub AutoReplywithTemplate(Item As Outlook.MailItem)
Rules only work with macros named in that format.
to manually check a script, put this after the macro and select a message then run the macro. The name of your macro goes in the script in place of AutoReplywithTemplate
Public Sub RunManaully()
Dim objItem
Set objItem = Application.ActiveExplorer.Selection.Item(1)
' this is the name of your macro
AutoReplywithTemplate Item
End Sub
Nos says
1. I want to have an automated message on all mail received (via Outlook 2010).
2. Thank you Diane! Visiting this site helped so far.
3. I do not have VB programming knowledge - my query thus of "lower grade"...
4. I want (tried) the following (from your instructions given on top):
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:\Program Files\Microsoft Office\Templates\1033\MAIL.oft")
With oRespond
.Recipients.Add Item.SenderEmailAddress
.Subject = "RECEIPT CONFIRMATION"
.HTMLBody = "Thank you " & vbCrLf & _
Recipients.Add & vbCrLf & _
" for your e-mail about " vbCrLf & _
Item.Subject & vbCrLf & _
". The matter raised will be attended to by officials relevant to this matter." & 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
5.1 When I want to run (F5) above, I'm asked to create a macro. Should I create a macro now?
5.2 The HTMLBody might not be correct. May you assist me?
Diane Poremsky says
These macros are triggered by rules, not run manually.
What problem are you having with the html body format?
richnik says
Been trying the sample codes above to start me off, but whenevey I click on run, it asks me for the macro name. So I create one but it only has the
Sub fr()
End Sub
What am I missing here? Thanks.
Diane Poremsky says
These macros run using rules or other automated methods, you don't run them manually. if you want to test an automatic macro, you can call it using another macro but need to set the item to run it on.
willkoper says
Is there an elegant way to test if the message is a reply to a message previously sent, e.g. to avoid an endless autoreply loop?
Diane Poremsky says
Define "elegant". :) You could search the sent folder for a match... or if you can count on the autoreply's subject being tagged as an autoreply (or having specific text), you can check for that.
The subject test is easier...
Either of these snippets should work for search (they need some objects dim and set yet) - i don't know which is faster.
For Each objItem In SentFolder.Items
If InStr(1, objItem.subject, item.subject) Then
exit sub
End If
Next
or this format
strSearch = "[subject] = " & item.subject
Set objItem = colItems.Find(strSearch)
willkoper says
Touché :)
I had originally been thinking to check for the sender's email in the body, e.g. "XXXX wrote:", but searching the subject is much easier (especially since I'm setting that anyway).
Just using If InStr ( item.Subject, "") = 0 to check the original message and reply if the phrase is not found.
Thanks for the script!
kyle says
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
Diane Poremsky says
You need to replace Item.SenderEmailAddress with recip:
.Recipients.Add Item.SenderEmailAddress
becomes
.Recipients.Add recip
kyle says
That fixed the error. Thanks.
kyle says
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
Diane Poremsky says
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
kyle says
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.
Diane Poremsky says
Replace the recipients.add line with
.Recipients.Add recip
What error are you getting?
kyle says
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
Diane Poremsky says
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
Tuhin Banerjee says
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
Diane Poremsky says
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.
Rod says
Thanks. That did indeed take care of it.
Rod says
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?
Diane Poremsky says
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.
Joseph says
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.
Diane Poremsky says
Yes, that is more or less correct.
Joseph says
Thank you for your help! I'm not sure it is possible at this point. Good luck!
Diane Poremsky says
My initial thought is that it is not possible, but it will be interesting to look into doing it.
Joseph says
Rules and Alerts.
Joseph says
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
Diane Poremsky says
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.
Joseph says
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
Diane Poremsky says
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.
Joseph says
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.
Joseph says
I tried this for the "Out of Office" events but the script does not show up in the rules script selection window.
Diane Poremsky says
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.
Avary says
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!
jimdernie@gmail.com says
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?
Diane Poremsky says
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
Marlon says
is there a way to to "reply all" to multiple messages at once?
Diane Poremsky says
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.
Syed says
hi Diane, I want to write a scipt to setup a rule that will look for specific keywords in the subject and then open a web interface and fill out a form using the subject and body, and submit the information and close the web page. Could you please advise?
Diane Poremsky says
the first part is easy - to fill in web forms, you need to have the name of the form elements. See https://www.slipstick.com/developer/code-samples/open-hyperlinks-email-message/#comment-208236 for the basics.