1.利用ShellExecute 可以条用默认邮件客户端,但不能发送带附件的邮件

mailto:用户账号@邮件服务器地址?subject=邮件主题&body=邮件正文  
  如:ShellExecute(handle, ‘open’, ‘ mailto:who@mail.neu.edu.cn?subject=Hello&Body=This is a test’, nil, nil, SW_SHOWNORMAL);打开新邮件窗口,并自动填入收件人地址、邮件主题和邮件正文。若邮件正文包括多行文本,则必须在每行文本之间加入换行转义字符%0a。

转载:http://blog.csdn.net/hczhiyue/article/details/6974593

2.

转载:http://www.vckbase.com/index.php/wv/452.html

转载:http://blog.csdn.net/elcoteq983/article/details/7286560

 //必须包括 mapi.h 头文件
#include "mapi.h" /* code 为非Unicode版本 */
/*********************************************************************
* 函数名称: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);
MessageBox(NULL,"加载失败","提示",MB_OK);
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 = ; //有多少个附件需要发送,在此我设置为1 //分配内存保存附件信息 不能使用静态数组,因为不知道要发送附件的个数
MapiFileDesc* pFileDesc = (MapiFileDesc*)malloc(sizeof(MapiFileDesc) * nFileCount);
memset(pFileDesc,,sizeof(MapiFileDesc) * nFileCount); //分配内存保存附件文件路径
TCHAR* pTchPath = (TCHAR*)malloc(MAX_PATH * nFileCount); CString szText;
for(int i = ;i < nFileCount;i++)
{
TCHAR* p = pTchPath + MAX_PATH * i;
m_list.GetText(i,szText);
strcpy(p,szText); (pFileDesc + i)->nPosition = (ULONG)-;
(pFileDesc + i)->lpszPathName = p;
(pFileDesc + i)->lpszFileName = p;
} //收件人结构信息
MapiRecipDesc recip;
memset(&recip,,sizeof(MapiRecipDesc));
recip.lpszAddress = xxx@.com;//收件人邮箱地址
recip.ulRecipClass = MAPI_TO; //邮件结构信息
MapiMessage message;
memset(&message, , sizeof(message));
message.nFileCount = nFileCount; //文件个数
message.lpFiles = pFileDesc; //文件信息
message.nRecipCount = ; //收件人个数
message.lpRecips = &recip; //收件人
message.lpszSubject = "hello"; //主题
message.lpszNoteText = "This is test"; //正文内容 //发送邮件
int nError = lpfnSendMail(, ,&message, MAPI_LOGON_UI|MAPI_DIALOG, ); if (nError != SUCCESS_SUCCESS && nError != MAPI_USER_ABORT
&& nError != MAPI_E_LOGIN_FAILURE)
{
// AfxMessageBox(AFX_IDP_FAILED_MAPI_SEND);
MessageBox(NULL,"发送失败","提示",MB_OK);
} //不要忘了释放分配的内存
free(pFileDesc);
free(pTchPath);
FreeLibrary(hMod);
}
 /*Unidode 版本*/

 #include "mapi.h"
#include <atlstr.h> std::string UnicodeToANSI(const wstring& wstr)
{
int unicodeLen = ::WideCharToMultiByte(CP_ACP,,wstr.c_str(),-,NULL,, NULL ,NULL); if(unicodeLen == ) return std::string(""); char *pChar= new char[unicodeLen+]; memset(pChar , , sizeof( char ) * (unicodeLen+)); ::WideCharToMultiByte(CP_ACP,,wstr.c_str(),-,pChar,unicodeLen, NULL ,NULL); pChar[unicodeLen]=; string str = pChar; delete [] pChar;
pChar=NULL; return str;
} int main()
{ //装入MAPI32.DLL动态库
HMODULE hMod = LoadLibrary(L"MAPI32.DLL"); if (hMod == NULL)
{ return -;
} //获取发送邮件的函数地址
ULONG (PASCAL *lpfnSendMail)(ULONG, ULONG, MapiMessage*, FLAGS, ULONG);
(FARPROC&)lpfnSendMail = GetProcAddress(hMod, "MAPISendMail"); if (lpfnSendMail == NULL)
{ return -;
} int nFileCount = ; //有多少个附件需要发送 //分配内存保存附件信息 不能使用静态数组,因为不知道要发送附件的个数
MapiFileDesc* pFileDesc = (MapiFileDesc*)malloc(sizeof(MapiFileDesc) * nFileCount);
memset(pFileDesc,,sizeof(MapiFileDesc) * nFileCount); //分配内存保存附件文件路径
CHAR* pTchPath = (CHAR*)malloc(MAX_PATH * nFileCount); CString szText("C:\\ 网站.txt"); for(int i = ;i < nFileCount;i++)
{
CHAR* p = pTchPath + MAX_PATH * i; string temp = UnicodeToANSI(szText.GetBuffer());
strcpy (p,temp.c_str()); (pFileDesc + i)->nPosition = (ULONG)-;
(pFileDesc + i)->lpszPathName = p;
(pFileDesc + i)->lpszFileName = p;
} //收件人结构信息
MapiRecipDesc recip;
memset(&recip,,sizeof(MapiRecipDesc));
recip.lpszAddress = "2xxxxxx1@qq.com";
recip.ulRecipClass = MAPI_TO; recip.lpszName = "Your Name"; //邮件结构信息
MapiMessage message;
memset(&message, , sizeof(message));
message.nFileCount = nFileCount; //文件个数
message.lpFiles = pFileDesc; //文件信息
message.nRecipCount = ; //收件人个数
message.lpRecips = &recip; //收件人
message.lpszSubject = "hello"; //主题
message.lpszNoteText = "This is test"; //正文内容 //发送邮件
int nError = lpfnSendMail(, ,&message, MAPI_LOGON_UI|MAPI_DIALOG, ); if (nError != SUCCESS_SUCCESS && nError != MAPI_USER_ABORT
&& nError != MAPI_E_LOGIN_FAILURE)
{
//错误提示信息
} //不要忘了释放分配的内存
free(pFileDesc);
free(pTchPath);
FreeLibrary(hMod); return ;
}

转载:http://blog.csdn.net/ghz/article/details/13279

转载:http://blog.csdn.net/waterathena/article/details/3346395

VC++ 利用MAPI实现在程序中调用默认的电子邮件程序发送EMAIL(可以添加附件)。的更多相关文章

  1. iOS 如何在一个应用程序中调用另一个应用程序

    原则上iOS的沙箱原理,是阻止一个app去访问其他app的资源乃至是系统底层的资源的但是我们可以通过一种变相的方式:通过对应的URL模式和其他程序进行通讯. iOS应用之间的调用步骤: 一, 调用自己 ...

  2. 利用 gnuplot_i 在你的 c 程序中调用 GNUPLOT

    这是一篇非常早曾经写的小文章,最初发表于我的搜狐博客(2008-09-23 22:55).由于自从转移到这里后,sohu 博客就不再维护了,所以把这篇文章也一起挪了过来. GNUPLOT 是一款功能强 ...

  3. Native Application 开发详解(直接在程序中调用 ntdll.dll 中的 Native API,有内存小、速度快、安全、API丰富等8大优点)

    文章目录:                   1. 引子: 2. Native Application Demo 展示: 3. Native Application 简介: 4. Native Ap ...

  4. 从C#程序中调用非受管DLLs

    从C#程序中调用非受管DLLs 文章概要: 众所周知,.NET已经渐渐成为一种技术时尚,那么C#很自然也成为一种编程时尚.如何利用浩如烟海的Win32 API以及以前所编写的 Win32 代码已经成为 ...

  5. 在网页程序或Java程序中调用接口实现短信猫收发短信的解决方案

    方案特点: 在网页程序或Java程序中调用接口实现短信猫收发短信的解决方案,简化软件开发流程,减少各应用系统相同模块的重复开发工作,提高系统稳定性和可靠性. 基于HTTP协议的开发接口 使用特点在网页 ...

  6. iOS程序中调用系统自带应用(短信,邮件,浏览器,地图,appstore,拨打电话,iTunes,iBooks )

    在网上找到了下在记录下来以后方便用 在程序中调用系统自带的应用,比如我进入程序的时候,希望直接调用safar来打开一个网页,下面是一个简单的使用:

  7. Java程序中调用Python脚本的方法

    在程序开发中,有时候需要Java程序中调用相关Python脚本,以下内容记录了先关步骤和可能出现问题的解决办法. 1.在Eclipse中新建Maven工程: 2.pom.xml文件中添加如下依赖包之后 ...

  8. python利用or在列表解析中调用多个函数.py

    python利用or在列表解析中调用多个函数.py """ python利用or在列表解析中调用多个函数.py 2016年3月15日 05:08:42 codegay & ...

  9. 如何在程序中调用Caffe做图像分类

    Caffe是目前深度学习比较优秀好用的一个开源库,采样c++和CUDA实现,具有速度快,模型定义方便等优点.学习了几天过后,发现也有一个不方便的地方,就是在我的程序中调用Caffe做图像分类没有直接的 ...

随机推荐

  1. paper 76:膨胀、腐蚀、开、闭运算——数字图像处理中的形态学

    膨胀.腐蚀.开.闭运算是数学形态学最基本的变换.本文主要针对二值图像的形态学膨胀:把二值图像各1像素连接成分的边界扩大一层(填充边缘或0像素内部的孔):腐蚀:把二值图像各1像素连接成分的边界点去掉从而 ...

  2. 夺命雷公狗---node.js---15之加密

    node其实也给我们留下了密码的加密发送,不过一般都是用cmd5加密其实也是够了,但是sha1加密也要提下: /** * Created by leigood on 2016/8/31. */ var ...

  3. 夺命雷公狗---linux之centos的安装

    由于要玩node.js了,所以还是来复习下linux系统才行,所以夺命雷公狗分享两套安装linux的方法,这是centos的安装方法,,, 管理员默认帐号为:root,密码则是刚才您输入的那个...

  4. 夺命雷公狗jquery---1选择元素的3种方法

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. PAT乙级 1001. 害死人不偿命的(3n+1)猜想 (15)

    1001. 害死人不偿命的(3n+1)猜想 (15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 卡拉兹(Ca ...

  6. [OrangePi] Booting from USB drive

    You can also boot from USB drive partition. The file named cmdline.txt must exist on BOOT (fat) part ...

  7. [tp3.2.1]让默认页面: 加载Home模块的Index控制器;而让admin.php默认去加载Admin模块的Adminc控制器.

    QQ:让index.php默认加载Home模块的Index控制器;而让admin.php默认去加载Admin模块的Adminc控制器.AA:复制index.php命名为admin.php复制(新建)A ...

  8. OpenStack 多台计算节点时的问题

    Contents [hide] 1 前言 2 bug 3 解决方法 4 网络问题 前言 添加一台计算节点后无法创建虚拟机.在调度层就错误: bug https://review.openstack.o ...

  9. redis监控状态

    Redis介绍 Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表.哈希.集合和有序集合5种.支持在服务器端计算集合 ...

  10. Java程序编译和运行的过程【转】

    转自:http://www.360doc.com/content/14/0218/23/9440338_353675002.shtml Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来 ...