VC中发送电子邮件

注:原文来自http://www.vckbase.com/document/viewdoc/?id=651

 

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

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);

}

你可能感兴趣的:(邮件)