HOWTO: Delete Search Folders and Interop with CDO 1.21 from Managed (.NET) Code
The Outlook 2003 Object Model does not have anyway to delete Search Folders, although you can create them. The only way to delete them is to use CDO 1.21 code. However, it is not supported to run CDO 1.21 or MAPI code (yes, this includes Redemption any third party APIs or components you write that use MAPI/CDO 1.21 directly) *in-process* with managed .NET code. This means that simply wrapping the CDO 1.21 code below in a COM component is not enough, the code must live in its own process. The easiest way I know of to do that is hop back over to good ‘ole VB6 and create a very simple ActiveX EXE. This is a very simple way to run all CDO code in one process while the managed OOM code runs in another process (such as Outlook.EXE) without having to do too many configuration or deployment backflips.
In fact, the code below comes directly from an ActiveX EXE created to allow the deleting of Search Folders…
'-------------------------------------------------------
' DeleteSearchFolder
' mstehle, 07.27.07
'-------------------------------------------------------
' This CDO 1.21 code is hosted in an simple ActiveX EXE
' so that it can be called from a .NET application. The
' code runs in a seperate process which allows us to
' call it from the managed process without fear of memory
' issues.
'--------------------------------------------------------
Public Sub DeleteSearchFolder(ByVal strName As String)
Dim oSession As MAPI.Session
oSession = New MAPI.Session
' Assume we are already logged in to a session and
' piggy-back the session...
oSession.Logon, , False, False
Dim oFinderFolder As MAPI.Folder
oFinderFolder = GetFinderFolder(oSession)
' Throw error if folder not found
If oFinderFolder Is Nothing Then
Err.Raise(MAPI.CdoE_NOT_FOUND, "DeleteSearchFolder", _
"Finder folder not found.")
End If
Dim oSearchFolder As MAPI.Folder
oSearchFolder = GetFolder(strName, oFinderFolder)
' Throw error if folder not found
If oSearchFolder Is Nothing Then
Err.Raise(MAPI.CdoE_NOT_FOUND, "DeleteSearchFolder", _
"Search folder not found with name " & strName)
End If
' If found, delete it
oSearchFolder.Delete()
End Sub
Private Function GetFolder(ByVal strName As String, _
ByVal oParentFolder As MAPI.Folder) As Folder
Dim oFolder As MAPI.Folder
For Each oFolder In oParentFolder.Folders
If oFolder.Name = strName Then
GetFolder = oFolder
Exit For
End If
Next
End Function
Private Function GetFinderFolder(ByVal oSession As MAPI.Session) _
As MAPI.Folder
If oSession Is Nothing Then
Err.Raise(MAPI.CdoE_LOGON_FAILED, _
"DeleteSearchFolder", "No session established.")
End If
' Get root mailbox store folder
Dim oInbox As MAPI.Folder
oInbox = oSession.Inbox
Dim oStore As MAPI.InfoStore
oStore = oSession.GetInfoStore(oInbox.StoreID)
Dim oRootFolder As MAPI.Folder
oRootFolder = oSession.GetFolder("", oStore.ID)
Dim oFolder As MAPI.Folder
For Each oFolder In oRootFolder.Folders
Debug.Print(oFolder.Name)
' In a PST the folder is called "Search Root", in an online
' profile it is called "Finder"
If oFolder.Name = "Finder" Or oFolder.Name = "Search Root" Then
GetFinderFolder = oFolder
Exit For
End If
Next
End Function
Comments
Anonymous
July 29, 2007
Exchange 2007 Setup switches Copying NDRs to a mailbox in Exchange Server 2007 Bouncing email to ExchangeAnonymous
October 03, 2007
The issue of using MAPI or (most commonly) CDO 1.21 in managed (.NET) code is one that comes back to