MAPI MAPISendMail

Author: 徐艺波(xuyibo) Views: 124 UpdateTime:2007-8-30
      留言

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

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

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

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

    每一项的结构为:


    发送邮件接口:

    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_MACHINESOFTWAREMicrosoftWindows Messaging SubsystemMSMapiApps
    HKEY_LOCAL_MACHINESoftwareClientsMail

    在我的机器上,执行MAPISendMail最终将调用C:Program FilesOutlook Expressmsoe.dll中的导出函数MAPISendMail。

留言: (留言使用了AJAX,提交的留言将自动显示在下面)Top
User:

Email:beyond5776@163.com QQ:85521028
Copyright ©2002-2007 XuYibo All rights reserved. License | Contributor