You’ve been using Outlook for years now and you’ve probably established some delivery rules for yourself. Maybe mail from your manager is automatically routed to a subfolder of your inbox. If you’re using Outlook 2003 or later, you’ve got an automatically maintained rule to handle junk mail. If you’ve ever set your Out Of Office, that’s handled by a rule too.
But how do rules actually work? What’s the implementation like? Obviously, I won’t get into the grimy details (trade secrets and all), but I can pass along the basics.
First, the rules infrastructure is fully documented on MSDN. Those among you brave enough to explore this documentation may be inspired to write a little app which will enumerate your inbox rules and print them out on the console for detailed inspection of just what Outlook creates. I wrote such an app for internal diagnostic purposes (which means I most likely can’t share it with you, sorry). Oh wait! Someone else has already published something here!
A rule consists of two fundamental properties, and a bunch of other support properties which mostly won’t matter for this discussion. The important ones are the rule’s conditions, and the rule’s actions. Simplistically, if the incoming mail passes the restriction, the rule engine subsequently carries out the actions. The rule engine itself is completely agnostic to the intentions of the rule creator. In other words, the rule engine doesn’t care what the title of the rule type in Outlook’s wizard is – it only applies the restriction and then if that passes, it carries out the actions.
The conditions are expressed as a MAPI Restriction. As each mail is delivered, the restriction on each rule is applied to the incoming message. The restriction describes a complex property value comparison tree, such as (the received time > somedatetime AND the sender’s display name starts with “Bob” AND the body contains “Loser”) OR (the message size is greater than 2k). Such restrictions are also used for searching for messages, filtering views, and so on. In this case, the restriction is applied to the incoming message. This means that rules cannot check against dynamic values, such as the current system time or how big the mailbox is. It’s constrained to checking properties of the message against constant values. One exception to this is how the Junk Mail rule works, which I’ll describe later.
Exchange Server, Exchange Server 2007, Outlook, Tips and Tricks, Knowledgebase, Article