Last reviewed on March 14, 2014   —  168 Comments

How to use a Run a Script rule to have Microsoft Outlook automatically send a new email message using a template, to a new email addresses when a message meeting specific conditions arrives. I also have a version of the script that sends a new message with the body of the message that triggered the rule to another person. (To avoid including the Reply header in the body).

To use, open the VBA Editor and paste the code into ThisOutlookSession. Create a Run a Script rule, selecting this rule.

When you create the template, do not include a signature. Outlook will add the signature when the message is sent. To test the rule without sending messages, change objMsg = Send to ojbMsg = Display. This will open the message form instead of sending it.

New message using a template


Sub SendNew(Item As Outlook.MailItem)

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

' If the address you want to send to is not saved in the template,

objMsg.Send

End Sub


## To reply to the sender using a template

This script could be used for an Out of Office style reply. Using this method will send a reply with every message that meets the condition of the rule.


Sub SendNew(Item As Outlook.MailItem)

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

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

objMsg.Send

End Sub



To Forward the message body to another address

This version of the script sends a new message containing the body of the received message. (If you want to forward the complete message, use the Forward rule.)

Hyperlinks links will be "opened". To avoid this, and if you don't mind converting the messages to HTML, you can use objMsg.HTMLBody = Item.HTMLBody instead (it works with plain text and RTF messages), or create an If Then statement to check for incoming body types and use the correct format. As always, test it with messages to yourself or using objMsg.Display before using it to send messages to others.


Sub SendNew(Item As Outlook.MailItem)

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

objMsg.Body = Item.Body
objMsg.Subject = "FW: " & Item.Subject

objMsg.Send

End Sub


1. Manuel Ratzinger says

Hello,

thx for that usefull post. I have a little different problem to solve. Do you know how it is possible to do the same thing as above but use a "alias" mail address to send the reply mail as a user could choose manualy in the "From..." Menue in a new Outlook E-Mail User Interface.

I know the possibility with the SendUsingAccount method, but the problem is there is no additional account but the user has only the right to send as another user.

• Diane Poremsky says

Try using SentOnBehalfOfName -

objMsg.SentOnBehalfOfName = "me@here.com"

2. Eric says

I'm trying to use the To Forward the message body to another address script and I get a compile error on the first line. User-defined type not defined. I have excel 2010. Please help. Thanks

• Diane Poremsky says

Are you using the code exactly as shown in the sample?

3. Manuel Ratzinger says

Thx, I figured that out already. Works fine for me.

4. Eric says

Yes, but I've added a forwarding message and an email address. Sorry, first time trying to use the script option.

objMsg.Subject = "FW: Forwarded to supportcase " & Item.Subject

5. Eric says

Got it to work. :)

6. Barney says

Hi There
I have an Outlook 2010 rule that runs whenever any emails from a specific user, with specific subject line and body text is detected. I know this rule works as I set up this rule with a simple forward rule and it work.
However I want to execute your script 'New message using a template' as I want to trigger a whole new email and send it to specific users.
the outlook template file resides in c:\OFT\Rule1.oft
This is what my script looks like
============================================
Sub SendNew(Item As Outlook.MailItem)

Dim objMsg As MailItem
Set objMsg = Application.CreateItemFromTemplate("C:\OFT\Rule1.oft")

' If the address you want to send to is not saved in the template,

objMsg.Send

End Sub
============================================
How can I toubleshoot this further? Any help would be greatly appreciated.

• Diane Poremsky says

Change .send to .display so you can see if the template opens.

Oh, and if this is not a typo, you are missing the o.

7. Barney says

Hi Diane
I have checked and the syntax was correct, also changed the 'send' to 'display' when I run the rule the template does not open.
=====================
Sub SendNew(Item As Outlook.MailItem)

Dim objMsg As MailItem
Set objMsg = Application.CreateItemFromTemplate("C:\OFT\Rule1.oft")

' If the address you want to send to is not saved in the template,

objMsg.Display

End Sub

• Diane Poremsky says

This is working here - I added MsgBox "SendNow rule" so I'd know if it kicked in.
Sub SendNew(Item As Outlook.mailItem) MsgBox "SendNow rule" Dim objMsg As mailItem Set objMsg = Application.CreateItemFromTemplate("C:\OFT\Rule1.oft") ' If the address you want to send to is not saved in the template, ' set the addresses here objMsg.Recipients.Add "alias@domain.com" objMsg.Display End Sub

It worked with that removed too - once i fixed my rule. I initially used conditions than my test messages did not meet. :(

8. Mark says

Diane - looking for a variation on this - wondering if you can help me. At our work site, I can't sync my google calendar with my work calendar because it's blocked. So I have a rule to forward meeting requests to my google calendar. The problem is that we also use "all day events" as a way to show someone is out of the office. I don't want these appointments forwarded to my google calendar, and I can't find a way to exclude them from the rule.

Thanks

• Diane Poremsky says

You'd add an if statement -

If Appt.AllDayEvent = False then
'do the forward
else
end if

Do you have code you are using now or are you trying to convert this macro to something that meets your need?

9. Mark says

No, I currently just have a standard rule created through the Outlook rules wizard. Just trying to find a way to forward only meetings that are not all day events. The rules wizard doesn't account for this, and it looks as though I need to use a script or macro.

• Diane Poremsky says

You'll need to use a run a script rule. I'd probably build off of the rule here: autoaccept meeting - you can add the bit that checks for the all day state to the if statement, then add code to forward and remove the autoaccept bits.

10. Misa says

Hello,Can anyone help me with this issue : How to make "personalized auto-responder", if I can call it this way....
Any decent WEB site today have (if we can call it) customized auto reply message when customer sign up with them.
Example : If I register with some WEB site I receive message similar to this:
Dear Misa,Thank you for registering with our website.
So in just few seconds I'm receiving automated message with my name and user name,also if I loose password I can recover it.
Can anyone tell me how I can get something like this, do I need additional software (or service)?Many thanks

• Diane Poremsky says

Do you want this on your web site? If so, you would use a script in the web page, not in outlook. If you use exchange server, you could have it generate a reply (pop and imap servers might be able to do it too) but having the form generate and send it would be easier.

11. Barney says

Diane
The outlook template file does not display, nor do I get the message box pop up. Wondering if these things may be blocked by group policy, do you know?

• Diane Poremsky says

Do you have macro security set to low? As long as you can change the macro security to either low are warn for all macros, they can't block it.

12. Barney says

the macro setting in my outlook is set to 'Notifications for digitally signed macros, all other macros disabled' and this is greyed out, therefore I cannot change the setting. Must be set by GP. Are you familiar with how I can disable this via local security policy?

• Diane Poremsky says

If you have the ability to edit the registry (I'm guessing they have that locked down too), you can override it after each logon by deleting the key. But it's really best to talk to your admin.

13. Misa says

Yes Diane, I would need this for my WEB site. When I contacted support they told me that I need script for this, and now I'm looking for someone who can help me with it...

• Diane Poremsky says

It's really out of my league. Sorry. If you site uses php or asp, you can use that otherwise, you need javascript.
google search. If you can't find anything (the results on page 2 looked promising, page 1 was mostly commercial services). Back before I moved to use a CMS, stackexchange and dynamicdrive seemed to have the most useful scripts but that was 3+ years ago.

If all else fails you could do it in outlook, but the reply won't be fast since outlook needs to download the mail to reply. If you web mail can autoreply, you could set it up in the mailbox and replies will be fast.

14. Rupesh says

what i have to insert in this option objMsg.Body

• Diane Poremsky says

I'm not sure I understand the question. Sorry.

15. seb says

hi there, i like this but was looking for a script that allowed me to automatically forward an email to someone@company.com with a message in the body. ie please see my email below.

• Diane Poremsky says

To add a note to the body, you'd use something like this:
objMsg.Body = "Please see message below" & vbcrlf & vbcrlf & Item.Body

16. Alap says

Hi there,

We are in a situation where we have a mailbox, which receives e-mails from abc@netbanx.com. The body of the e-mail contains our customer's e-mail address specified as E-mail Address: joe.bloggs@xyz.com

We would like these e-mails to be forwarded to the customers by picking up the E-mail Address field in the body.

Is there a script for this?

17. Richard says

Hi Diane
I have used your script successfully thanks. However I would like to add multiple email recipients, and i have tried simply delimiting and repeating the objMsg.Recipients.Add line but to no avail.

Any ideas?

Thanks

Richard

• Diane Poremsky says

One string with semi-colon delimiters should work -

if it doesn't work for you, what does the error message say?

18. Richard says

Hi Diane, and thanks for the reply.

I have tried the semi colon between email AD's but that seemed to only send to the first email in the list. Having said that, now it has stopped working all together, but there are no error messages popping up. Please see a copy of script below. Sorry I am not great at scripts, although am technical.

Sub SendNew(Item As Outlook.MailItem)
Item.Subject = ",,[Our ref: 2M7W2NSI5NruqKI]"

Dim objMsg As MailItem
Set objMsg = Application.CreateItemFromTemplate("C:\old\webserver.oft")

objMsg.Send

End Sub

The module code is below also

Sub webserver()

End Sub

• Diane Poremsky says

What is your macro security set to? That is the usual cause of macros not working at all.
Does it work if you replace the template line with a new message?
Set objMsg = Application.CreateItem(olMailItem)

(use objMsg.display so you can see the messages without sending them).

19. Craig Johnstone says

if you just want to forward the subject only then use the following script

Sub SendNew(Item As Outlook.MailItem)
Dim objMsg As MailItemSet
objMsg = Application.CreateItem(olMailItem)
objMsg.Body = ""
objMsg.Subject = "FW: " & Item.Subjectobj
objMsg.Send
End Sub

20. Heri says

Diane - looking for a variation on this - wondering if you can help me. I have tried "To Forward the message body to another address" script and its working perfectly but having issue with attachment, script not able to forward attached file/files in the email, can you please advice how to forward attachment with email body ??

Many thanks

• Diane Poremsky says

You need to the CopyAttachments sub here and then a couple of new lines in the macro before its sent.
If Item.Attachments.Count > 0 Then
CopyAttachments Item, objMsg
End if
objMsg.Send

if you only want to include certain file types, you could take from the code here and check file types.

21. Karen says

Hi Diane, thank you for all of your posts and help so far :)
I am using the "Send BCC" VBA code (life saver) however every now & then Outlook 2010 (on Win 8, 64) stops processing the macro after a reboot, and I don't always remember to check that the BCC is still active.

Is there a way (I have googled but it assumes I'm referring to the auto send/receive at startup), to create an email at startup so it triggers the BCC and I can confirm it is working. .

Eg: Outlook 2010 starts / Auto send mail to (test@testing.com)

Karen

22. Karen says

I put the following code in as a Application_Startup item
So far it seems to have worked. :) Thank you for the advice on the reminders. Reminders always trigger on startup, so that's a handy redundancy feature. :)

=====
Private Sub Application_Startup()
'Creates a new e-mail item and modifies its properties'

Dim olApp As Outlook.Application
Dim objMail As Outlook.MailItem
Set olApp = Outlook.Application
'Create e-mail item'
Set objMail = olApp.CreateItem(olMailItem)

With objMail
.Subject = Format(Now, "YYYYMMDD - HH:mm:ss") & " | " & "Login Test"
.Body = Format(Now, "YYYYMMDD - HH:mm:ss") & " | " & "Testing the BCC"
.To = "me@forme"
.Recipients.ResolveAll
.Send
End With
End Sub
=====

23. Pete says

Hi, I'm looking for a bit of help with a script. When I'm bcc'd on an email I want to send a new email to the original email recipient. The email needs to include an attachment and ideally the attachments vary by email domain name. I can't find the commands that I need, please could someone point me in the right direction. Thanks

24. Tex says

Hi,

I tried the code it works for me.But then, my problem is with Rules that i have set to run the script. Say, my Rule looks for the keyword 'xyz' in the subject line of received mail and triggers the script to forward the mail to a bigger group that includes myself. I again get the mail with 'xyz' in the subject line. This kind of, puts it in a loop!! Please suggest how to avoid this.

• Diane Poremsky says

Try adding an exception to the rule "except if sent to "my dl group" or use an if statement in the script, something like this -
If instr(1, item.to, "DL name") then
Exit sub
End if

25. Tera says

Thank you for sharing this script!
I have gone through the steps and was able to complete a successful test. However, as soon as I change the filter on the rule itself the script no longer sends or displays.

I've deleted the rule and set up a new rule, but the problem continues.

• Diane Poremsky says

What condition are you trying to use?

26. Tera says

(I mean a condition in the rule, not filter....)

27. Tera says

searching the subject or body for words/phrases. I changed it from a phrase to a word.

• Diane Poremsky says

So only the words changed? Is the word in the message? <== this would be the usual reason it fails.

28. Tera says

Yes Ma'am. The word is in the body and the subject. I've changed it from awaiting approval to approval.
What make this even more interesting is, if I delete the rule and set it up again it will not display either.

• Diane Poremsky says

And the macro security is set to low or the macro is self-signed and you allow signed macros?

29. Tera says

Unsigned macros were disabled! You are wonderful. Thank you for all your help and sharing your knowledge.

30. Jenny C says

HI Diane, how do I add a short message before it gets forwarded?

I have used this and it works
Sub ChangeSubjectForward(Item As Outlook.MailItem)
Item.Subject = "Test"
Item.Save

Set myForward = Item.Forward

myForward.Send

End Sub

But I'd like to add a message which would be a reference for the email being sent

Thank you

• Diane Poremsky says

the quick and dirty way is to use item.body = "my message" & vbcrlf & item.body - if the message is HTML, you'll see why it's quick and dirty. :) it's great for plain text messages though.

31. Nasim Rawat says

HI Diane,
I want to trim some rows of message body and then forward, can you help me.

• Diane Poremsky says

How much do you want to trim? use something like objMsg.body = Left(objMsg.body, 160) where 160 is the number of characters.

32. nasim rawat says

i want to delete top 50/60 rows or 300 words, but below this all message send

• Diane Poremsky says

You can't count words or lines (at least not without a function) but you can get characters - use right instead of left to get the end and Len to count the length. I'm on my tablet and can't see the original code, so you need to use the correct object name, but try a formula like this: body = right(body, Len(body)- 1800) (assuming AVG word length of 5+a space per word.)

• Diane Poremsky says

Here is a function that will count words - http://www.jpsoftwaretech.com/get-word-count-in-vba/ - it should work fine in outlook. You'd use it to get the word count then keep just the right most less 300. If there is a specific word or phrase in the body that is unique and never changes, at the point where you want to cut the text, you can use that in the calculation instead.

33. Russell Brown says

So here is a tricky one for you. I want to auto reply with a script but I want it to automatically reply when a vote is sent out. The vote contains times when you would like to attend the meeting. I would like when the vote email is sent to me, to be able to auto reply that I would like to attend at 11:00. Is this possible?

• Diane Poremsky says

It probably is, but I haven't tested it. You need to be able to filter for it then pass it to the Script that finishes the processing. Is it always a voting message?

34. Russell Brown says

Yes, it is always a voting message.

• Diane Poremsky says

I haven't had a chance to work on this - but it looks like it is possible.

35. Doug says

I think your script gets me almost to where I need to be. I'm trying to autoforward a message only when it's received from a particular email address. Can you suggest a modification that would make this work? Thanks!

• Diane Poremsky says

Setting the condition(s) in the rule is the easiest, but it doesn't always work with addresses - if outlook misses the underlying email address, you can use an if statement -
'do the stuff
else
end if

36. Russell Brown says

OK, Let me know what other specific information you might need to write the script. I would REALLY appreciate it!

37. Nasim rawat says

HI Diane,
I want to auto forward email without adding previous sender or receiver,
this is news email that send by sender on multiple user ids when i forward it it add all email ids in message body, some emails have attachments. I am beginner in VBA.

• Diane Poremsky says

You'll want to use the last one, Forward the message body to another address. This copies the message body to a new message. Do you also need to include the attachments?

38. Anonymous says

I was using a variation of your last example successfully several weeks ago, but for some reason when I tried to enable it again today I am not getting any notifications sent out. I just want an email sent to my personal email address with the name/email of the sender in the subject/body when new email arrives (I do not want the body/subject of the original email address sent to my personal email address due to security concerns). Here is the script. The top is my attempt at modifying yours. The bottom with all the ' marks was the one that worked great previously. Where I say _______@______.com is my personal email which I don't want to include on here. Thank you for your help!

Sub SendNew(Item As Outlook.MailItem)

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

objMsg.Body = Item.Sender

objMsg.Send

End Sub
'Sub SendRuleMail(objItem As Outlook.MailItem)
' Dim objMail
' Dim strMsg
'
' 'Create a message object
' Set objOutlk = CreateObject("Outlook.Application")
' Set objMail = objOutlk.CreateItem(0)
'
' 'Create a new message
' objMail.To = "___________@____.com"
' objMail.CC = "" 'Enter an address here To include a carbon copy; bcc is For blind carbon copy's
'
' 'Set up Subject Line
' objMail.Subject = objItem.Sender
'
' strMsg = objItem.Sender 'I used the subject of the new mail for the body
' objMail.Body = strMsg
' objMail.Send
'
' 'Clean up
' Set objMail = Nothing
' Set strMsg = Nothing
' Set objOutlk = Nothing
'End Sub

39. Anonymous says

I figured out the problem in my previous question yesterday - the macro settings were too restrictive so it was blocking my script. Now I am wondering if there is a way to adjust the script to automatically delete the message from my sent mail?

40. Nasim rawat says

yes i have also include attachment.

41. Anonymous says

Thanks. I figured it out. I am copying my code below in case it helps anyone else.

Sub SendNew(Item As Outlook.MailItem)

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

objMsg.Subject = Item.Sender

objMsg.DeleteAfterSubmit = True

objMsg.Send

End Sub

42. Nic Xiaoyu Qi says

Hi,

I am trying to make a macro to forward a email but include the selected email as an attachment.
I've got everything to work apart from attaching the selected email as an attachment.

43. Kathy Oliver says

If I use the script for the auto reply, will the auto reply work every time a new email is received by the same sender? We are looking for the auto reply to send every time an email is sent by the same sender while the rule is in place.

• Diane Poremsky says

Yes, if you use a script for the reply, it will apply to every message from an address.

44. Michael Martin says

Diane, I would like to create a rule / script that can read two emails by the subject line and forward a mail to another email address.

example: i recieve an email with subject line "Problem" at 9:00 am. I get another email in 30 minutes later with the subject line "Resolved".

If i do not get in 30 mins the resolved email, i want to forward this problem email to another email address. how can i set this up by creating rules / scripts? please help

• Diane Poremsky says

I'm not sure you can do this using rules, but you'd need to use windows timer, so it would be better in a com add in. I'll give it some more thought because its an interesting idea.

45. Michael Martin says

Diane, Thanks for your response. Appreicate if some one can develop this addin for me. what will it cost?

46. Anthony Parchmont says

Hi Diane, In the “To Forward the message body to another address” How can I forward the original email as an attachment and add a custom static message body to say “ please see the attached message”

I would be grateful for your help on this one.

• Diane Poremsky says

You add the text in the .body command and use .attachments add Item to add the message as an attachment.

Because we're referring to objMsg a few times, using With/End with is better:
with objMsg
.Body = "my message " & vbcrlf & Item.Body
.Subject = "FW: " & Item.Subject
.Send
end with

47. Anthony Parchmont says

Thank you, works like charm!

• Anthony Parchmont says

Hi Diane, What can I do if I just want to forward only the attachments, but just specific file extension such .xls, .doc., .pdf. Other files like .png, .gif, .jpg should not get forwarded. The code below is what I used to forward only attachments, but it attaches all attachments.

Sub RunAScriptRuleRoutine(MyMail As MailItem)
Dim strID As String
Dim olNS As Outlook.NameSpace
Dim msg As Outlook.MailItem
Dim fwd as Outlook.MailItem

strID = MyMail.EntryID
Set olNS = Application.GetNamespace("MAPI")
Set msg = olNS.GetItemFromID(strID)
' do stuff with msg, e.g.
Set fwd = msg.Forward
fwd.Body = ""
fwd.To = "who@where.com; who2@where2.com"
fwd.Send

Set msg = Nothing
Set fwd = Nothing
Set olNS = Nothing
End Sub

• Diane Poremsky says

with the other dim's
Dim attCount As Long
Dim strFile As String
Dim sFileType As String

Stick this in before the send:
fwd.To = "who@where.com; who2@where2.com"
attCount = fwd.Attachments.Count

For i = attCount To 1 Step -1
strFile = fwd.Attachments.Item(i).filename
sFileType = LCase$(Right$(strFile, 4))

Select Case sFileType
' file extensions you want to keep
Case ".pdf", ".doc", "docx", "xlsx"
' do nothing
Case Else
' delete all other attachments
fwd.Attachments.Item(i).Delete
End Select
Next i
fwd.Display ' .send

48. Ken Rogers says

I have a custom form that users enter a URL in one field and then, with some VB scripting, the recipient can click on a separate button to launch the URL. This works great until the original recipient forwards the form. When forwarded, the VB scripting gets disabled so no links. Funny thing - I opened the forwarded form in my developer tab and ran from there and the links worked.

• Diane Poremsky says

1) It needs to be published or at least saved in the templates folder if you aren't using Exchange and have it in the org forms library.
2) Outlook security has a setting to allow script in folders. File, Options, Trust Center, Email security

• Ken Rogers says

I should have said - each user has the form published in their personal forms library. My company doesn't support forms so I can't get access to the organizational library. And all the users can access the form, create one, and receive with no problem. It's just on forwarding when the script gets disabled.

• Diane Poremsky says

I think the problem is that the forwarded copy is one-offed and scripts are disabled in one-off forms for security reasons.

49. Josh Heo says

Sorry.. I am not sure if my previous question was uploaded.

I cannot see pictures when I use this script to auto forward emails.
I see "x" and "the linked image cannot be displayed"

How can I correct it?

• Diane Poremsky says

Are you using the one to forward the message body (objMsg.Body = Item.Body)? If the images are attached/embedded, you also need to copy the attachments over.
Add this line after the body line:
CopyAttachments objMsg, Item

and use this function:

Sub CopyAttachments(objSourceItem, objTargetItem)
Set fso = CreateObject("Scripting.FileSystemObject")
Set fldTemp = fso.GetSpecialFolder(2) ' TemporaryFolder
strPath = fldTemp.Path & "\"
For Each objAtt In objSourceItem.Attachments
strFile = strPath & objAtt.FileName
objAtt.SaveAsFile strFile
fso.DeleteFile strFile
Next

Set fldTemp = Nothing
Set fso = Nothing
End Sub

• Josh Heo says

Hi, Thank you so much for helping!!
So.. Like this?? I have no experience on this...

Sub SendNew(Item As Outlook.MailItem)

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

objMsg.HTMLBody = Item.HTMLBody
CopyAttachments objMsg, Item

Sub CopyAttachments(objSourceItem, objTargetItem)
Set fso = CreateObject("Scripting.FileSystemObject")
Set fldTemp = fso.GetSpecialFolder(2) ' TemporaryFolder
strPath = fldTemp.Path & "\"
For Each objAtt In objSourceItem.Attachments
strFile = strPath & objAtt.FileName
objAtt.SaveAsFile strFile
fso.DeleteFile strFile
Next

Set fldTemp = Nothing
Set fso = Nothing

objMsg.Subject = "FW: " & Item.Subject

objMsg.Send

End Sub

• Diane Poremsky says

Close, the function is separate, added after the macro.

Sub SendNew(Item As Outlook.MailItem)

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

objMsg.HTMLBody = Item.HTMLBody
CopyAttachments objMsg, Item
objMsg.Subject = "FW: " & Item.Subject

objMsg.Send

End Sub

Sub CopyAttachments(objSourceItem, objTargetItem)
Set fso = CreateObject("Scripting.FileSystemObject")
Set fldTemp = fso.GetSpecialFolder(2) ' TemporaryFolder
strPath = fldTemp.Path & "\"
For Each objAtt In objSourceItem.Attachments
strFile = strPath & objAtt.FileName
objAtt.SaveAsFile strFile
fso.DeleteFile strFile
Next

Set fldTemp = Nothing
Set fso = Nothing
End Sub

• Jill Naus says

I get an Object Required error at this line:

• Diane Poremsky says

Are you using this macro? If you need the source and target emails, not the file.
Sub CopyAttachments(objSourceItem, objTargetItem)

• Jill Naus says

Thanks, Diane. I no longer get the error, but my forwarded emails still aren't showing their images. The images are included as attachments, but not showing in their proper place in the message body. This is the script I am using:

Dim objMail As Outlook.MailItem
Dim objMsg As Outlook.MailItem
Dim strbody As String
Dim oldmsg As String

Set objItem = Application.ActiveWindow.Selection.Item(1)
Set objMail = objItem.Forward

'adds the senders e-mail address as the created by object for the ticket and appends the message body
strbody = "Admin team,Please see below (and attached) for an admin request that was sent directly to a Planner. Will you please reach out to the customer and give them the correct contact information for future requests? Thank you."

'Searches for @ in the email address to determine if it is an exchange user

' If the address is an Exchange DN use the Senders Name
End If

Set objMsg = Application.CreateItem(olMailItem)

objMsg.HTMLBody = strbody & objItem.Forward.HTMLBody
If objItem.Attachments.Count > 0 Then
Call CopyAttachments(objItem, objMsg)
End If
objMsg.Subject = objItem.Subject

objMsg.Display

Set objItem = Nothing
Set objMail = Nothing
End Sub

Sub CopyAttachments(objSourceItem, objTargetItem)
Set fso = CreateObject("Scripting.FileSystemObject")
Set fldTemp = fso.GetSpecialFolder(2) ' TemporaryFolder
strPath = fldTemp.Path & "\"
For Each objatt In objSourceItem.Attachments
strFile = strPath & objatt.FileName
objatt.SaveAsFile strFile
fso.DeleteFile strFile
Next

Set fldTemp = Nothing
Set fso = Nothing
End Sub

• Diane Poremsky says

When you forward, the CID code changes and outlook can't identify the when attachment belongs to which placeholder.

• Jill Naus says

Is there a way to work around it?

• Diane Poremsky says

What you need to do is remove the image from the new message then re-imbed it so a new CID is generated, but i don't have any code that does that.

If the image properly displays when you click forward and send it, it should work to replace this objMsg.HTMLBody = strbody & objItem.Forward.HTMLBody with word code to insertbefore. The only problem with that code is that you need to display the message. The flash it creates is really annoying if you are trying to work.

• Jill Naus says

Worked like a charm, Diane! You are awesome!

50. Josh Heo says

Hi, Thanks again for the help..
Hmm.. I am still unable to see the picture after auto forwarding it to myself to test it...
Anything else to try out?

Thank you.

• Diane Poremsky says

Were the images attached in the original message or linked? If the macro doesn't add image attachments to the forward, then they are linked - and the link is messed up. Look at the source code of the original and forward message and see how the image is added and if there is anything different in the forward.

• Josh Heo says

I'm not sure if the image is attached or link in the original email.
When I forward the original email manually, the picture shows as it should. Error only happens when I use the script to auto-forward the email.

Only major difference I see is this.
------------------------------------------
Original email source
X-MS-Has-Attach: yes

Script Forwarded Email source
X-MS-Has-Attach:
-------------------------------------------

• Diane Poremsky says

looks like the image is embedded and not linked properly in the copy.

• Josh Heo says

Oh.. When I look at the email body's source code, it is whole lot different... not even sure where to begin..
I'll try and let you know..
Thank you so much!! feels like I'm getting there!

• Josh Heo says

Ok. Found the difference. There's a lot more code written in the original email where the pictures are inserted.

Original email body source (I'm starting from where I see major difference)

@list l0:level9
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:4.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l1
{mso-list-id:829977713;
mso-list-template-ids:-1328494356;}
@list l1:level1
{mso-level-number-format:bullet;
mso-level-text:\F0B7;
mso-level-tab-stop:.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l1:level2
{mso-level-number-format:bullet;
mso-level-text:\F0B7;
mso-level-tab-stop:1.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}

AND SO ON.....
=========================================
Script auto forwarded Email body source

@list l0:level9
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:4.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l1
{mso-list-id:1687898031;
mso-list-template-ids:2114627028;}
@list l2
{mso-list-id:2091350142;
mso-list-template-ids:-2020052588;}
ol
{margin-bottom:0in;}
ul
{margin-bottom:0in;}

and it ends soon
==========================================
I also see that in the

original email,.
mso-level-text:\F0B7;

Where as Script Email is
mso-level-text:;

• Diane Poremsky says

Images are missing, correct? You want to look for img tags.
<img src="http://www.domain.com/s.png" alt="">

They'll either begin with http:// (or just //) or cid:

• Josh Heo says

I ran and saw the source code again and it looks like I have it backwards.

Script Email is
mso-level-text:\F0B7;

original email is
mso-level-text:;

Also, forwarded email source code is a lot longer...

I am not sure if it makes any sense... confused..

• Josh Heo says

found the img tags...

src="cid:image001.jpg@01CFB225.F6ED3AB0"

Only issue is that both source is same for img tags....

• Diane Poremsky says

Wild guess: the GUID used with the cid (the part after the @) changes - oh, its in the header as a multipart mime. I'll see if there is a way to do it. You might need to use Forward instead of copying the body.

51. Ashleigh says

Hi, I have used script to change the name of an email and auto forward it regularly. Is was wondering if there is a way i can ensure the person who receives it can not auto forward it?

• Diane Poremsky says

No, you can't. Even things like signing it with a digital signature won't have much effect - the recipient can copy the text if they really want to share it.

• Ashleigh says

Ok, thanks! So the only way to select "do not autoforward" is manually each time through options-permissions-donotautoforward? If the recipient wants to copy the text I know i cant do much about that, but was hoping to make it harder for them to forward it automatically!

• Ashleigh says

Ok thanks! Just checking then, the only way to do this is manually by selecting options-permissions-donotforward? I know if soomeone wants to copy the text i cant really stop them, but just wanted to make it harder for them to forward it automatically!

• Diane Poremsky says

Correct. That may not prevent all recipients from forwarding it, but it is the only option.

• Ashleigh says

Thanks Diane, much appreciated. Just to confirm then, the only way to stop someone forwarding it easily is through options-permissions-do not forward. I know i cant stop anyone from copying the text and forwarding but was hoping to make it a bit harder!

• Diane Poremsky says

Correct. If you use IRM, it can block forwarding attachments, not sure about messages though. I discovered the other day that you don't need a corporate irm server to use it. You only need a non-free/non-isp address - microsoft calls it an organizational account - http://technet.microsoft.com/en-us/library/dn592127
i set up an account for testing but haven't had a lot of time to use it.

52. Ry says

How feasible is it to write a program to create rules in Outlook? I have a batch of rules I'd like to give to multiple users and would love to not have to create them for each person. The variables in the rules are almost the same for every user and could be tweaked to make it the same for every user as well.

53. Dheeraj Poojari says

Diane, brilliant post on outlook automation. Quick query to the one above(linked images by Josh). Instead of forwarding, I am using "reply" to respond using a particular oft template. The images do not come up, and they show the linked images error. Can you help me with modifying the code? Below is the code.

Sub ForwardGeneralNew()
Dim oExplorer As Outlook.Explorer
Dim oMail As MailItem
Dim Item As MailItem
Dim rMail As MailItem
Set oExplorer = Application.ActiveExplorer
Set oMail = oExplorer.Selection.Item(1).Forward
Set rMail = Application.CreateItemFromTemplate("C:\Macros\General.oft")
On Error GoTo Release
If oExplorer.Selection.Item(1).Class = olMail Then
oMail.Subject = "Testing a auto reply"
oMail.HTMLBody = rMail.HTMLBody _
& vbCrLf & oMail.HTMLBody
CopyAttachments oMail, Item
oMail.Recipients.Item(1).Resolve
If oMail.Recipients.Item(1).Resolved Then
oMail.Display
' oMail.Save
'oMail.Send
Else
MsgBox "Could not resolve " & oMail.Recipients.Item(1).Name
End If
Else
MsgBox ("Not a mail item")
End If
Release:
Set oMail = Nothing
Set oExplorer = Nothing
End Sub

• Diane Poremsky says

Are the images are embedded in the template?

54. Lance Hames says

I am looking for a solution to send a particular draft containing unique data to a customer after the notification that their invoice has been paid comes in from PayPal. Do you have any idea where I should start?

55. Lance Hames says

Diane,

I am trying to send an email draft when a particular email arrives. Where should I look to start for this? Is it something that can be done with this script?

Thanks,
Lance

• Diane Poremsky says

It would be easier to save the draft as a template and reply with the template. That can be done using either with a rule directly or using a run a script rule.

• Lance Hames says

How would I go about doing that? I couldn't quite figure out where to start. I'm at like ground zero with Outlook and VBA

• Diane Poremsky says

Create the message then use File, Save as and select template. You can save it to Documents or anywhere you want, just note where it is saved. Then you would use the template macro on this page to reply to them.

56. Joe says

Hi Diane

I copied your script 'forward message body to another address'. And created a rule to run script from any incoming email, excluding calendar invitations (in the rule). It worked twice. Then I received a calendar invite, and it didn't forward (as planned). However, the script doesn't work for normal emails anymore. Any advise.

• Diane Poremsky says

Is the rule disabled? Is VBA addin disabled? Was the macro security settings changed?

57. Fabio says

Hi Diane,
I just migrated from Lotus notes to Outlook 2010 and previously I had a rule that every message I received I would get a full copy on another email address. This meant that in the receiving inbox I could search by sender as it was showing exactly the same template as on my lotus note emails. This is different from forwarding a received message where in the address box I will have my forwarding address. I hope it is clear, and I wonder if it is possible at all with a script....

Fabio

58. DAVID NORDEL says

Hi Diane,
I am attempting to write a script that will forward part of the body of a message up to a certain string of characters, while maintaining the formating for pictures and text. I am trying to forward a newsletter to an outlook contact group, and I am unsure which function to call to copy the message body. I believe the pictures are embedded, but I am not exactly sure. I have yet to even get to the point where I can add in code to cut-off the body as I am still trying to just get the whole message to properly forward. My code is as follows:

Sub SendNew(Item As Outlook.MailItem)

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

objMsg.Body = Item.Body
CopyAttachments objMsg, Item
objMsg.Subject = Item.Subject

objMsg.Send

End Sub

Sub CopyAttachments(objSourceItem, objTargetItem)
Set fso = CreateObject("Scripting.FileSystemObject")
Set fldTemp = fso.GetSpecialFolder(2) ' TemporaryFolder
strPath = fldTemp.Path & "\"
For Each objAtt In objSourceItem.Attachments
strFile = strPath & objAtt.FileName
objAtt.SaveAsFile strFile
fso.DeleteFile strFile
Next

Set fldTemp = Nothing
Set fso = Nothing
End Sub

This script currently forwards the message without formatting or pictures, but includes the hyperlinks to the pictures. HELP! PLEASE!!!

Thank you for your time and consideration, and I look forward to hearing form you soon.

• Diane Poremsky says

Forwarding embedded pictures is difficult - they are attached then embedded in the code using a CID code. Do the images stay embedded if you forward the message? If so, it might be better to forward and remove the header.

Try using objMsg.HTMLBody = Item.HTMLBody

• DAVID NORDEL says

Thank you for the quick response Diane. I did, in fact, try using objMsg.HTMLBody = Item.HTMLBody without any luck. And the images do stay embedded when forwarding. I will try forwarding and removing the header. Thanks again!

59. M Saumure says

thank you for this!!

60. Moh says

Hi All,

Can anyone help with a script i have written to create and send a new email to a target recipient. My intention is to evaluate the incoming message subject then create a new message with the original subject, body and most importantly attachment. I've used the forwarding example above as a basis but not seeing any activity.

The script is as follows. Thanks!

Public Sub fwdReport(Item As Outlook.MailItem)

Dim objMsg As MailItem

If Item.Subject = "z" Then

Set objMsg = Application.CreateItem(olMailItem)

objMsg.Body = Item.Body
objMsg.Subject = Item.Subject
objMsg.Attachments = Item.Attachments

objMsg.Send

End If

End Sub

• Diane Poremsky says

The rule that checks the subject calls the macro when a match is found, so you don't need this line (or the end if):
If Item.Subject = "z" Then

the rest should work.

61. wdp says

Diane et al-

I created a script similar to the forward email - although instead of forwarding email body, it just forwards the name of the sender as the body. This worked great for 1 day - forwarding ~20 emails from Outlook 2010 to another email address perfectly.
Today, I changed the email address where the forwards are sent too and Outlook seems to have stopped running the rule/script. The computer was never logged/turned-off. Any idea why the rule would stop working (I assume this is at the rule level because I am not seeing anything in the sent box to indicate the rule/script was run)?

wdp

• Diane Poremsky says

Did you sign the original macro using a digital signature? If so, you need to remove the signature and re-sign it after editing it.

62. wdp says

If I open the VBA editor and search for digital signature it sys:
Certificate name: [No certificate]
Sign as
Certificate name: [No certificate]

This script is connected to my work email account and I'm wondering if somehow Admin has removed my ability to fwd incoming messages? That would explain why a couple dozen worked and then suddenly it stopped?

wdp

63. wdp says

Diane- After creating the self cert as described above, I realized I never closed outlook.
Upon re-open, I ran the rule and it worked!
Thank you so very much for your input/help on this.
Walt

64. Anonymous says

Diane - I tried to follow your instructions to make a certificate using selfcert http://www.slipstick.com/developer/how-to-use-outlooks-vba-editor/#selfcert
However, now I can't get the macros to run at all. When I restart Outlook it says "An error occurred while attempting to verify the VBA project's signature. Macros will be disabled." How can I remove the certificate/signature and go back to how it was working fine before? Thanks

• Anonymous says

OK apparently I was missing the step where you have to save before closing VBA. Once I saved in VBA, then closed, then closed Outlook, and clicked yes when asked to save again, it worked. Also, I didn't realize you could always "Trust" (by clicking the left button on the popup window before allowing the macro) it so you wouldn't have to click "enable macro" every time (middle button on that popup window) after restarting Outlook, so that is nice that it seems to just stay active now. Now my problem is I can't find the Macro in the Macro list when I am trying to add it to the toolbar/ribbon using your instructions: http://www.slipstick.com/developer/how-to-use-outlooks-vba-editor/

• Diane Poremsky says

Run a script rules won't be the macro list since it can't be run manually. You would need ot edit the macro or use a stub to call it, if you wanted to use it in a script and call it manually.

You can use this stub to run a macro from a button and also in a script. Replace macro-name with the name of the macro. This works on the selected message.

Public Sub RunManaully()
Dim objItem
Set objItem = Application.ActiveExplorer.Selection.Item(1)
macro-name objItem
End Sub

• Diane Poremsky says

In the VB editor, go into tools, digital signature and remove the signature. click save in the VB Editor then close Outlook and click Save again, if asked.

65. Anonymous says

Another question - ever since I added my macro months ago I will intermittently (maybe once per day) get the error popup " "Rules In Error, The Operation Failed" and the macro doesn't work. I have generally just closed the error message, and gone into Manage Rules & Alerts and re-checked the box next to my rule which fixes the problem, but it is annoying. Any idea why this would be happening or how to fix it?

• Diane Poremsky says

Is this the macro that is filing? Is it being triggered on meetings, receipts, or other non-mail mail?

• Anonymous says

Yes it is related to the macro because when the error message appears it will stop working. I don't get read receipts, and I rarely get meetings, but it is definitely triggered on regular email.

• Diane Poremsky says

The only thing I am aware of that can cause problems in rules is if you receive a lot of mail fast - the rule can fail to trigger. This doesn't normally cause it to be disabled as a failure, but it's possible if the script is busy, it could cause the rule to be marked a failure.

One possible fix is to move the meat of the script into a second script. The script the rule uses keeps any If statements you might use to increase filtering then hands off to the script that actually does the work. I found this helps to prevent failures on one macro i use that processes a lot of mail.

• Anonymous says

Here is the script - how would I split into a second script as you suggest? It already seems pretty basic:

Sub SendNew(Item As Outlook.MailItem)

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

objMsg.Subject = Item.Sender

objMsg.DeleteAfterSubmit = True

objMsg.Send

End Sub

• Diane Poremsky says

At the very basic, this should work. If you need to filter using an If then statement, you'll do it in the sendnew macro before handing it off to the sendmail macro.

Sub SendNew(Item As Outlook.MailItem)

sendmail item
End Sub

Private Sub SendMail(Item As Outlook.MailItem)
Dim objMsg As MailItem
Set objMsg = Application.CreateItem(olMailItem)
objMsg.Subject = Item.Sender
objMsg.DeleteAfterSubmit = True
objMsg.Send
End Sub

• Anonymous says

Thanks - so can i just add those 3 lines at the top of my current macro, or are you saying I have to create a separate project in VBA for these new lines?

• Diane Poremsky says

Sub SendNew(Item As Outlook.MailItem)
sendmail item
End Sub

This macro calls the Sendmail macro and hands the processing off to it, leaving it free to process the next message.

66. wdp says

Diane et al-
Lets say I want to include the date/time the original email message was received in the subject of the message that gets forwarded.
What is the "item" for that?

Currently I am using the following in the subject line:
objMsg.Subject = Item.Sender & Item.Subject

Which gives me the sender and subject but I'd like to include the time/date as well.
Thanks,

wdp

• Diane Poremsky says

67. Zachary Bass says

HI Diane: I've added a rule along with your code sample below to ThisOutlookSession in order to forward an e-mail with attachment but I would also like to remove the four lines below that are added to a forwarded message. The idea is remove these lines so that the e-mail appears as new and not forwarded. The lines are not part of the body and I'm not clear how to delete. Thanks for any help.

From: johndoe@xyzcompany.com
Sent: Monday, March 16, 2015 2:34 PM
To: jeff@123company.com
Subject: Weekly Test Report

'// Code sample
Sub TestForward(item As Outlook.MailItem)
Dim myForward As Object

item.Subject = "Weekly Test Report"
item.Save

Set myForward = item.Forward

myForward.Send

End Sub

• Diane Poremsky says

Removing the lines is hard - but you could use myforward.body = item.body instead.

68. Zachary Bass says

Works great. Thank you very much. Similarly I set the myForward.Subject to Item.Subject to get rid of the "Fwd: " in the subject.

Item.Body = ""
Item.Save
Set myForward = Item.Forward
With myForward
.Body = Item.Body
.Subject = Item.Subject
End With

69. Tana says

Ok I have a general mailbox to which users submit meeting agenda items. In addition, I use this email to respond with questions, follow-up, & clarifications. This is a business email & we have an exchange server.

From what I understand if I use a Rule, it only runs when Outlook is open and running.

If I use Automatic Replies, it only sends one reply per sender.

What I want is a auto-reply acknowledging receipt of submission, so only one reply per user per subject.

Example: If bob@xyz.com sends in an email with subject line "Minutes for approval". I want him to get one autoreply. If I email bob asking for clarification and he replies to my email I do not want him to get the autoreply (assuming the subject line remains the same).

Also if bob@xyz.com sends another email, but with subject line "Board appointment", I want him to get a separate autoreply.

Every rule I see would work ok if bob only sent one email, but when he sends multiple with multiple subjects...that's where I need help...

• Diane Poremsky says

You can do this using vba but, like rules, it will only run when outlook is open. You'd filter for messages beginning with RE: or FW: then send a reply to the remaining.

70. Stephen M says

Hello Diane
I would like to change the subject of an autoBCC rule i found
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
Dim objRecip As Recipient
Dim strMsg As String
Dim res As Integer
Dim strBcc As String
On Error Resume Next

' #### USER OPTIONS ####
' to a name in the address book

objRecip.Type = olBCC
If Not objRecip.Resolve Then
strMsg = "Could not resolve the Bcc recipient. " & _
"Do you want still to send the message?"
res = MsgBox(strMsg, vbYesNo + vbDefaultButton1, _
"Could Not Resolve Bcc Recipient")
If res = vbNo Then
Cancel = True
End If
End If

Set objRecip = Nothing
End Sub

how would change the subject of this rule?
thank you

71. Anonymous says

What are the steps to add a second macro?

• Diane Poremsky says

Add the itemsend macro (the second macro to ThisOutlookSession. It gets the addresses in the CC field and cc's the message. If you wanted to send all messages to a specific address, change objMsg.CC = Item.CC to objMsg.CC = "email@address.com". if you want it to apply to all messages, you'll need to move the end if up under Next i.

72. Anonymous says

Got the macro to work, but it still crashes periodically. Thanks though

• Diane Poremsky says

it shouldn't cause it to crash. Does it crash at all if you disable the rule? (I'm thinking something else is causing it to crash.)

73. Anonymous says

No - when I say crash I don't mean Outlook shuts down or the computer freezes, I just mean the rule fails and it won't work again until I go in and check off the box in the rules again.

74. seb says

Hi,

I receive an email from a generic address, with the address of a person in CC .

I would like to transfer the email by adding a model answer, ONLY to the person in CC.

how to do that?

thanks.

• Diane Poremsky says

Are you replying with an answer or using a template? Assuming it's the only name in the CC field, use objMsg.to = item.cc or objMsg.Recipients.Add item.cc

75. seb says

Thanks, it seems to work with objMsg.CC = Item.CC

I have another noob question: the script only work when outlook is open, right?

How to deal with messages i received when outlook is closed? sorry if i miss something...

• Diane Poremsky says

Correct, it only runs when outlook is open. Unfortunately there is no way to run it if outlook isn't open - you'd need something on the server or a standalone utility that could ping the mailbox.

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

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