在VC中调用默认的电子邮件程序发送邮件
2007-07-24 21:00
537 查看
1、省事儿的,用ShellExecute函数:
ShellExecute(NULL,NULL,"mailto:email@263.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;
recip.lpszName = "Your Name";
//邮件结构信息
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);
}
ShellExecute(NULL,NULL,"mailto:email@263.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;
recip.lpszName = "Your Name";
//邮件结构信息
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);
}
相关文章推荐
- 在VC中调用默认的电子邮件程序发送邮件
- 在VC中调用默认的电子邮件程序发送邮件
- VC++ 利用MAPI实现在程序中调用默认的电子邮件程序发送EMAIL(可以添加附件)。
- VC 中调用默认邮件发送程序(Outlook)发送 指定附件的email
- 调用系统默认邮件程序发送邮件(支持Foxmail带附件但有些问题)
- vc 使用 MAPI 发送邮件 提示 有一个程序正试图以您的名义发送电子邮件
- vc 使用 MAPI 发送邮件 提示 有一个程序正试图以您的名义发送电子邮件
- VC自动发送邮件程序
- VC++ 使用ShellExecute函数调用邮箱客户端发送邮件(可以带附件)
- python写的调用ms sqlserver数据并发送邮件的小程序
- python写的调用ms sqlserver数据并发送邮件的小程序
- VC++ 发送邮件(使用邮件进行程序异常报告)
- Android 调用系统邮件程序发送邮件
- 研究学习VC环境下带附件邮件发送程序的实现
- .Net 邮件发送的类,在程序中直接调用就可以了
- 应用中调用 iPhone 自带 Mail 程序发送邮件的代码
- SharePoint 中调用传出电子邮件中的邮件服务器及地址发送邮件
- JAVA程序调用javax.mail发送邮件
- 如何实现程序调用系统邮件,发送app中抓取的xml图片和内容到指定的邮箱
- Android不调用第三方程序发送邮件