Tuesday, February 15, 2005

Creating one off SCL Rules with the Rule.dll

When using the IMF to do spam filtering you do get the occasional user where the SCL store threshold is set a little too high. Eg if you have the store threshold set to 6 and one user is getting a lot of SPAM that is getting a SCL of 5 having a one-off type trick to push these emails into the junk email folder can come in handy.

One way to do this is using the old Rule.dll COM component to create a server side rule in the inbox. Rule.dll has been around since Exchange 5.5 and because its mapi based it still works as it did back Exchange 5.5. There’s a great reference page with a lot samples on MSDN here

Some fast hard facts about using the rule.dll, Rules created using the rule.dll can’t be seen, deleted or modified using Outlook. And you still need to watch out for the 32 KB rules limit on a folder. There is a copy of the rule.dll included in one of the samples on CDOlive http://www.cdolive.net/download/ruleasp.zip or there should be a copy in the Platform SDK.

So to create a Rule base on the SCL value of an email you need to look at using the (PR_CONTENT_FILTER_SCL &H40760003) mapi property. So what the script does is first logs on the target mailbox finds the junk email folder by going though all the top level folders in the mailbox. Then creates a rule with a PropertyCondition so that if any mail is recived with a SCL of 5 then it gets moved into the junk email folder.

I’ve posted up a download copy of the code here
The script looks like


const REL_EQ = 7
Const ACTION_MOVE = 1
const CdoPR_CONTENT_FILTER_SCL = &H40760003
const SCL_VAL = 5

servername = "servername"
mailboxname = "mailboxalias"

Set objSession = CreateObject("MAPI.Session")

objSession.Logon "","",false,true,true,true,servername & vbLF & mailboxname
Set objRules = CreateObject("MSExchange.Rules")
objRules.Folder = objSession.Inbox
Set objInbox = objSession.Inbox

Set CdoInfoStore = objSession.GetInfoStore
Set CdoFolderRoot = CdoInfoStore.RootFolder
Set CdoFolders = CdoFolderRoot.Folders

bFound = False
Set CdoFolder = CdoFolders.GetFirst
Do While (Not bFound) And Not (CdoFolder Is Nothing)
If CdoFolder.Name = "Junk E-mail" Then
bFound = True
Else
Set CdoFolder = CdoFolders.GetNext
End If
Loop
Set ActionFolder = CdoFolder

Set importPropVal = CreateObject("MSExchange.PropertyValue")
importPropVal.Tag = CdoPR_CONTENT_FILTER_SCL
importPropVal.Value = SCL_VAL

Set importPropCond = CreateObject("MSExchange.PropertyCondition")
importPropCond.PropertyTag = CdoPR_CONTENT_FILTER_SCL
importPropCond.Operator = REL_EQ
importPropCond.Value = importPropVal

' Create action
Set objAction = CreateObject("MSExchange.Action")
objAction.ActionType = ACTION_MOVE
objAction.Arg = ActionFolder

' Create new rule
Set objRule = CreateObject("MSExchange.Rule")
objRule.Name = "SCL VAL Move"

' Add action and assign condition
objRule.Actions.Add , objAction
objRule.Condition = importPropCond

' Add rule and update
objRules.Add , objRule
objRules.Update

' Log off and cleanup
objSession.Logoff

Set objRules = Nothing
Set objSession = Nothing
Set importProp = Nothing
Set importPropVal = Nothing
Set objAction = Nothing
Set objRule = Nothing