A
Afk_kk
HOWTO: Create a Message With an Attachment and Send It Using MAPI/VC++
Q200174
The information in this article applies to:
* Extended Messaging Application Programming Interface (MAPI), version 1.0
SUMMARY
This article demonstrates how to make and send a message. It also shows how
to add an attachment to the message that is to be sent.
MORE INFORMATION
The following code creates a MAPI session, logs on to the private message
store, creates a new message, sets properties on the message, and then sends
it.
The recipient for the message is selected from the typical address dialog
box displayed by Exchange or Outlook mail clients.
The following code has been compiled using the Ignore all default libraries
option on the Link tab of the project Settings dialog box. The following
libraries must be used as well:
* Mapi32.lib
* Version.lib
* Edkdebug.lib
* Edkmapi.lib
* Edkutils.lib
* Addrlkup.lib
* Edkguid.lib
* Rulecls.lib
* Msvcrt.lib
#include <edk.h>
HRESULT SetMessageProp ( LPMAPISESSION m_pSession,
LPMESSAGE lpMessage);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR pszCmd,
int nCmdShow)
{
// Load strings, and register window classes.
LPMDB lpStore = NULL;
LPMAPISESSION lpSession = NULL;
LPMESSAGE lpMessage = NULL;
HRESULT hr = NULL;
ULONG cbEntryID = 0;
LPENTRYID lpEntryID = NULL;
LPCIID lpInterface = NULL;
ULONG ulFlags = MAPI_BEST_ACCESS;
ULONG ulObjType = 0;
LPMAPIFOLDER lpFolder = NULL;
ULONG cbEIDFolder = 0;
LPENTRYID lpEIDFolder = NULL;
CHAR szFolder[MAX_PATH + 1] = {0};
hr = MAPIInitialize(NULL);
if (FAILED(hr))
{
return 1;
}
hr = MAPILogonEx(0,"", NULL,
MAPI_LOGON_UI | MAPI_NEW_SESSION | MAPI_EXPLICIT_PROFILE,
&lpSession);
if (FAILED(hr))
{
MessageBox(NULL,"MAPI Logon failed",NULL,MB_OK);
goto cleanup;
}
if (FAILED(hr = HrOpenExchangePrivateStore(lpSession,&lpStore)))
{
MessageBox(NULL,"Message Store Not Opened",NULL,MB_OK);
goto cleanup;
}
strcpy(szFolder, "Top of Information Store\\Outbox");
hr = HrMAPIOpenFolderEx (lpStore,'\\',szFolder,&lpFolder);
if (FAILED(hr))
{
MessageBox(NULL,"Outbox Could Not Be Opened",NULL,MB_OK);
goto cleanup;
}
if (FAILED(hr = lpFolder->CreateMessage(NULL, MAPI_DEFERRED_ERRORS,
&lpMessage)))
{
MessageBox(NULL,"CreateMessage Fail",NULL,MB_OK);
goto cleanup;
}
if (FAILED(hr = SetMessageProp(lpSession, lpMessage)))
goto cleanup;
cleanup:
if ( NULL != lpMessage )
{
lpMessage ->Release ( );
lpMessage = NULL;
}
if (NULL != lpFolder)
{
lpFolder->Release();
lpFolder = NULL;
}
if (lpSession)
{
lpSession->Logoff(0, 0, 0);
ULRELEASE(lpSession);
}
MAPIUninitialize();
return 0;
}
HRESULT SetMessageProp ( LPMAPISESSION lpSession,
LPMESSAGE lpMessage)
{
HRESULT hr = S_OK;
enum {SUBJECT, CLASS, BODY, MSG_DEL, MSG_PROPS };
LPADRBOOK lpAdrBook = NULL;
LPADRLIST lpAdrList = NULL;
LPATTACH pAtt = NULL;
ULONG ulAttNum;
// Display Address Dialog
if (FAILED(hr = lpSession->OpenAddressBook(0L,NULL,0,&lpAdrBook)))
goto Quit;
LPSTR rglpszDestTitles[1];
ULONG rgulDestComps[1];
ULONG m_hWnd1;
rglpszDestTitles[0] = "To";
rgulDestComps[0] = MAPI_TO;
ADRPARM adrparm;
adrparm.cbABContEntryID = 0;
adrparm.lpABContEntryID = NULL;
adrparm.ulFlags = DIALOG_MODAL;
adrparm.lpReserved = NULL;
adrparm.ulHelpContext = 0;
adrparm.lpszHelpFileName = NULL;
adrparm.lpfnABSDI = NULL;
adrparm.lpfnDismiss = NULL;
adrparm.lpvDismissContext = NULL;
adrparm.lpszCaption = "MAPI Dialog";
adrparm.lpszNewEntryTitle = "For this test dialog";
adrparm.lpszDestWellsTitle = "Selected Recipients:";
adrparm.cDestFields = 0xffffffff;
adrparm.nDestFieldFocus = 0;
adrparm.lppszDestTitles = NULL;
adrparm.lpulDestComps = NULL;
adrparm.lpContRestriction = NULL;
adrparm.lpHierRestriction = NULL;
m_hWnd1 = 0;
if (FAILED(hr = lpAdrBook->Address(&m_hWnd1,&adrparm,&lpAdrList)))
goto Quit;
// Message properties tag array
SPropValue lpPropValueArray2[MSG_PROPS];
lpPropValueArray2[SUBJECT].ulPropTag = PR_SUBJECT;
lpPropValueArray2[SUBJECT].Value.lpszA = "Testing IPM With Attachments";
// TO DO:Change this to your custom form class
lpPropValueArray2[CLASS].ulPropTag = PR_MESSAGE_CLASS;
lpPropValueArray2[CLASS].Value.lpszA = "IPM.Note";
lpPropValueArray2[BODY].ulPropTag = PR_BODY;
lpPropValueArray2[BODY].Value.lpszA = "Custom Text For Message";
lpPropValueArray2[MSG_DEL].ulPropTag = PR_DELETE_AFTER_SUBMIT;
lpPropValueArray2[MSG_DEL].Value.b = TRUE;
if (FAILED(hr = lpMessage->ModifyRecipients(MODRECIP_ADD,lpAdrList)))
goto Quit;
if (FAILED(hr = lpMessage->CreateAttach( NULL, (ULONG)0, &ulAttNum,
&pAtt)))
goto Quit;
{
enum {METHOD,RENDERING,PATH, FILENAME, DISPLAYNAME, NUM_ATT_PROPS};
SPropValue spvAttach[NUM_ATT_PROPS];
spvAttach[METHOD].ulPropTag = PR_ATTACH_METHOD;
spvAttach[METHOD].Value.l = ATTACH_BY_REFERENCE;
spvAttach[RENDERING].ulPropTag = PR_RENDERING_POSITION;
spvAttach[RENDERING].Value.l = -1;
spvAttach[PATH].ulPropTag = PR_ATTACH_PATHNAME;
spvAttach[PATH].Value.lpszA ="\\\\<server>\\<share>\\code.txt";
spvAttach[FILENAME].ulPropTag = PR_ATTACH_FILENAME;
spvAttach[FILENAME].Value.lpszA = "code.txt";
spvAttach[DISPLAYNAME].ulPropTag = PR_DISPLAY_NAME;
spvAttach[DISPLAYNAME].Value.lpszA = "Great code.txt";
// Save the properties we have set on the attachment
if (FAILED(hr = pAtt ->SetProps(
NUM_ATT_PROPS,
(LPSPropValue)&spvAttach,
NULL)))
goto Quit;
if (FAILED(hr = pAtt->SaveChanges(0)))
goto Quit;
}
if (FAILED(hr = lpMessage->SetProps(MSG_PROPS,lpPropValueArray2,NULL)))
goto Quit;
if (FAILED(hr = lpMessage->SubmitMessage(0L)))
goto Quit;
// Clean up and release all objects no longer needed in this
// method. Be sure to return the value of hr to the caller.
Quit:
if ( NULL != lpAdrBook )
{
lpAdrBook ->Release ( );
lpAdrBook = NULL;
}
if ( NULL != lpAdrList )
{
MAPIFreeBuffer(lpAdrList);
lpAdrList = NULL;
}
if ( NULL != pAtt )
{
pAtt ->Release ( );
pAtt = NULL;
}
return hr;
}
When i run the above code, the application crashes at the following
function: HrMAPIOpenFolderEx ()
Thanks in advance.
Even on using HrMapiFindSubFolder iam getting exception of ACCESS_VIOLATION.
__try
{
DWORD cbeid = 0;
LPENTRYID lpeid = NULL;
LPMAPIFOLDER lpParentFolder = NULL;
ULONG ulObjType = 0;
hrRet = lpStore->OpenEntry(
0L, // use 0L for root folder
NULL, // use NULL for root folder
NULL, // use NULL for interface ID
MAPI_MODIFY | MAPI_DEFERRED_ERRORS, // use this flag if you plan
to make changes
&ulObjType,
(LPUNKNOWN*)&lpParentFolder);
//MAPIListPublicFolders(lpParentFolder,"");
hrRet = HrMAPIFindSubfolderEx (lpParentFolder, '\\', "Top of
Information Store\\Outbox", &cbeid, &lpeid);
if (FAILED (hrRet))
{
printf("MAPI Public Folder Access Error on %s for
Profile\n",l_strFullPath);
}
hrRet = lpStore->OpenEntry ( cbeid, lpeid, NULL, MAPI_MODIFY,
&ulObjType,(LPUNKNOWN*)&lpFolder );
if (FAILED (hrRet))
{
printf("MAPI Public Folder Access Error on %s for Profile
\n",l_strFullPath);
}
MAPIFreeBuffer (lpeid);
}
__except(EXCEPTION_EXECUTE_HANDLER )
{
Q200174
The information in this article applies to:
* Extended Messaging Application Programming Interface (MAPI), version 1.0
SUMMARY
This article demonstrates how to make and send a message. It also shows how
to add an attachment to the message that is to be sent.
MORE INFORMATION
The following code creates a MAPI session, logs on to the private message
store, creates a new message, sets properties on the message, and then sends
it.
The recipient for the message is selected from the typical address dialog
box displayed by Exchange or Outlook mail clients.
The following code has been compiled using the Ignore all default libraries
option on the Link tab of the project Settings dialog box. The following
libraries must be used as well:
* Mapi32.lib
* Version.lib
* Edkdebug.lib
* Edkmapi.lib
* Edkutils.lib
* Addrlkup.lib
* Edkguid.lib
* Rulecls.lib
* Msvcrt.lib
#include <edk.h>
HRESULT SetMessageProp ( LPMAPISESSION m_pSession,
LPMESSAGE lpMessage);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR pszCmd,
int nCmdShow)
{
// Load strings, and register window classes.
LPMDB lpStore = NULL;
LPMAPISESSION lpSession = NULL;
LPMESSAGE lpMessage = NULL;
HRESULT hr = NULL;
ULONG cbEntryID = 0;
LPENTRYID lpEntryID = NULL;
LPCIID lpInterface = NULL;
ULONG ulFlags = MAPI_BEST_ACCESS;
ULONG ulObjType = 0;
LPMAPIFOLDER lpFolder = NULL;
ULONG cbEIDFolder = 0;
LPENTRYID lpEIDFolder = NULL;
CHAR szFolder[MAX_PATH + 1] = {0};
hr = MAPIInitialize(NULL);
if (FAILED(hr))
{
return 1;
}
hr = MAPILogonEx(0,"", NULL,
MAPI_LOGON_UI | MAPI_NEW_SESSION | MAPI_EXPLICIT_PROFILE,
&lpSession);
if (FAILED(hr))
{
MessageBox(NULL,"MAPI Logon failed",NULL,MB_OK);
goto cleanup;
}
if (FAILED(hr = HrOpenExchangePrivateStore(lpSession,&lpStore)))
{
MessageBox(NULL,"Message Store Not Opened",NULL,MB_OK);
goto cleanup;
}
strcpy(szFolder, "Top of Information Store\\Outbox");
hr = HrMAPIOpenFolderEx (lpStore,'\\',szFolder,&lpFolder);
if (FAILED(hr))
{
MessageBox(NULL,"Outbox Could Not Be Opened",NULL,MB_OK);
goto cleanup;
}
if (FAILED(hr = lpFolder->CreateMessage(NULL, MAPI_DEFERRED_ERRORS,
&lpMessage)))
{
MessageBox(NULL,"CreateMessage Fail",NULL,MB_OK);
goto cleanup;
}
if (FAILED(hr = SetMessageProp(lpSession, lpMessage)))
goto cleanup;
cleanup:
if ( NULL != lpMessage )
{
lpMessage ->Release ( );
lpMessage = NULL;
}
if (NULL != lpFolder)
{
lpFolder->Release();
lpFolder = NULL;
}
if (lpSession)
{
lpSession->Logoff(0, 0, 0);
ULRELEASE(lpSession);
}
MAPIUninitialize();
return 0;
}
HRESULT SetMessageProp ( LPMAPISESSION lpSession,
LPMESSAGE lpMessage)
{
HRESULT hr = S_OK;
enum {SUBJECT, CLASS, BODY, MSG_DEL, MSG_PROPS };
LPADRBOOK lpAdrBook = NULL;
LPADRLIST lpAdrList = NULL;
LPATTACH pAtt = NULL;
ULONG ulAttNum;
// Display Address Dialog
if (FAILED(hr = lpSession->OpenAddressBook(0L,NULL,0,&lpAdrBook)))
goto Quit;
LPSTR rglpszDestTitles[1];
ULONG rgulDestComps[1];
ULONG m_hWnd1;
rglpszDestTitles[0] = "To";
rgulDestComps[0] = MAPI_TO;
ADRPARM adrparm;
adrparm.cbABContEntryID = 0;
adrparm.lpABContEntryID = NULL;
adrparm.ulFlags = DIALOG_MODAL;
adrparm.lpReserved = NULL;
adrparm.ulHelpContext = 0;
adrparm.lpszHelpFileName = NULL;
adrparm.lpfnABSDI = NULL;
adrparm.lpfnDismiss = NULL;
adrparm.lpvDismissContext = NULL;
adrparm.lpszCaption = "MAPI Dialog";
adrparm.lpszNewEntryTitle = "For this test dialog";
adrparm.lpszDestWellsTitle = "Selected Recipients:";
adrparm.cDestFields = 0xffffffff;
adrparm.nDestFieldFocus = 0;
adrparm.lppszDestTitles = NULL;
adrparm.lpulDestComps = NULL;
adrparm.lpContRestriction = NULL;
adrparm.lpHierRestriction = NULL;
m_hWnd1 = 0;
if (FAILED(hr = lpAdrBook->Address(&m_hWnd1,&adrparm,&lpAdrList)))
goto Quit;
// Message properties tag array
SPropValue lpPropValueArray2[MSG_PROPS];
lpPropValueArray2[SUBJECT].ulPropTag = PR_SUBJECT;
lpPropValueArray2[SUBJECT].Value.lpszA = "Testing IPM With Attachments";
// TO DO:Change this to your custom form class
lpPropValueArray2[CLASS].ulPropTag = PR_MESSAGE_CLASS;
lpPropValueArray2[CLASS].Value.lpszA = "IPM.Note";
lpPropValueArray2[BODY].ulPropTag = PR_BODY;
lpPropValueArray2[BODY].Value.lpszA = "Custom Text For Message";
lpPropValueArray2[MSG_DEL].ulPropTag = PR_DELETE_AFTER_SUBMIT;
lpPropValueArray2[MSG_DEL].Value.b = TRUE;
if (FAILED(hr = lpMessage->ModifyRecipients(MODRECIP_ADD,lpAdrList)))
goto Quit;
if (FAILED(hr = lpMessage->CreateAttach( NULL, (ULONG)0, &ulAttNum,
&pAtt)))
goto Quit;
{
enum {METHOD,RENDERING,PATH, FILENAME, DISPLAYNAME, NUM_ATT_PROPS};
SPropValue spvAttach[NUM_ATT_PROPS];
spvAttach[METHOD].ulPropTag = PR_ATTACH_METHOD;
spvAttach[METHOD].Value.l = ATTACH_BY_REFERENCE;
spvAttach[RENDERING].ulPropTag = PR_RENDERING_POSITION;
spvAttach[RENDERING].Value.l = -1;
spvAttach[PATH].ulPropTag = PR_ATTACH_PATHNAME;
spvAttach[PATH].Value.lpszA ="\\\\<server>\\<share>\\code.txt";
spvAttach[FILENAME].ulPropTag = PR_ATTACH_FILENAME;
spvAttach[FILENAME].Value.lpszA = "code.txt";
spvAttach[DISPLAYNAME].ulPropTag = PR_DISPLAY_NAME;
spvAttach[DISPLAYNAME].Value.lpszA = "Great code.txt";
// Save the properties we have set on the attachment
if (FAILED(hr = pAtt ->SetProps(
NUM_ATT_PROPS,
(LPSPropValue)&spvAttach,
NULL)))
goto Quit;
if (FAILED(hr = pAtt->SaveChanges(0)))
goto Quit;
}
if (FAILED(hr = lpMessage->SetProps(MSG_PROPS,lpPropValueArray2,NULL)))
goto Quit;
if (FAILED(hr = lpMessage->SubmitMessage(0L)))
goto Quit;
// Clean up and release all objects no longer needed in this
// method. Be sure to return the value of hr to the caller.
Quit:
if ( NULL != lpAdrBook )
{
lpAdrBook ->Release ( );
lpAdrBook = NULL;
}
if ( NULL != lpAdrList )
{
MAPIFreeBuffer(lpAdrList);
lpAdrList = NULL;
}
if ( NULL != pAtt )
{
pAtt ->Release ( );
pAtt = NULL;
}
return hr;
}
When i run the above code, the application crashes at the following
function: HrMAPIOpenFolderEx ()
Thanks in advance.
Even on using HrMapiFindSubFolder iam getting exception of ACCESS_VIOLATION.
__try
{
DWORD cbeid = 0;
LPENTRYID lpeid = NULL;
LPMAPIFOLDER lpParentFolder = NULL;
ULONG ulObjType = 0;
hrRet = lpStore->OpenEntry(
0L, // use 0L for root folder
NULL, // use NULL for root folder
NULL, // use NULL for interface ID
MAPI_MODIFY | MAPI_DEFERRED_ERRORS, // use this flag if you plan
to make changes
&ulObjType,
(LPUNKNOWN*)&lpParentFolder);
//MAPIListPublicFolders(lpParentFolder,"");
hrRet = HrMAPIFindSubfolderEx (lpParentFolder, '\\', "Top of
Information Store\\Outbox", &cbeid, &lpeid);
if (FAILED (hrRet))
{
printf("MAPI Public Folder Access Error on %s for
Profile\n",l_strFullPath);
}
hrRet = lpStore->OpenEntry ( cbeid, lpeid, NULL, MAPI_MODIFY,
&ulObjType,(LPUNKNOWN*)&lpFolder );
if (FAILED (hrRet))
{
printf("MAPI Public Folder Access Error on %s for Profile
\n",l_strFullPath);
}
MAPIFreeBuffer (lpeid);
}
__except(EXCEPTION_EXECUTE_HANDLER )
{