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

推荐订阅源

cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Recorded Future
Recorded Future
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
S
SegmentFault 最新的问题
博客园 - 司徒正美
Last Week in AI
Last Week in AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
云风的 BLOG
云风的 BLOG
雷峰网
雷峰网
博客园 - 叶小钗
The GitHub Blog
The GitHub Blog
MyScale Blog
MyScale Blog
腾讯CDC
博客园 - 聂微东
D
DataBreaches.Net
博客园 - Franky
人人都是产品经理
人人都是产品经理
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 【当耐特】
量子位
宝玉的分享
宝玉的分享
D
Docker
T
Tailwind CSS Blog
IT之家
IT之家
Engineering at Meta
Engineering at Meta
P
Proofpoint News Feed
C
CERT Recently Published Vulnerability Notes
Scott Helme
Scott Helme
Project Zero
Project Zero
Microsoft Azure Blog
Microsoft Azure Blog
AWS News Blog
AWS News Blog
Google DeepMind News
Google DeepMind News
H
Heimdal Security Blog
W
WeLiveSecurity
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
有赞技术团队
有赞技术团队
Simon Willison's Weblog
Simon Willison's Weblog
NISL@THU
NISL@THU
C
Cybersecurity and Infrastructure Security Agency CISA
Google DeepMind News
Google DeepMind News
T
Threatpost
TaoSecurity Blog
TaoSecurity Blog
N
News and Events Feed by Topic
aimingoo的专栏
aimingoo的专栏
Recent Commits to openclaw:main
Recent Commits to openclaw:main
www.infosecurity-magazine.com
www.infosecurity-magazine.com
SecWiki News
SecWiki News
S
Securelist

博客园 - 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);
}