Microsoft KB Archive/198752

{|
 * width="100%"|

HOWTO: Get Message Store Information on Mailboxes Programmatically Using Visual C++

 * }

Q198752

-

The information in this article applies to:


 * Exchange Development Kit (EDK), versions 5.0, 5.5

-

SUMMARY
Retrieving information about mailboxes like the size and the number of messages is a task that is common in maintenance applications. This article contains a Microsoft Visual C++ code sample that demonstrates how to view that type of information. It uses properties on the root folder to determine overall size. This same logic can be applied to any folder within the mailbox.

MORE INFORMATION
The following code needs to be modified to include the organization and site for the user's messaging environment. It is a console application and requires the following libraries:


 * Version.lib
 * Exchsdk.lib
 * Mapi32.lib
 * Edkutils.lib
 * Edkmapi.lib
 * Msvcrt.lib

Sample Code
#include 
 * 1) include 

HRESULT OpenMailbox(LPMAPISESSION lpMAPISession,                    LPSTR pszExchangeServerName);

void main {  HRESULT hr = S_OK;

hr = MAPIInitialize(NULL); if(FAILED(hr)) {     printf("Failed to initialise MAPI\n"); }

char pszExchangeServerName[500]; LPMAPISESSION lpSess = NULL; LPMDB  lpMDB = NULL;

// Get the Exchange Server name from the user //   printf("n\nPlease enter the name of your Exchange System ?  "); gets(pszExchangeServerName); printf("\n\n");

// TO DO: Need to logon using a profile for the service account // or an Exchange admin hr = MAPILogonEx(0, "", NULL,              MAPI_LOGON_UI | MAPI_NEW_SESSION |  MAPI_EXPLICIT_PROFILE,               &lpSess); if (FAILED(hr)) {     MessageBox(NULL,"MAPI Logon failed",NULL,MB_OK); }

if(SUCCEEDED(hr) && lpSess) {     printf("Created MAPI session\n"); hr = OpenMailbox(lpSess, pszExchangeServerName);

if(FAILED(hr)) printf("Failed to Run\n"); else printf("Opened users mailboxes\n");

}

char ch; printf("\nHit a key to exit"); ch = getchar;

if(lpSess) lpSess->Release; }

HRESULT OpenMailbox(LPMAPISESSION lpMAPISession, LPSTR pszServerName) {  HRESULT      hr             = S_OK; LPMAPITABLE lpMailBoxTable = NULL; LPSRowSet   lpRows         = NULL; LPENTRYID   lpMsgStoreID   = NULL; ULONG       cbMsgStoreID   = 0; LPMDB       lpMDB          = NULL; LPMDB       lpUserMDB      = NULL; LPMAPIFOLDER lpFolder      = NULL; LPEXCHANGEMANAGESTORE lpIManageStore = NULL; char pszServerDN[500];

if (FAILED(hr = HrOpenExchangePrivateStore(lpMAPISession, &lpMDB))) {     MessageBox(0L,"Message Store Not Available","Error",MB_OK); return MAPI_E_NOT_FOUND; }

if (FAILED(hr = lpMDB->QueryInterface(IID_IExchangeManageStore,                                        (void **) &lpIManageStore))) {     MessageBox(0L,"QueryInterace Failed","Error",MB_OK); return MAPI_E_NOT_FOUND; }

// create server DN   sprintf(pszServerDN,"/o=org/ou=site/cn=servers/cn=%s",pszServerName);

if (FAILED(hr = lpIManageStore->GetMailboxTable(pszServerDN,                                                  &lpMailBoxTable,0))) {     MessageBox(0L,"Mailbox Table Not Available","Error",MB_OK); return MAPI_E_NOT_FOUND; }

// Get a list of Mailboxes taking up resources hr = HrQueryAllRows(lpMailBoxTable, NULL, NULL, NULL, 0, &lpRows);

if(SUCCEEDED(hr)) {     if (lpRows->cRows > 0) {        for (UINT i=0; i < lpRows->cRows; i++) {           LPSPropValue lpspv = PpropFindProp( lpRows->aRow[i].lpProps,                                    lpRows->aRow[i].cValues,                                    PR_EMAIL_ADDRESS ); //Create Information Store DN           sprintf(pszServerDN,                       "/o=org/ou=site/cn=servers/cn=%s%s",pszServerName,                       "/cn=Microsoft Private MDB");

if(FAILED(hr = HrMailboxLogon(lpMAPISession, lpMDB,                                          pszServerDN, lpspv->Value.lpszA,                                           &lpUserMDB))) {              MessageBox(0L,"Mailbox Not Available","Error",MB_OK); return MAPI_E_NOT_FOUND; }           else {              printf("Opened %s \n",lpspv->Value.lpszA); }           //  *********  Place Mailbox Processing Here ********* LPSPropValue lppProp = NULL; if (FAILED(hr = HrGetOneProp(lpUserMDB, PR_MESSAGE_SIZE,                                         &lppProp))) {              char szError[200]; sprintf(szError, "HrGetOneProp error %x",hr); MessageBox(0L,szError,"Error",MB_OK); }           else {              char szInfo[200]; sprintf(szInfo,"Message Size = %d",lppProp->Value); MessageBox(0L,szInfo,"",MB_OK); }           if (FAILED(hr = HrGetOneProp(lpUserMDB, PR_CONTENT_COUNT,                                          &lppProp))) {              char szError[200]; sprintf(szError, "HrGetOneProp error %x",hr); MessageBox(0L,szError,"Error",MB_OK); }           else {              char szInfo[200]; sprintf(szInfo,"Total Message Count = %d",lppProp->Value); MessageBox(0L,szInfo,"",MB_OK); }        }      }   }   if(lpRows) {     FreeProws(lpRows); }

if(lpMailBoxTable) {     lpMailBoxTable->Release; }

if (FAILED(hr)) return MAPI_E_NOT_FOUND; else return S_OK; } Additional query words: kbMsg kbEDK500 kbEDK550

Keywords : kbMsg kbEDK500 kbEDK550 kbfaq

Issue type : kbhowto

Technology :