Run a Script Rule: Send a new message when a message arrives

Last reviewed on March 14, 2014   —  145 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, 
' set the addresses here
'objMsg.Recipients.Add "alias@domain.com"

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")

objMsg.Recipients.Add Item.SenderEmailAddress

' 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.Recipients.Add "alias@domain.com"

objMsg.Send

End Sub

About Diane Poremsky

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

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

145 responses to “Run a Script Rule: Send a new message when a message arrives”

  1. Manuel Ratzinger

    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.

    1. Diane Poremsky

      Try using SentOnBehalfOfName -

      objMsg.SentOnBehalfOfName = "me@here.com"

  2. Eric

    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

    1. Diane Poremsky

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

  3. Manuel Ratzinger

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

  4. Eric

    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
    objMsg.Recipients.Add "Eric@companyname.com"

  5. Eric

    Got it to work. :)

  6. Barney

    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.
    I copied your code, followed your instructions but nothing happens.
    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,
    ' set the addresses here
    bjMsg.Recipients.Add "bk@acp.com.au"

    objMsg.Send

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

    1. Diane Poremsky

      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.
      bjMsg.Recipients.Add "bk@acp.com.au

  7. Barney

    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,
    ' set the addresses here
    objMsg.Recipients.Add "bk@acp.com.au"

    objMsg.Display

    End Sub

    1. Diane Poremsky

      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

    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.

    Any advice?

    Thanks

    1. Diane Poremsky

      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

    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.

    1. Diane Poremsky

      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

    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.
    Your details are as follows:-
    Username: Misa
    Password: Provided when you registered.
    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

    1. Diane Poremsky

      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

    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?

    1. Diane Poremsky

      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

    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?

    1. Diane Poremsky

      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

    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...

    1. Diane Poremsky

      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

    what i have to insert in this option objMsg.Body

    1. Diane Poremsky

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

  15. seb

    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.

    1. Diane Poremsky

      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

    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?

    1. Diane Poremsky

      You'll need to parse the body and look for the address, and yes, i have a script for that. :)

      Use regex to get values has the basics, http://forums.slipstick.com/ has a sample. There is a run a script rule sample as the last macro on this page - run-script-rule-change-subject-message/

  17. Richard

    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

    1. Diane Poremsky

      One string with semi-colon delimiters should work -
      objMsg.Recipients.Add "alias@domain.com;another@domain.com"

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

  18. Richard

    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.Recipients.Add "01888@123.biz;01885@123.biz;01883@123.biz;01881@123.biz"

    objMsg.Send

    End Sub

    The module code is below also

    Sub webserver()

    End Sub

    1. Diane Poremsky

      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

    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
    Msg.Recipients.Add "alias@domain.com"
    objMsg.Send
    End Sub

  20. Heri

    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

    1. Diane Poremsky

      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

    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)
    the Auto BCC triggers and I get an alert on my device "email received at bccadd@testing.com"

    Many thanks in advance,

    Karen

    1. Diane Poremsky

      you could use an application start up to create the email, but if the bcc macro is failing, it might fail as well. It might be better to use a reminder to trigger a new email - just don't dismiss the reminder. http://www.slipstick.com/developer/send-email-outlook-reminders-fires/

  22. Karen

    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

    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

    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.

    1. Diane Poremsky

      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

    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.

    Please advise.

    1. Diane Poremsky

      What condition are you trying to use?

  26. Tera

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

  27. Tera

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

    1. Diane Poremsky

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

  28. Tera

    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.

    1. Diane Poremsky

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

  29. Tera

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

  30. Jenny C

    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.Recipients.Add "alias@domain.com"

    myForward.Send

    End Sub

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

    Thank you

    1. Diane Poremsky

      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

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

    1. Diane Poremsky

      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

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

    1. Diane Poremsky

      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.)

    2. Diane Poremsky

      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

    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?

    1. Diane Poremsky

      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

    Yes, it is always a voting message.

    1. Diane Poremsky

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

  35. Doug

    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!

    1. Diane Poremsky

      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 -
      if item.senderemailaddress = "alias@domain.com" then
      'do the stuff
      else
      end if

  36. Russell Brown

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

  37. Nasim rawat

    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.

    1. Diane Poremsky

      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

    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.Subject = Item.SenderEmailAddress
    objMsg.Recipients.Add "_______@______.com"

    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
    '
    ' 'Add the body
    ' 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

    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?

    1. Diane Poremsky

      If you need to watch the sent folder, you'll have to use an itemadd or itemsend macro. The code sample here - http://www.slipstick.com/developer/code-samples/use-a-macro-to-move-imap-account-sent-items/ - should point you in the right direction. You'll use item.delete instead of the move stuff.

  40. Nasim rawat

    yes i have also include attachment.

  41. Anonymous

    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.Body = Item.SenderEmailAddress
    objMsg.Subject = Item.Sender
    objMsg.Recipients.Add "________@_____.com"

    objMsg.DeleteAfterSubmit = True

    objMsg.Send

    End Sub

  42. Nic Xiaoyu Qi

    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.

    1. Diane Poremsky

      see the code sample near the bottpm f this page: http://www.slipstick.com/outlook/rules/create-task-email-rule/

  43. Kathy Oliver

    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.

    1. Diane Poremsky

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

  44. Michael Martin

    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

    1. Diane Poremsky

      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

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

  46. Anthony Parchmont

    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.

    1. Diane Poremsky

      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
      .attachments.add item
      .Recipients.Add "alias@domain.com"
      .Send
      end with

  47. Anthony Parchmont

    Thank you, works like charm!

    1. Anthony Parchmont

      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

      Please help me with one.

    2. Diane Poremsky

      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

    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.

    1. Diane Poremsky

      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

    2. Ken Rogers

      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.

    3. Diane Poremsky

      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

    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?

    1. Diane Poremsky

      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
      objTargetItem.Attachments.Add strFile, , , objAtt.DisplayName
      fso.DeleteFile strFile
      Next

      Set fldTemp = Nothing
      Set fso = Nothing
      End Sub

    2. Josh Heo

      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
      objTargetItem.Attachments.Add strFile, , , objAtt.DisplayName
      fso.DeleteFile strFile
      Next

      Set fldTemp = Nothing
      Set fso = Nothing

      objMsg.Subject = "FW: " & Item.Subject
      objMsg.Recipients.Add "junheo01@gmail.com"

      objMsg.Send

      End Sub

    3. Diane Poremsky

      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.Recipients.Add "junheo01@gmail.com"

      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
      objTargetItem.Attachments.Add strFile, , , objAtt.DisplayName
      fso.DeleteFile strFile
      Next

      Set fldTemp = Nothing
      Set fso = Nothing
      End Sub

    4. Jill Naus

      I get an Object Required error at this line:

      objTargetItem.Attachments.Add strFile, , , objAtt.DisplayName

    5. Diane Poremsky

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

    6. Jill Naus

      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:

      Sub FwdAdminEmailtoPlanner()
      Dim adminaddress As String
      Dim objMail As Outlook.MailItem
      Dim objMsg As Outlook.MailItem
      Dim strbody As String
      Dim oldmsg As String
      Dim senderaddress As String
      Dim addresstype As Integer

      ' Set this variable as your helpdesk e-mail address
      adminaddress = "address@server.com"

      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."

      ' Sender E=mail Address
      senderaddress = objItem.SenderEmailAddress

      'Searches for @ in the email address to determine if it is an exchange user
      addresstype = InStr(senderaddress, "@")

      ' If the address is an Exchange DN use the Senders Name
      If addresstype = 0 Then
      senderaddress = objItem.SenderName
      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.To = adminaddress
      objMsg.Attachments.Add objItem, olEmbeddeditem
      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
      objTargetItem.Attachments.Add strFile, , , objatt.DisplayName
      fso.DeleteFile strFile
      Next

      Set fldTemp = Nothing
      Set fso = Nothing
      End Sub

    7. Diane Poremsky

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

    8. Jill Naus

      Is there a way to work around it?

    9. Diane Poremsky

      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.

    10. Jill Naus

      Worked like a charm, Diane! You are awesome!

  50. Josh Heo

    Hi, Thanks again for the help..
    Hmm.. I am still unable to see the picture after auto forwarding it to myself to test it...
    I tried to "click here to download pictures..." and still same "x"
    Anything else to try out?

    Thank you.

    1. Diane Poremsky

      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.

    2. Josh Heo

      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:
      -------------------------------------------

    3. Diane Poremsky

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

    4. Josh Heo

      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!

    5. Josh Heo

      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:;

    6. Diane Poremsky

      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:

    7. Josh Heo

      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..

    8. Josh Heo

      found the img tags...

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

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

    9. Diane Poremsky

      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

    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?

    1. Diane Poremsky

      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.

    2. Ashleigh

      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!

    3. Ashleigh

      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!

    4. Diane Poremsky

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

    5. Ashleigh

      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!

    6. Diane Poremsky

      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

    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.

    1. Diane Poremsky

      You can create some rules using VBA - i have a basic sample that reads rules here - http://www.slipstick.com/outlook/rules/create-list-rules/ - to give you an idea about what is involved. Your script would need to create the rules obviously.

  53. Dheeraj Poojari

    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
    oExplorer.Selection.Item(1).UnRead = False
    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.Add "x@y.com"
    oMail.Recipients.Item(1).Resolve
    If oMail.Recipients.Item(1).Resolved Then
    oMail.Display
    ' oMail.Save
    'oMail.Send
    oMail.UnRead = False
    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

    1. Diane Poremsky

      Are the images are embedded in the template?

  54. Lance Hames

    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

    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

    1. Diane Poremsky

      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.

    2. Lance Hames

      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

  56. Joe

    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.

    1. Diane Poremsky

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

  57. Fabio

    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....

    Many thanks for your time.

    Fabio

  58. DAVID NORDEL

    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.Recipients.Add ("COI Test Group")

    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
    objTargetItem.Attachments.Add strFile, , , objAtt.DisplayName
    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.

    1. DAVID NORDEL

      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

    thank you for this!!

  60. Moh

    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.Recipients.Add "RECIPIENT'S EMAIL"

    objMsg.Send

    End If

    End Sub

  61. wdp

    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

  62. wdp

    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

    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

    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

    1. Anonymous

      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/

  65. Zachary Bass

    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.Recipients.Add "joeblow@comcast.net"

    myForward.Send

    End Sub

  66. Zachary Bass

    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

Leave a Reply

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

This site uses XenWord.