示例代碼運行效果圖如下:
功能介紹:很多時候大家需要在程序中發送郵件,自己編又太麻煩,怎麼辦,呵呵,有現成的!
1、我們可以用ShellExecute函數簡單的調用默認的電子郵件程序:
ShellExecute(NULL,NULL,"mailto:[email protected]",NULL,NULL,SW_SHOW);
2、如果想實現復雜一點兒的功能,如添加多個收件人、主題、附件等,就可以調用系統的MAPI函數。具體的用法可以去查MSDN,都是以MAPI開頭的,如MAPILogon、MAPISendMail等。下面演示如何調用默認的郵件程序發送郵件,可以添加多個附件
部分關鍵代碼:
//必須包括 mapi.h 頭文件
#include "mapi.h"
/*********************************************************************
* 函數名稱:CSendEMailDlg::OnSendMapi
* 說明: 調用MAPI函數發送郵件。
* 作者: Geng
* 時間 : 2003-04-22 20:08:30
*********************************************************************/
void CSendEMailDlg::OnSendMapi()
{
UpdateData(true);
//裝入MAPI32.DLL動態庫
HMODULE hMod = LoadLibrary("MAPI32.DLL");
if (hMod == NULL)
{
AfxMessageBox(AFX_IDP_FAILED_MAPI_LOAD);
return;
}
//獲取發送郵件的函數地址
ULONG (PASCAL *lpfnSendMail)(ULONG, ULONG, MapiMessage*, FLAGS, ULONG);
(FARPROC&)lpfnSendMail = GetProcAddress(hMod, "MAPISendMail");
if (lpfnSendMail == NULL)
{
AfxMessageBox(AFX_IDP_INVALID_MAPI_DLL);
return;
}
int nFileCount = m_list.GetCount(); //有多少個附件需要發送
//分配內存保存附件信息 不能使用靜態數組,因為不知道要發送附件的個數
MapiFileDesc* pFileDesc = (MapiFileDesc*)malloc(sizeof(MapiFileDesc) * nFileCount);
memset(pFileDesc,0,sizeof(MapiFileDesc) * nFileCount);
//分配內存保存附件文件路徑
TCHAR* pTchPath = (TCHAR*)malloc(MAX_PATH * nFileCount);
CString szText;
for(int i = 0;i < nFileCount;i++)
{
TCHAR* p = pTchPath + MAX_PATH * i;
m_list.GetText(i,szText);
strcpy(p,szText);
(pFileDesc + i)->nPosition = (ULONG)-1;
(pFileDesc + i)->lpszPathName = p;
(pFileDesc + i)->lpszFileName = p;
}
//收件人結構信息
MapiRecipDesc recip;
memset(&recip,0,sizeof(MapiRecipDesc));
recip.lpszAddress = m_szEmailMAPI.GetBuffer(0);
recip.ulRecipClass = MAPI_TO;
//郵件結構信息
MapiMessage message;
memset(&message, 0, sizeof(message));
message.nFileCount = nFileCount; //文件個數
message.lpFiles = pFileDesc; //文件信息
message.nRecipCount = 1; //收件人個數
message.lpRecips = &recip; //收件人
message.lpszSubject = m_szSubject.GetBuffer(0); //主題
message.lpszNoteText = m_szText.GetBuffer(0); //正文內容
//保存本程序窗口指針,因為發完郵件後要返回本程序的窗口
CWnd* pParentWnd = CWnd::GetSafeOwner(NULL, NULL);
//發送郵件
int nError = lpfnSendMail(0, 0,&message, MAPI_LOGON_UI|MAPI_DIALOG, 0);
if (nError != SUCCESS_SUCCESS && nError != MAPI_USER_ABORT
&& nError != MAPI_E_LOGIN_FAILURE)
{
AfxMessageBox(AFX_IDP_FAILED_MAPI_SEND);
}
//返回程序
pParentWnd->SetActiveWindow();
//不要忘了釋放分配的內存
free(pFileDesc);
free(pTchPath);
FreeLibrary(hMod);
}
本文配套源碼