利用MAPI实现电子邮件功能
利用MAPI实现电子邮件功能
随着办公自动化应用软件水平的提高和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,LPSTRlpszName,LPSTRlpszPassword,ULONGflFlags,ULONGulReserved,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,ULONGulUIParam,ULONGflFlags,ULONGulReserved)
其中:
lhSessionMAPILogon返回的进程指针,调用MAPILogoff后无定义;
ulUIParam父窗口的指针(HWND类型),
0表示无父窗口;
flFlags保留字,必为0;
ulReserved保留字,必为0;
函数的返回值为0表示成功。
MAPISendDocuments:
原型:
ULONGMAPISendDocuments(ULONGulUIParam,LPSTRLPSTRLPSTRlpszDelimChar,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::OnMapiLogoff()
{
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:ιιautoexec.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调用
不积跬步,无以至千里;不积小流,无以成江海。