MAPI MAPISendMail

    Author: 徐艺波  From: xuyibo.org  Updated: 2007-08-30

      邮件通知  当更新时自动发送邮件通知。
      评论本文  有什么建议或评论,可以贴一下。
      捐助  你的支持,让我们做的更好。
     

  1. 介绍
  2. 这篇文章介绍XP下系统使用mapi32.dll发送邮件的实现细节,和相关注册表的位置。

  3. 如何使用mapi32.dll发送邮件
  4. 当你在开始运行中输入:mailto:beyond5776@163.com?subject=hello email后,如果配置好了邮件发送设置,那么将自动弹出你的邮件客户端,比如在我的机器上:

    你可能要问系统怎么知道改调用outlook express,而不是foxmail或office outlook,请看下面的对话框:

    邮件设置保存在注册表:HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail下,其默认值为默认的电子邮件程序。

    每一项的结构为:


    发送邮件接口:

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

    typedef struct {
        ULONG ulReserved;
        LPTSTR lpszSubject;
        LPTSTR lpszNoteText;
        LPTSTR lpszMessageType;
        LPTSTR lpszDateReceived;
        LPTSTR lpszConversationID;
        FLAGS flFlags;
        lpMapiRecipDesc lpOriginator;
        ULONG nRecipCount;
        lpMapiRecipDesc lpRecips;
        ULONG nFileCount;
        lpMapiFileDesc lpFiles;
    } MapiMessage, FAR *lpMapiMessage;

    实现的时候先动态加载MAPI32.DLL,然后GetProcAddress到函数MAPISendMail,填充MapiMessage数据结构即可。

  5. 内部实现
  6. MAPISendMail动态的枚举可用的发送邮件的客户端程序,处于效率的考虑,MAPISendMail设置了一个全局变量:BOOL bHaveFoundValidMailApp;当这个变量为FALSE的时候说明前面执行过这个函数时没有找到邮件程序,直接退出,否则的话就开始枚举。我们首先要明白一下:mapi的结构非常类似NDIS的,就是上层构建一个抽象接口,根据需要调用合适的下面的相应接口。MAPISendMail依次从下面的文件中枚举的邮件客户端为:

    omi9.dll
    omint.dll
    msmapi32.dll
    mapisvc.inf
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Messaging Subsystem\MSMapiApps
    HKEY_LOCAL_MACHINE\Software\Clients\Mail

    在我的机器上,执行MAPISendMail最终将调用C:\Program Files\Outlook Express\msoe.dll中的导出函数MAPISendMail。

  7. 相关文章
  8. 注册表API简易教程
    轻量级的浏览器控件HTMLLITE
    在XP下使用Link控件
    我的电脑软配置
    让你的程序支持脱拽
    背景透明的按钮

  9. 评论本文:
  10. EMail: