Issue accessing Public Folder Store using CDO 1.2.1 for Outlook 2007
If you are using InfoStores collection of CDO 1.2.1 for Outlook 2007 to access Public Folder store and not able to get reference to Public Folder store then here is the explanation of the design change in CDO 1.2.1 from SGriffin’s post@Outlook 2007, Public Folders, MAPI and You.
Basically, Outlook 2007's version of the Exchange provider, emsmdb32, doesn't automatically add the Public Folder store to the message store table of a new profile. Instead, it waits until a successful connection has been made to the Exchange server. If it then detects that the public folders are available, it updates the profile and sends a table notification indicating the availability of Public Folders. This is a change from previous versions of Outlook and from Exchange's version of the provider. We made this change to better support Exchange 2007's Public Folder-less environments.
Here is the vbscript sample code snippet to repro the issue:
NOTE: Following programming examples is for illustration only, without warranty either expressed or implied, including, but not limited to, the implied warranties of merchantability and/or fitness for a particular purpose. This sample code assumes that you are familiar with the programming language being demonstrated and the tools used to create and debug procedures. This sample code is provided for the purpose of illustration only and is not intended to be used in a production environment.
'Change Server and User name below
SERVER = "Server"
Mailbox = "User"
Set objSession = CreateObject("MAPI.Session")
objSession.LogOn , "", False, True, , True, SERVER & Chr(10) & Mailbox
Set objInfoStores = objSession.InfoStores
For i = 1 To objInfoStores.Count
If UCase(objInfoStores.Item(i)) = UCase("Public Folders") Then
Set objInfoStore = objInfoStores.Item(i)
msgbox objInfoStore.name
Exit For
End If
Next
Set objInfoStores= Nothing
Set objSession=Nothing
The above sample code would not return the name of the Public Folders store to us.
We need to work around the above issue by creating another session object as per the below code snippet:
'Change Server and User name below
SERVER = "Server"
Mailbox = "User"
Set objSession = CreateObject("MAPI.Session")
objSession.LogOn , "", False, True, , True, SERVER & Chr(10) & Mailbox
Set objInfoStores = objSession.InfoStores
For i = 1 To objInfoStores.Count
If UCase(objInfoStores.Item(i)) = UCase("Public Folders") Then
Set objInfoStore = objInfoStores.Item(i)
msgbox objInfoStore.name
Exit For
End If
Next
Set objSession2 = CreateObject("MAPI.Session")
objSession2.LogOn , "", False, False, , True, SERVER & Chr(10) & Mailbox
Set objInfoStores2 = objSession2.InfoStores
For i = 1 To objInfoStores2.Count
If UCase(objInfoStores2.Item(i)) = UCase("Public Folders") Then
Set objInfoStore2 = objInfoStores2.Item(i)
msgbox objInfoStore2.name
Exit For
End If
Next
Set objInfoStores= Nothing
Set objSession=Nothing
Set objInfoStores2= Nothing
Set objSession2=Nothing
Note: We are using third parameter as “False” for objSession2.Logon, So that it uses the current shared MAPI session.