www.pudn.com > ce-outlook.rar > OutlookSession.cpp


// OutlookSession.cpp: implementation of the OutlookSession class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "OutlookSession.h" 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
OutlookSession::OutlookSession() 
{ 
	m_pSession = NULL; 
	m_pMsgStoresTable = NULL; 
	m_pMsgStore = NULL; 
	m_pFolder = NULL; 
} 
 
OutlookSession::~OutlookSession() 
{ 
	if( m_pFolder != NULL ) 
		m_pFolder->Release(); 
 
	if( m_pMsgStoresTable != NULL ) 
		m_pMsgStoresTable->Release(); 
 
	if( m_pMsgStore != NULL ) 
		m_pMsgStore->Release(); 
 
	if( m_pSession != NULL ) 
	{ 
		m_pSession->Logoff(NULL, MAPI_LOGOFF_SHARED, 0); 
		m_pSession->Release(); 
	} 
} 
 
 
int OutlookSession::OpenSession(LPCTSTR pcszName, ULONG ul) 
{ 
	HRESULT hr; 
	 
	hr = MAPIInitialize(NULL); 
	if( FAILED(hr) )  
	{ 
		return hr; 
	} 
 
	hr = MAPILogonEx(NULL, NULL, NULL, NULL, &m_pSession); 
	if( FAILED(hr) )  
	{ 
		return hr; 
	} 
	 
	hr = m_pSession->GetMsgStoresTable(0, &m_pMsgStoresTable); 
	if( FAILED(hr) )  
	{ 
		return hr; 
	} 
 
	LPSRowSet pRows = NULL; 
	SizedSPropTagArray(2, Columns) = {2,{PR_DISPLAY_NAME,PR_ENTRYID}}; 
	 
	hr = m_pSession->GetMsgStoresTable(0, &m_pMsgStoresTable); 
	if( FAILED(hr) ) return hr; 
	 
    hr = m_pMsgStoresTable->SetColumns((LPSPropTagArray)&Columns, 0); 
	if( FAILED(hr) ) return hr; 
	 
	LPSPropValue lpProp = NULL; 
	while (TRUE) 
	{ 
		hr = m_pMsgStoresTable->QueryRows(1, 0, &pRows); 
		if (FAILED(hr) || pRows->cRows != 1) 
			break; 
		 
		lpProp = &pRows->aRow[0].lpProps[0]; 
		 
		if(_tcscmp(lpProp->Value.LPSZ, pcszName) == 0) 
			break; 
	} 
	 
	hr = m_pSession->OpenMsgStore(0, pRows->aRow[0].lpProps[1].Value.bin.cb, 
			(ENTRYID*)pRows->aRow[0].lpProps[1].Value.bin.lpb, 
			NULL, MDB_NO_DIALOG | MAPI_BEST_ACCESS, &m_pMsgStore); 
	 
	MAPIFreeBuffer(pRows); 
 
    LPSPropValue	rgprops = NULL; 
    ULONG			cValues = 0; 
	ULONG           rgTags[] = { 1, ul}; 
	 
    hr = m_pMsgStore->GetProps((LPSPropTagArray) rgTags, MAPI_UNICODE, &cValues, &rgprops); 
	if( FAILED(hr) ) return hr; 
	 
    if(rgprops[0].ulPropTag != ul) 
	{ 
		return hr; 
	} 
	 
    hr = m_pMsgStore->OpenEntry(rgprops[0].Value.bin.cb,  
            (LPENTRYID)rgprops[0].Value.bin.lpb, NULL, MAPI_MODIFY,  
            NULL, (LPUNKNOWN*)&m_pFolder); 
	 
	MAPIFreeBuffer(rgprops); 
	 
	return hr; 
} 
 
void OutlookSession::SaveMailToDraft() 
{ 
	HRESULT hr; 
	OutlookSession session; 
	LPMESSAGE pMessage = NULL; 
	LPSTREAM pStream = NULL; 
 
	//打开邮件草稿箱 
	hr = session.OpenSession(_T("EMAIL"), PR_CE_IPM_DRAFTS_ENTRYID); 
	if(hr != S_OK) 
	{ 
		return; 
	} 
 
	//创建一封新邮件 
	hr = session.m_pFolder->CreateMessage(NULL, 0, &pMessage); 
	if(hr != S_OK) 
	{ 
		return; 
	} 
 
	INT			nBufSize = CbNewADRLIST(1); 
	LPADRLIST	pAddressList = NULL; 
 
	hr = MAPIAllocateBuffer(nBufSize, (LPVOID FAR *)&pAddressList); 
	memset(pAddressList, 0, nBufSize); 
 
	LPTSTR pszTo = L"my@sohu.com"; 
	LPTSTR pszSubject = "测试"; 
 
	hr = MAPIAllocateBuffer(sizeof(SPropValue) * 3, (LPVOID FAR *)&pAddressList->aEntries[0].rgPropVals); 
	memset(pAddressList->aEntries[0].rgPropVals, 0, sizeof(SPropValue) * 3); 
	pAddressList->aEntries[0].rgPropVals[0].ulPropTag = PR_RECIPIENT_TYPE; 
	pAddressList->aEntries[0].rgPropVals[0].Value.ul = MAPI_TO; 
	pAddressList->aEntries[0].rgPropVals[1].ulPropTag = PR_ADDRTYPE; 
	pAddressList->aEntries[0].rgPropVals[1].Value.LPSZ = TEXT("SMTP"); 
	pAddressList->aEntries[0].rgPropVals[2].ulPropTag = PR_EMAIL_ADDRESS; 
	pAddressList->aEntries[0].rgPropVals[2].Value.LPSZ = pszTo; 
	pAddressList->aEntries[0].cValues = 3; 
	pAddressList->cEntries++; 
	hr = pMessage->ModifyRecipients(MODRECIP_ADD, pAddressList); 
	MAPIFreeBuffer(pAddressList->aEntries[0].rgPropVals); 
	MAPIFreeBuffer(pAddressList); 
 
	SPropValue prop[2]; 
	prop[0].ulPropTag	= PR_SUBJECT; 
	prop[0].Value.LPSZ = L"主题"; 
 
	prop[1].ulPropTag	= PR_MESSAGE_FLAGS; 
	prop[1].Value.ul = MSGFLAG_FROMME | MSGFLAG_UNSENT;//未发送 
 
	hr = pMessage->SetProps(2, prop, NULL); 
	 
	CString strContent = L"测试内容"; 
 
	//邮件正文 
	hr = pMessage->OpenProperty(PR_BODY, NULL, 0,  
				MAPI_MODIFY | MAPI_CREATE, (LPUNKNOWN*)&pStream); 
	pStream->Write(strContent.LockBuffer(), strContent.GetLength() * 2, NULL); 
	 
	pStream->Commit(STGC_DEFAULT); 
	pStream->Release(); 
	pStream = NULL; 
 
	pMessage->Release(); 
	pMessage = NULL; 
} 
 
void OutlookSession::SaveMailToSend() 
{ 
	HRESULT hr; 
 
	LPMESSAGE pMessage = NULL; 
	LPSTREAM pStream = NULL; 
 
	//打开邮件发件箱 
	hr = OpenSession(_T("EMAIL"), PR_IPM_OUTBOX_ENTRYID); 
	if(hr != S_OK) 
	{ 
		return; 
	} 
 
	//创建一封新邮件 
	hr = m_pFolder->CreateMessage(NULL, 0, &pMessage); 
	if(hr != S_OK) 
	{ 
		return; 
	} 
 
	INT			nBufSize = CbNewADRLIST(1); 
	LPADRLIST	pAddressList = NULL; 
 
	hr = MAPIAllocateBuffer(nBufSize, (LPVOID FAR *)&pAddressList); 
	memset(pAddressList, 0, nBufSize); 
 
	LPTSTR pszTo = L"my@sohu.com"; 
	LPTSTR pszSubject = L"测试"; 
 
	hr = MAPIAllocateBuffer(sizeof(SPropValue) * 3, (LPVOID FAR *)&pAddressList->aEntries[0].rgPropVals); 
	memset(pAddressList->aEntries[0].rgPropVals, 0, sizeof(SPropValue) * 3); 
	pAddressList->aEntries[0].rgPropVals[0].ulPropTag = PR_RECIPIENT_TYPE; 
	pAddressList->aEntries[0].rgPropVals[0].Value.ul = MAPI_TO; 
	pAddressList->aEntries[0].rgPropVals[1].ulPropTag = PR_ADDRTYPE; 
	pAddressList->aEntries[0].rgPropVals[1].Value.LPSZ = TEXT("SMTP"); 
	pAddressList->aEntries[0].rgPropVals[2].ulPropTag = PR_EMAIL_ADDRESS; 
	pAddressList->aEntries[0].rgPropVals[2].Value.LPSZ = pszTo; 
	pAddressList->aEntries[0].cValues = 3; 
	pAddressList->cEntries++; 
	hr = pMessage->ModifyRecipients(MODRECIP_ADD, pAddressList); 
	MAPIFreeBuffer(pAddressList->aEntries[0].rgPropVals); 
	MAPIFreeBuffer(pAddressList); 
 
	SPropValue prop[2]; 
	prop[0].ulPropTag	= PR_SUBJECT; 
	prop[0].Value.LPSZ = L"主题"; 
 
	prop[1].ulPropTag	= PR_MESSAGE_FLAGS; 
	prop[1].Value.ul = MSGFLAG_FROMME | MSGFLAG_UNSENT;//未发送 
 
	hr = pMessage->SetProps(2, prop, NULL); 
 
        CString strContent = L"测试内容"; 
	//邮件正文 
	hr = pMessage->OpenProperty(PR_BODY, NULL, 0,  
				MAPI_MODIFY | MAPI_CREATE, (LPUNKNOWN*)&pStream); 
	pStream->Write(strContent.LockBuffer(), strContent.GetLength() * 2, NULL); 
	 
	pStream->Commit(STGC_DEFAULT); 
	pStream->Release(); 
	pStream = NULL; 
 
	pMessage->Release(); 
	pMessage = NULL; 
 
}