博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VC++使用IMAPI调用Outlook邮箱客户端和Foxmail邮箱客户端遇到的问题
阅读量:7012 次
发布时间:2019-06-28

本文共 2384 字,大约阅读时间需要 7 分钟。

 

发送邮件 MAPISendMail()

  发送邮件功能就是对MAPISendMail()的封装。下面解释这个API函数的参数定义。

    ULONG FAR PASCAL MAPISendMail(LHANDLE lhSession, ULONG ulUIParam, lpMapiMessage lpMessage, FLAGS flFlags, ULONG ulReserved);

  ulUIParam 可以为 0,如果设置了 MAPI_DIALOG 标志,则最好传给它父窗口句柄。

  lhSession和ulReserved这两个参数,简单地设置为0就可以了。
  flFlags有三个有效位,分别是 MAPI_DIALOG,MAPI_LOGON_UI,MAPI_NEW_SESSION。如果希望程序弹出一个标准的邮件撰写对话框,请设置 MAPI_DIALOG,建议不要设置 MAPI_LOGON_UI 和 MAPI_NEW_SESSION。
  重点是 lpMessage 这个参数,它指向一个MapiMessage类型的结构,详细地定义了一个邮件的全部信息。

  3、结构 MapiMessage

  使用时首先定义一个MapiMessage类型的变量,将其清零。现在我们只要简单地设定lpszSubject(标题)、lpszNoteText(正文)、lpOriginator(发件人)、nRecipCount(收件人计数,包含TO、CC、GCC),lpRecips(一个包含全部收件人的数组),nFileCount(附件计数)、lpFiles(包含每个附件信息的数组)。

  nRecipCount 和 nFileCount 的值一定要与实际的收件人和附件数目相符。

  4、结构 MapiRecipDesc

  必须设置 ulRecipClass、lpszName、lpszAddress

  5、结构 MapiFileDesc

  必须设置的有 lpszPathName、nPosiotion 两个参数

  这里有个地方需要特别注意。我在实际编码过程中,有几次 Outlook 不能正确弹出窗口(自动发送也不行),但是同样的过程,将邮件客户设为 OutlookExpress 就没有问题。十分头痛。经过反复检查,发现 nPosiotion 这个参数十分重要。它指示附件在邮件中的位置。
  对于一些邮件客户端,比如OutlookExpress,也许忽略了这个参数,由客户端自动安排。所以没有问题。对于另一些客户端,比如Outlook,总是按照这个值的指示来安排的。如果附件数多于一个,这个值如果相同,那么就会造成错误。但是自行计算挺麻烦而且没什么意义。解决的方法是,将其设为 -1,指示客户软件自行安排。:)

-----------------------------------------------------------------------------------------------------------------------------------

 

在填写MapiRecipDesc时,若当前默认邮箱客户端是Foxmail时,lpszName可以不用设置;若当前默认邮箱客户端时Outlook时,如果lpszName不设置内容,最后调用SendMail时会失败;

例如:example@163.com

设置lpszname=“example”;   

     lpszAddress =“example@163.com”;

    ulRecipClass = MAPI_TO;

最后调出来的outlook收件人地址显示正常,但点击发送回退信,在已发送里面查看收件人两头会无故多出单引号,导致收件人地址错误。

 

最后换成 lpszname=“example@163.com”;

              ulRecipClass = MAPI_TO;

就发送成功了。。。。。很奇怪,但此刻再把默认邮箱客户端改为Foxmail,再进行调用就无法成功;

 

因此要想同时兼容outlook和Foxmail时,程序内部要进行判断。

在注册表中有对应邮箱的键值:HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\mailto\UserChoice

  默认邮箱客户端是Outlook

                  默认邮箱客户端是Foxmail

 

最后加上如果从注册表读取Progid键的具体值

wstring wstrValue;    HKEY hKey;       LONG lResult;    LPCTSTR lpDefault = L"Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\mailto\\UserChoice\\";     DWORD dataType = REG_SZ;    TCHAR keyValue[500];    DWORD dataSize = 500;//定义数据长度    long lRet = ::RegOpenKeyEx(HKEY_CURRENT_USER, lpDefault, 0, KEY_ALL_ACCESS, &hKey);    if(lRet == ERROR_SUCCESS)     {         lResult = ::RegQueryValueEx(hKey, _T("Progid"), NULL, &dataType, (LPBYTE)keyValue, &dataSize );    }    ::RegCloseKey(hKey);

 

转载地址:http://fsqtl.baihongyu.com/

你可能感兴趣的文章
EasyUI学习总结(一)——EasyUI入门
查看>>
二叉树乘法器
查看>>
开店攻略: 导购员在面对顾客促销的过程的不恰当之处
查看>>
gulp介绍及常用插件
查看>>
Jquery 获取checkbox的checked问题
查看>>
[LeetCode] Peeking Iterator
查看>>
正则表达式(转)
查看>>
Flood-it!
查看>>
51nod 1230:幸运数
查看>>
初识python: 字符串常用操作
查看>>
Python玩转硬件:TPYBoard-Micropython开发板大盘点
查看>>
[原创] zabbix学习之旅一:源码安装
查看>>
为什么不使用工厂模式,以new Class的方式实例化对象并调用方法不利于项目升级的维护...
查看>>
DataGridView绑定数据库,取得的数据插入到DataGridView指定列(一)
查看>>
HDU_1143_tri tiling
查看>>
POJ_3020_最小路径覆盖
查看>>
codeforces_1075_C. The Tower is Going Home
查看>>
[BZOJ3262]陌上花开(CDQ分治)
查看>>
使用BBED模拟Oracle数据库坏块
查看>>
第一个WP8程序,照相机
查看>>