惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Securelist
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
WordPress大学
WordPress大学
博客园 - 聂微东
博客园 - 【当耐特】
小众软件
小众软件
V
V2EX
腾讯CDC
酷 壳 – CoolShell
酷 壳 – CoolShell
月光博客
月光博客
宝玉的分享
宝玉的分享
有赞技术团队
有赞技术团队
人人都是产品经理
人人都是产品经理
N
News and Events Feed by Topic
雷峰网
雷峰网
Hugging Face - Blog
Hugging Face - Blog
量子位
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
博客园 - 司徒正美
P
Privacy & Cybersecurity Law Blog
The Hacker News
The Hacker News
AI
AI
O
OpenAI News
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Threat Research - Cisco Blogs
Jina AI
Jina AI
博客园_首页
罗磊的独立博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Apple Machine Learning Research
Apple Machine Learning Research
Last Week in AI
Last Week in AI
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
IT之家
IT之家
V
Vulnerabilities – Threatpost
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Google Online Security Blog
Google Online Security Blog
G
GRAHAM CLULEY
P
Proofpoint News Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Hacker News: Ask HN
Hacker News: Ask HN
P
Palo Alto Networks Blog
S
SegmentFault 最新的问题
T
The Exploit Database - CXSecurity.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
N
News and Events Feed by Topic
V
Visual Studio Blog
博客园 - 叶小钗
阮一峰的网络日志
阮一峰的网络日志

博客园 - hcfalan

Mybatis分页功能 安聊服务端Netty的应用 安聊系统1.0发布 自绘窗口边框和标题栏 Windows下生产者-消费者问题的解法 Javascript 时间日期转换 Java Threading - Consumer&Producer Boost socket 同步编程示例(服务端,客户端) MFC CSocket的跨线程问题 用于主题检测的临时日志(54b8134e-5e4a-46fc-95af-c75ccf06d66e - 3bfe001a-32de-4114-a6b4-4005b770f6d7) 网络电话 VC 剪贴板操作 The 1st Boost Serial Demo - hcfalan MS Proxy FTP Sample 《斯坦福大学开放课程: 编程方法学》 VC2005下编译log4cpp的修正方法 - hcfalan - 博客园 适合孩子的书籍 一个最经典的线程类(转) 应用MFC开发高级应用程序(转)
VC中发送电子邮件
hcfalan · 2011-12-02 · via 博客园 - hcfalan

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

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

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