2
votes

I have a question about Outlook Rules in Powershell. I wrote some code that successfully stores any incoming e-mail from a certain sender to the deleted-items folder. I did this because when the mails enter the junk folder, the junk folder still has the counter token of mails, so in the end it will say I have 10-mails in the junk folder.

I want to avoid this by just throwing the incoming mails from that sender to the deleted-items folder and also marking the mail as "read" so that I don't see the clutter in the deleted items folder.

The question is really:

  • Can I add multiple actions to the same outlook rule in powershell? if so, how?
  • What is the syntax / code for the "run script" action?

My code so far:

$ol = New-Object -ComObject Outlook.Application
$ns = $ol.GetNamespace("MAPI")

$olFolders = "Microsoft.Office.Interop.Outlook.OlDefaultFolders"
$outlook = New-Object -ComObject outlook.application
$namespace  = $Outlook.GetNameSpace("MAPI")

$inBox = $ns.GetDefaultFolder([Microsoft.Office.Interop.Outlook.OlDefaultFolders]::olFolderInbox)
$deleted = $ns.GetDefaultFolder([Microsoft.Office.Interop.Outlook.OlDefaultFolders]::olFolderDeletedItems)

$rules = $outlook.session.DefaultStore.GetRules()
$rule = $rules.create("Move mail: to DeletedItems", [Microsoft.Office.Interop.Outlook.OlRuleType]::olRuleReceive)

$rule_Address = $rule.Conditions.SenderAddress
$rule_Address.Enabled = $true
$rule_Address.Address = @("<Sender Address>")
$action = $rule.Actions.MoveToFolder
$action.Enabled = $true 

[Microsoft.Office.Interop.Outlook._MoveOrCopyRuleAction].InvokeMember("Folder",[System.Reflection.BindingFlags]::SetProperty,$null, $action, $deleted)

$rules.Save()

This code works so far.

Please help. Thanks!

1

1 Answers

4
votes

Can I add multiple actions to the same outlook rule in powershell? if so, how?

Took a bit but I got a working test that uses multiple actions applied to a single rule. It is actually easy and you just need to repeat the steps you have already done and create a different action variable.

In my example, just showing the end of the code, I have added a action to display a message in the New Item Alert window.

...
$action = $rule.Actions.MoveToFolder
$action.Enabled = $true 

$anotherAction = $rule.Actions.NewItemAlert
$anotherAction.Text = "I am awesome!"
$anotherAction.Enabled = $true 

[Microsoft.Office.Interop.Outlook._MoveOrCopyRuleAction].InvokeMember("Folder",[System.Reflection.BindingFlags]::SetProperty,$null, $action, $deleted)

$rules.Save()

You quite possibly already tried something like this. If not there is an important reference for this that you need to be aware of.

What is the syntax / code for the "run script" action?

This is one of the actions you cannot programatically set as per this reference for Office 2007 or this one for Office 2010/2013. The tables are similar and rather large to include here but I will reference the one in your 2nd bullet.

Action                                              : Start a script
Constant in olRuleActionType                        : olRuleActionRunScript
Supported when creating new rules programmatically? : No
Apply to olRuleReceive rules?                       : Yes
Apply to olRuleSend rules?                          : No

There are others as well where you are restricted. So you need to keep that in mind when you are making your rules.