调用默认的电子邮件程序发送EMail

王朝vc·作者佚名  2006-01-17
窄屏简体版  字體: |||超大  

调用默认的电子邮件程序发送EMail

作者:耿海增

下载本文示例工程

示例代码运行效果图如下:

功能介绍:很多时候大家需要在程序中发送邮件,自己编又太麻烦,怎么办,呵呵,有现成的!

1、我们可以用ShellExecute函数简单的调用默认的电子邮件程序:

ShellExecute(NULL,NULL,"mailto:email@163.net",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);

}

(全文完)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航