首页 IP地址查询 | Alexa排名查询 | 手机归属地查询
设为首页 收藏本站
  • 网络编程网络编程
  • 软件编程软件编程
  • 数据库技术数据库技术
  • 编程学院
  • 业界资讯 业界资讯
  • 源码中心源码中心
  • 会员中心会员中心
  • 页面导航: 首页网络编程FTP/HTTP/Web → 调用默认的电子邮件程序发送EMail

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

    发布:耿海增 发布日期:2008-07-31 字体:[增加 减小] 类型:转载

    下载本文示例工程
    示例代码运行效果图如下:


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

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

    (全文完)


    Tags: EMail
    为配合网络严查,文章评论将关闭敬请谅解.
    同 类 文 章
    最 近 更 新
    热 点 排 行