QuickFiler: an Outlook 2010 add-in to file quickly your mail
The processing of incoming mail messages can be a very challenging and time-consuming task. Outlook contains some built-in tools to help you with this. Grouping your messages in discussions is a very useful way to quickly scan related emails. By creating rules you can perform many actions automatically. Among others you can have your message moved to a folder on receiving. In Outlook 2010 also Quick Rules were introduced which makes the creation of rules a lot easier and more flexible.
Still it is not possible to have all mail in your Inbox being opened one-by-one to read and have it filed or deleted without having to perform several click actions. In real life you would empty your mailbox and skim through a pile of mail opening them one-by-one, throw away immediately uninteresting items and file the important ones.
This QuickFiler add-in makes it very easy to perform this kind of sorting of your incoming mail. The first time you move a message from your inbox to a folder a window will appear which allows you to create a QuickFiler rule. On receiving new mails from the same sender a window will appear which will allow you to repeat this action just by tapping on Enter.
If you move a mail for the first time to a folder a window will show which looks something like below.
Once a QuickFiler rule is created a window will appear each time when in your Inbox a message is selected that meets the conditions of the rule.
Download the Outlook 2010 QuickFiler add-in source files and setup.
The most essential source code is in ThisAddIn.vb and is listed below.
Public Class ThisAddIn Dim WithEvents objInspectors As Outlook.Inspectors Dim WithEvents objOpenInspector As Outlook.Inspector Dim WithEvents objMailItem As Outlook.MailItem Dim WithEvents myOlExp As Outlook.Explorer Dim colRules As Rules Dim CurrentRule As Rule Dim bNoAction As Boolean Dim dlgExistingRule As DialogExistingRule Dim dlgCreateRule As DialogCreateRule Private Sub ThisAddIn_Startup(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Startup colRules = New Rules 'rules are read from rules file End Sub Private Sub Application_Startup() Handles Application.Startup objInspectors = Application.Inspectors myOlExp = Application.ActiveExplorer End Sub Private Sub myOlExp_Activate() Handles myOlExp.Activate If CurrentRule IsNot Nothing Then MoveMessage(CurrentRule.TargetPathOlkFolder, objMailItem, True) End If CurrentRule = Nothing objMailItem = Nothing End Sub Private Sub myOlExp_BeforeItemPaste(ByRef ClipboardContent As Object, _ ByVal Target As Microsoft.Office.Interop.Outlook.MAPIFolder, _ ByRef Cancel As Boolean) Handles myOlExp.BeforeItemPaste Dim sRuleSenderName As String If ClipboardContent.Count = 0 Then Exit Sub With ClipboardContent.Item(1) CurrentRule = colRules.FindRule(.SenderName) If CurrentRule IsNot Nothing Then 'Search string is found in name sender 'Dont create another rule 'Cancel = False 'NB Don't set Cancel=False, it will actually do cancel?? Exit Sub End If dlgCreateRule = New DialogCreateRule With dlgCreateRule .txtFolderPath.Text = _ Replace(.txtFolderPath.Text, "<TargetPathOlkFolder>", Target.FolderPath) .txtSenderSearchText.Text = ClipboardContent.Item(1).SenderName If .ShowDialog = Windows.Forms.DialogResult.OK Then If .radioCreateRule.Checked = True Then sRuleSenderName = .txtSenderSearchText.Text If sRuleSenderName <> "" Then Dim r As New Rule(sRuleSenderName, Target.FolderPath, _ .chkOpenToRead.Checked) colRules.Add(r) End If End If If .radioDisableQuickFiler.Checked Then bNoAction = True End If End If End With End With End Sub Private Sub myOlExp_SelectionChange() Handles myOlExp.SelectionChange Dim oMail As Object If bNoAction Then Exit Sub 'Only check messages in the Inbox folder If myOlExp.CurrentFolder.Name <> _ Application.GetNamespace("MAPI") _ .GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox).Name Then Exit Sub If myOlExp.Selection.Count <> 1 Then Exit Sub 'see also: 'How To Get the Currently Selected Item in an Outlook Folder from Visual Basic 'http://support.microsoft.com/kb/240935 CurrentRule = Nothing For Each oMail In myOlExp.Selection If oMail.MessageClass = "IPM.Note" Then objMailItem = oMail CurrentRule = colRules.FindRule(objMailItem.SenderName) If CurrentRule IsNot Nothing Then If CurrentRule.OpenToRead = True Then objMailItem.GetInspector.Activate() 'show mail in new window Else MoveMessage(CurrentRule.TargetPathOlkFolder, objMailItem, True) End If End If End If Next End Sub Sub MoveMessage(ByVal strFolder As String, ByRef olkItem As Outlook.MailItem, _ ByVal bAsk As Boolean) 'See also 'http://www.experts-exchange.com/Programming/Languages/Visual_Basic/VB_Script/Q_22970838.html Dim olkFolder As Outlook.MAPIFolder olkFolder = GetOlkFolder(strFolder) If olkFolder Is Nothing Then Exit Sub If CurrentRule Is Nothing Then Exit Sub If olkItem Is Nothing Then Exit Sub If TypeName(olkFolder) = "MAPIFolder" _ Then Exit Sub 'ignore moving mail to the same folder If olkItem.Parent.FullFolderPath = olkFolder.FolderPath Then Exit Sub If bAsk = True Then Try dlgExistingRule = New DialogExistingRule With dlgExistingRule .txtFolderPath.Text = _ Replace(.txtFolderPath.Text, "<SenderSearchString>", _ CurrentRule.SenderSearchString) .txtFolderPath.Text = _ Replace(.txtFolderPath.Text, "<TargetPathOlkFolder>", _ olkFolder.FolderPath) If .ShowDialog = Windows.Forms.DialogResult.OK Then If .radioMoveMessage.Checked Then olkItem.Move(olkFolder) If .radioIgnoreRule.Checked Then _ colRules.IgnoreRuleThisSession(CurrentRule.SenderSearchString) If .radioDeleteRule.Checked Then _ colRules.DeleteRule(CurrentRule.SenderSearchString) If .radioDisableQuickFiler.Checked Then bNoAction = True End If End With Catch Select Case Err.Number Case -347864822 '&HAB44010A ? 'item moved or deleted Case Is <> 0 MsgBox(Err.Number & Err.Description & " in MoveMessage") End Select End Try End If End If olkFolder = Nothing olkItem = Nothing End Sub Public Function GetOlkFolder(ByVal strFolderPath As String) As Outlook.MAPIFolder ' strFolderPath needs to be something like ' "Public Folders\All Public Folders\Company\Sales" or ' "Personal Folders\Inbox\My Folder" 'See also http://www.gregthatcher.com/Scripts/VBA/Outlook/GetListOfStores.aspx Dim colFolders As Outlook.Folders Dim objFolder As Outlook.MAPIFolder Dim arrFolders As String() Dim I As Long Dim Item As Object On Error Resume Next 'remove 2 leading backslashes before the root folder name If Left(strFolderPath, 2) = "\\" Then strFolderPath = Mid(strFolderPath, 3) strFolderPath = Replace(strFolderPath, "/", "\") strFolderPath = Replace(strFolderPath, """", "") arrFolders = Split(strFolderPath, "\") 'Get the root folder of the active store objFolder = _ Application.GetNamespace("MAPI").GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) _ .Store.GetRootFolder 'If this fails try to get the root folder from the argument strFolderPath which is read from 'rules file 'This could occur if the rules in the rules file were created with another Outlook 'installation 'and the name of the default store has been changed. If objFolder Is Nothing Then objFolder = Application.GetNamespace("MAPI").Folders(arrFolders(0)) End If If Not objFolder Is Nothing Then For I = 1 To UBound(arrFolders) colFolders = objFolder.Folders objFolder = Nothing objFolder = colFolders.Item(arrFolders(I)) If objFolder Is Nothing Then Exit For End If Next End If GetOlkFolder = objFolder End Function End Class