利用MAPI实现电子邮件功能

 

利用MAPI实现电子邮件功能

  在VB、VC中进行面向Internet的开发应用,是近期许多程序员关注的热点。

   随着办公自动化应用软件水平的提高和Intranet的流行,越来越多的办公自动化系统中都采用了电子邮件,如IBMLotusNotes和Microsoft的MailServer(Exchange)和Internet Mail(SMTP/POP)等。在机器上安装了MicrosoftMAPI邮件系统后,在相应的办公软件,如字处理(Word),电子报表(Excel),甚至文件管理器(FileManager)中都有了一个发送菜单,可以直接发送有关的文件,提高了我们的办公效率。如果能够在我们自己开发的应用软件中增加电子邮件功能,难道不是更方便工作人员的使用、提高办公自动化软件的水平吗?

  下面,我将介绍一下在自己开发的软件中和Microsoft的MAPI的结合问题。

  Microsoft公司的电子邮件产品的通讯层称为MAPI(TheMessageApplicationsProgra mmingInterface),正如Windows中的打印系统可以服务于所有的应用程序一样,MAPI也服务于所有的应用软件,Word和Excel也正是利用了MAPI进行通讯的。

  MAPI可以分为简单MAPI(SimpleMAPI)和扩充MAPI(ExtendedMAPI),在目前的Windows16位版本中提供的是简单MAPI,它的最突出的特点是简单易用。Win32中实现了扩充MAPI,下文所说的MAPI即指的是扩充MAPI。

  MAPISDK在Win32SDK中提供,其实也可用于16位的Windows。MAPISDK是由mapi.h,mapi.dll,mapinit.h,mapinit.h等几个文件组成,由于没有提供mapi.lib,所以在mapinit.c和mapinit.c两个文件中直接从mapi.dll中得到函数地址。这几个文件位于VisualC++2.0以上版本的samples/api目录中,也可以从VisualBasic3.0所附的CD-ROM(“OfficeDeveloper'sKit")中得到。

  MAPI提供了以下十几个过程,位于MAPI.DLL中。

  MAPIAddress建立或修改地址表

  MAPIDeleteMail删除邮件消息

  MAPIDetails显示邮件消息的详细信息对话框

  MAPIFindNext返回特定邮件消息类型的下一个(第一个)消息ID

  MAPIFreeBuffer释放邮件系统分配的内存资源

  MAPILogoff结束邮件消息

  MAPIResolveName显示对话框,取得收件人地址

  MAPISaveMail保存邮件消息

  MAPISendDocuments利用对话框发送标准邮件消息

  MAPISendMail发送邮件消息,可以采用较多的灵活性来生成消息

  在编写应用软件时,我们只要考虑一些发送消息调用即可,不必编写完整的消息处理系统,所以下面只对常用的几个函数进行解释。

   MAPILogon:

  原型:

  ULONGMAPILogon(ULONGulUIParam,LPSTRlpszName,LPSTRlpszPassword,ULONGflFlags,ULONGulReserved,LHANDLElphSession)

  其中:

  ulUIParam父窗口的指针(HWND类型),

  0表示无父窗口;

  lpszName帐户名称字符串指针,NULL表示显示Login窗口;

  lpszPassword帐户的口令字字符串指针,NULL表示显示Login窗口,如果口令本

  来没有,则NULL时不显示Login

  窗口;

  flFlags标志码,有下面几种(缺省位为0):

  #defineMAPI—LOGON—UI0x00000001

  显示Login对话框;

  #defineMAPI—NEW—SESSION0x00000002

  如可能,取得缺省值;

  #defineMAPI—FORCE—DOWNLOAD0x00001000

  从服务器下载消息;

  ulReserved保留字,必为0;

  lphSession成功执行后返回的进程指针,用于以后的MAPI函数调用;

  函数的返回值为0表示成功。

   MAPILogoff:

  原型:

  ULONGMAPILogoff(LHANDELlhSession,ULONGulUIParam,ULONGflFlags,ULONGulReserved)

  其中:

  lhSessionMAPILogon返回的进程指针,调用MAPILogoff后无定义;

  ulUIParam父窗口的指针(HWND类型),

  0表示无父窗口;

  flFlags保留字,必为0;

  ulReserved保留字,必为0;

  函数的返回值为0表示成功。

   MAPISendDocuments:

  原型:

  ULONGMAPISendDocuments(ULONGulUIParam,LPSTRLPSTRLPSTRlpszDelimChar,LPSTRlpszFilePaths,LPSTRlpszFileNames,ULONGulReserved)

  说明:发送标准的MAPI消息,显示发送对话框,可以粘贴所要求的文档。在发送利用缺省的MAPI连接,无MAPI连接时显示Login对话框。

  其中:

  ulUIParam父窗口的指针(HWND类型),

  0表示无父窗口;

  lpszDelimChar要发送粘贴的文件之间的分隔符,这个分隔符不在所用的操作系统中

  用做文件名,在DOS和WINDOWS中如分号(;);

  lpszFilePaths文件路径名字符串指针,文件名应用全名(可含盘符),中间用lpszDe-limChar分开,在MS-DOS系统中如下例,也可以为空,在对话框中输入。

  lpszFileNames文件名字符串(8.3格式),用于在MAPI消息中显示,格式同上,

  如MEMO.DOC;EXPENSES.DOC

  ulReserved保留字,必为0;

  函数的返回值为0表示成功。

  其他函数的说明可以参考有关书籍。下面我们用这三个函数写一段小程序。这一程序有三个菜单,分别为进入邮件系统(LOGIN),退出邮件(LOGOUT),发送标准邮件信息(Send)。本例的发送标准邮件消息在发送的同时也发送了一个文本文件,从而可以做为一个完整的例子。

  程序采用VisualC++1.52编写,采用MFC类库的消息处理机制编写,以下是程序片断:

  //退出邮件系统

  voidCMainWindow::OnMapiLogoff()

  {

  if(hMAPISession!Κ0)

  (*lpfnMAPILogoff)

  ((unsignedlong)hMAPISession,0,0,0);

  hMAPISessionΚ0;

  }

  //邮件系统登录

  voidCMainWindow::OnMapiLogon()

  {

  FLAGSflFlag;

  flFlagΚMAPI—LOGON—UI;

  HWNDhWndΚGetSafeHwnd();

  (*lpfnMAPILogon)((unsignedlong)hWnd,NULL,NULL,flFlag,0L,}

  //发送文件c:ιautoexec.bat,系统会弹出对话框选择收件人

  voidCMainWindow::OnMapiSenddocument()

  {

  (*lpfnMAPISendDocuments)(0,″;″,″c:ιιautoexec.bat″,″autoexec.bat″,0);

  }

  在程序的初始化部分(InitInstance())中增加下面几行,测试MAPI.DLL是否可用:

  if(InitMAPI()!Κ0)

  {

  AfxMessageBox(″CannotLoadMAPI.DLL″);

  returnFALSE;

  }

  由于MAPI是Microsoft公司消息处理系统的基础,并具有方便易用的特点,所以其他一些电子邮件软件和工作流软件也实现了MAPI接口,使用户可以使用简单的MAPI发送Internet邮件或实现工作流。例如,在最流行的Internet邮件Eudora(商业版本2.0以上,免费版本3.0以上),有是否使用MAPI的可选项,从而使我们可以在应用程序中直接发送Internet Email。LotusNotes也可以截获MAPI调用
posted @ 2007-10-22 19:09  Socrates  阅读(659)  评论(0编辑  收藏  举报