📄 smapi.cpp
字号:
} return bSuccess;}bool wxMapiSession::Resolve(const wxString& sName, void* lppRecip1){ lpMapiRecipDesc* lppRecip = (lpMapiRecipDesc*) lppRecip1; wxASSERT(MapiInstalled()); //MAPI must be installed wxASSERT(m_data->m_lpfnMAPIResolveName); //Function pointer must be valid wxASSERT(LoggedOn()); //Must be logged on to MAPI wxASSERT(m_data->m_hSession); //MAPI session handle must be valid //Call the MAPIResolveName function#ifndef UNICODE LPSTR lpszAsciiName = (LPSTR) sName.c_str();#else wxCharBuffer cbName(1); cbName = sName.mb_str(); LPSTR lpszAsciiName = cbName.data();#endif ULONG nError = m_data->m_lpfnMAPIResolveName(m_data->m_hSession, 0, lpszAsciiName, 0, 0, lppRecip); if (nError != SUCCESS_SUCCESS) { wxLogDebug(_T("Failed to resolve the name: %s, Error:%ld\n"), sName.c_str(), nError); m_data->m_nLastError = nError; } return (nError == SUCCESS_SUCCESS);}bool wxMapiSession::Send(wxMailMessage& message){ wxASSERT(MapiInstalled()); //MAPI must be installed wxASSERT(m_data->m_lpfnMAPISendMail); //Function pointer must be valid wxASSERT(m_data->m_lpfnMAPIFreeBuffer); //Function pointer must be valid wxASSERT(LoggedOn()); //Must be logged on to MAPI wxASSERT(m_data->m_hSession); //MAPI session handle must be valid //Initialise the function return value bool bSuccess = FALSE; //Create the MapiMessage structure to match the message parameter send into us MapiMessage mapiMessage; ZeroMemory(&mapiMessage, sizeof(mapiMessage));#ifndef UNICODE mapiMessage.lpszSubject = (LPSTR) message.m_subject.c_str(); mapiMessage.lpszNoteText = (LPSTR) message.m_body.c_str();#else wxCharBuffer cbSubject(1),cbBody(1),cbOriginator(1); cbSubject = message.m_subject.mb_str(); cbBody = message.m_body.mb_str(); mapiMessage.lpszSubject = cbSubject.data(); mapiMessage.lpszNoteText = cbBody.data();#endif mapiMessage.nRecipCount = message.m_to.GetCount() + message.m_cc.GetCount() + message.m_bcc.GetCount(); wxASSERT(mapiMessage.nRecipCount); //Must have at least 1 recipient! //Allocate the recipients array mapiMessage.lpRecips = new MapiRecipDesc[mapiMessage.nRecipCount]; // If we have a 'From' field, use it if (!message.m_from.IsEmpty()) { mapiMessage.lpOriginator = new MapiRecipDesc; ZeroMemory(mapiMessage.lpOriginator, sizeof(MapiRecipDesc)); mapiMessage.lpOriginator->ulRecipClass = MAPI_ORIG; // TODO Do we have to call Resolve?#ifndef UNICODE mapiMessage.lpOriginator->lpszName = (LPSTR) message.m_from.c_str();#else cbOriginator = message.m_from.mb_str(); mapiMessage.lpOriginator->lpszName = cbOriginator.data();#endif } //Setup the "To" recipients int nRecipIndex = 0; int nToSize = message.m_to.GetCount(); int i; for (i=0; i<nToSize; i++) { MapiRecipDesc& recip = mapiMessage.lpRecips[nRecipIndex]; ZeroMemory(&recip, sizeof(MapiRecipDesc)); recip.ulRecipClass = MAPI_TO; wxString& sName = message.m_to[i]; //Try to resolve the name lpMapiRecipDesc lpTempRecip; if (Resolve(sName, (void*) &lpTempRecip)) { //Resolve worked, put the resolved name back into the sName sName = wxString(lpTempRecip->lpszName,*wxConvCurrent); //Don't forget to free up the memory MAPI allocated for us m_data->m_lpfnMAPIFreeBuffer(lpTempRecip); }#ifndef UNICODE recip.lpszName = (LPSTR) sName.c_str();#else recip.lpszName = sName.mb_str().release();#endif ++nRecipIndex; } //Setup the "CC" recipients int nCCSize = message.m_cc.GetCount(); for (i=0; i<nCCSize; i++) { MapiRecipDesc& recip = mapiMessage.lpRecips[nRecipIndex]; ZeroMemory(&recip, sizeof(MapiRecipDesc)); recip.ulRecipClass = MAPI_CC; wxString& sName = message.m_cc[i]; //Try to resolve the name lpMapiRecipDesc lpTempRecip; if (Resolve(sName, (void*) &lpTempRecip)) { //Resolve worked, put the resolved name back into the sName sName = wxString(lpTempRecip->lpszName,*wxConvCurrent); //Don't forget to free up the memory MAPI allocated for us m_data->m_lpfnMAPIFreeBuffer(lpTempRecip); }#ifndef UNICODE recip.lpszName = (LPSTR) sName.c_str();#else recip.lpszName = sName.mb_str().release();#endif ++nRecipIndex; } //Setup the "BCC" recipients int nBCCSize = message.m_bcc.GetCount(); for (i=0; i<nBCCSize; i++) { MapiRecipDesc& recip = mapiMessage.lpRecips[nRecipIndex]; ZeroMemory(&recip, sizeof(MapiRecipDesc)); recip.ulRecipClass = MAPI_BCC; wxString& sName = message.m_bcc[i]; //Try to resolve the name lpMapiRecipDesc lpTempRecip; if (Resolve(sName, (void*) &lpTempRecip)) { //Resolve worked, put the resolved name back into the sName sName = wxString(lpTempRecip->lpszName,wxConvCurrent); //Don't forget to free up the memory MAPI allocated for us m_data->m_lpfnMAPIFreeBuffer(lpTempRecip); }#ifndef UNICODE recip.lpszName = (LPSTR) sName.c_str();#else recip.lpszName = sName.mb_str().release();#endif ++nRecipIndex; } //Setup the attachments int nAttachmentSize = message.m_attachments.GetCount(); int nTitleSize = message.m_attachmentTitles.GetCount(); if (nTitleSize) { wxASSERT(nTitleSize == nAttachmentSize); //If you are going to set the attachment titles then you must set //the attachment title for each attachment } if (nAttachmentSize) { mapiMessage.nFileCount = nAttachmentSize; mapiMessage.lpFiles = new MapiFileDesc[nAttachmentSize]; for (i=0; i<nAttachmentSize; i++) { MapiFileDesc& file = mapiMessage.lpFiles[i]; ZeroMemory(&file, sizeof(MapiFileDesc)); file.nPosition = 0xFFFFFFFF; wxString& sFilename = message.m_attachments[i];#ifndef UNICODE file.lpszPathName = (LPSTR) sFilename.c_str();#else file.lpszPathName = sFilename.mb_str().release();#endif //file.lpszFileName = file.lpszPathName; file.lpszFileName = NULL; if (nTitleSize && !message.m_attachmentTitles[i].IsEmpty()) { wxString& sTitle = message.m_attachmentTitles[i];#ifndef UNICODE file.lpszFileName = (LPSTR) sTitle.c_str();#else file.lpszFileName = sTitle.mb_str().release();#endif } } } //Do the actual send using MAPISendMail ULONG nError = m_data->m_lpfnMAPISendMail(m_data->m_hSession, 0, &mapiMessage, MAPI_DIALOG, 0); if (nError == SUCCESS_SUCCESS) { bSuccess = TRUE; m_data->m_nLastError = SUCCESS_SUCCESS; } else { wxLogDebug(_T("Failed to send mail message, Error:%ld\n"), nError); m_data->m_nLastError = nError; } //Tidy up the Attachements if (nAttachmentSize) {#ifdef UNICODE for (i = 0;i < nAttachmentSize;i++) { free(mapiMessage.lpFiles[i].lpszPathName); free(mapiMessage.lpFiles[i].lpszFileName); }#endif delete [] mapiMessage.lpFiles; } //Free up the Recipients and Originator memory#ifdef UNICODE for (i = 0;i < nRecipIndex;i++) free(mapiMessage.lpRecips[i].lpszName);#endif delete [] mapiMessage.lpRecips; delete mapiMessage.lpOriginator; return bSuccess;}long wxMapiSession::GetLastError() const{ return m_data->m_nLastError;}#endif // __WXMSW__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -