维普资讯 http://www.cqvip.com 电 | 0 ≤誊鬻 3: 熊 甍 摘 要本文主要介绍如何使用微软公司的MAPI(Messaging Application Programming In— terfaee,消息应用程序编程接口),实现电子邮件的收发功能。 关键词VB,电子邮件,消息应用程序 (邮件)的数量;函数GetRCList,从MAPIMessages控件中获 一、引言 发送和接收电子邮件,对于某些执行特殊任务的应用程序 得所有收信人的姓名,姓名之间用分号隔开,返回值为所有收 信人姓名;函数KillReeips,从控件中删除所有收信人地址; 函数LoadList,将邮件的信息装载到邮件列表窗体中的列表框 中;函数LoadMessage,将当前消息(根据Index)装载到窗体 msg中,msg窗体可以是查看消息的窗体MsgView,也可以是 而言。是一个十分有用的功能。在Visual Basic中,应用程序 可以通过调用微软公司的MAPI,实现收发电子邮件的功能。 编制具有收发电子邮件功能的程序,必须使用Visual Basic 4.0 以上的版本。因为只有4.0以上的Visual Basic才带有两个实 现电子邮件收发功能的核心控件:MAPI会话控件和MAPI消 息控件。MAPI会话控件用于建立和控制一个Microsoft Mail会 话,MAPI消息控件用于创建和收发邮件消息。此外,程序必 须运行在采用遵从MAPI的消息系统(如:Microsoft Ex- 书写新消息的窗体NewMsg;函数LogOffUser,注销发送邮件连 接卸载所有的子窗体,设置各个菜单项及工具栏按扭的可用状 态;函数PrintLongText,打印消息的子程序之一,用于打印消 息的正文;函数Printmail,打印消息的子程序之一,用于取得 要打印的消息;函数PrintMessage,打印消息的子程序之一, change、Micosroft Mail、Oudook等)的环境中。 用于设置打印机和取得打印消息头;函数SetRCList,根据存储 收信人姓名的字符串NameList(姓名用分号隔开),设置收信 人姓名;函数UpdateRecips,更新收信人和转发的地址;函数 ViewNextMsg,查看下一个消息。 二、模块设计 模拟电子邮件Oudook Express的基本功能包括邮件的收 发、附件的发送和查看、邮件的回复、电话薄的设置、打印邮 件和邮件设置。程序共有五个窗体和一个模块组成。其中窗体 包括阅读邮件消息的窗体,书写和发送邮件的窗体,显示邮件 消息列表的窗体,收发邮件设置窗体和主窗体。 1.模块部分 2.界面部分 进入到主界面,最初由于处于离线状态,当系统登录到服 务器后,程序打开邮件对话,取得邮件箱中的邮件数量,将邮 件的信息装载到邮件列表窗体中的列表框中,并显示收信箱中 的所有邮件消息的基本信息,如下图所示。 在程序开始首先编写模块代码,定义当MAPIMessages控 件被激活时,Action属性使用的常数,该属性决定将执行什么 操作。以下是声明读取注册表内容的函数:函数Attachments, 此子程序的功能是将有附件的信息装载到窗体msg的列表框 “Alist”中;函数CopyNamestoMsgBuffer,此子程序的功能是 删除原来的收信人地址,并将窗体msg中填写的收信人和抄送 人地址添加到发送邮件的地址;函数DateFromMapiDate¥,根 据给定的日期返回一定格式的日期的表示形式;函数 DeleteMessage,用于删除当前选中的邮件;函数DisplayAt- tachedFile,根据文件类型查看附件文件;函数FindMsgWin. dow,判断当前所有子窗体中是否包含有相对邮件索引的邮 件,如果没有则返回值为一1;函数GetHeader,用于从控件取 电子邮件收发主界面图 得邮件的头信息;函数GetMessageCount,获取邮箱中所有消息 维普资讯 http://www.cqvip.com …………………………………………………………‘ 实用第-/ 智慧密集 ……………・……………………………………………j 其实现的核心代码如下: Private Sub Logon_Click() 登录 On Error Resume Next 打开邮件对话 MAPlSess.Action=1 IfErr<>OThen MsgBox 登录失败!!! +Errors Else Screen.MousePointer=1 1 MAPIMess.SessionID=MAPlSess.SessionlD 取得邮箱中邮件的数量 GetMessageCount Screen.MOusePOinter=1 1 将邮件的信息装载到邮件列表窗体中的列表框 Call LoadList(MAPI Mess) Scren.MousePointer=0 EndIf EndSub “收取邮件”执行收取邮件操作,利用GetMessageCount 函数取得邮箱中邮件的数目,调用LoadList(MAPIMess)函数将 邮件信息装载到邮件列表窗体中; “转发邮件”取邮件的正文 及邮件头,执行转发操作,如果SendWithMapi为true,则使用 MAPI对话框撰写及转发电子邮件,否则使用设计的窗体 NewMsg撰写及转送电子邮件。其实现的核心代码如下: Private Sub Mfetch_Click() VBMail.MAPIMess.Action=1 读取邮件 GetMessageCount ・ Call LoadUst(MA PlMess) , EndSub Private Sub Mforward-!:lick() svNote=VBMail.MAPIMess.MsgNoteText 转发邮件 svNote=GetHeader(VBMaiI.MAPIMess)+svNote VBMaiL APIMess.Action=9 发送 VBMall MAPIMess.MsgNoteText=svNote IfSendWRhMapiThen VBMa MAPIMess.Action=vbMessageSenddlg 使用MAPI对话框撰写及转发电子邮件 Else .CallLoedM ̄(二1,NewMsg) 使用设计的窗体NewMsg撰写及转送电子邮件 EndIf EndSub “回复邮件”取邮件的正文及邮件头,执行回复操作; “撰写新邮件”执行写邮件操作,若SendWithMapi为真则使 用MAPI对话框撰写及发送电子邮件,否则使用设计的窗体 NewMsg撰写及发送电子邮件; “删除邮件”则调用 DeleteMessage函数删除邮件。其核心代码如下: P rivate Sub Mreply-j:lick() svNote=VBMail.MAPIMess.MsgNoteText 回复邮件 svNote;GetHeader(VBMaiL MAPIMess)+svNote VBMail.MAPIMess.Action=7 回复 VBMail.MAPIMess.MsgNoteText=svNote If SendWithMapiThen EndIf EndSub Private Sub EditDelete_Click() 删除邮件 On ErrorGoTotrap IfTypeOfVBMail.ActiveForm Is MailLstThen VBMa-1.MAPfMess.Msglndex=MailLst.Mlist.Listlndex Call DeleteMessage EndIf trap: ExitSub EndSub 当系统登录到服务器后,当单击邮件列表时,根据选择的 邮件索引确定当前邮件收信人和发信人的姓名,双击或回车键 按下邮件列表中的邮件时,可以在阅读新邮件的窗体中显示选 中的消息(包括消息的基本信息、发送人、消息主体、收信 人、消息发送日期以及消息的正文)。首先打开附件文件的子 程序,判断VBMail.MAPIMess控件中的附件是否为VB 6.0可 识别的文件类型,若可识别则查看文件,否则提示“不能打 开”信息。当阅读邮件消息的子窗体处于活动子窗体时,将 MAPIMessages控件的消息索引与邮件消息列表框索引设置为与 当前阅读的邮件一致,并且当窗体大小发生改变时,调整各控 件的大小。其核心代码如下: Private Sub alist_DblClick() 打开附件文件的子程序 VBMa.1.MAPIMess.A ̄achmentlndex=alist.Listlndex If VBMail.MAPIMess.AttachmentType=vbAttachTypeData Then Call DisplayAttachedFile (VBMaI1.MAPIMess.AttachmentPathName) Else MsgBox Thissampleapplicationdoesn tviewOLE—typeat- 协chments EndIf EndSub . Private SubForm_Activate() 当阅读邮件消息的子窗体处于是活动子窗体时 将MAPtMessages控件的消息索引与邮件消息列表框索引 设置为与当前阅读的邮件一致 MailLst.Mlist.Listlndex=Val(Me.Tag) MailLst.Mlist.ItemData(Val(Me.Tag))=True VBMaII.MAPIMess.Msglndex=Val(Me.Tag) EndSub 三、核心技术 在开发邮件收发中,要解决的关键问题是收取邮件、发送 邮件和附件的处理。通过利用Visual Basic 6.0中的MAPISes— sion和MAPIMessages控件来解决以上关键问题的。下面将详细 维普资讯 http://www.cqvip.com 介绍该控件的关键技术。 1.利用控件MAPISession建立电子邮件的对话 在利用建立由&件对话之前,关键要了解其以下属性: (1)Action的属性 使用MAPIMessages控件可以执行的操作是:访问当前收 件箱中的消息;构成一条新消息;添加及删除消息收件人和附 件;发送消息(无论有无支持的用户接口);保存、复制和删 除消息;显示“通讯簿”对话框;显示“详细资料”对话框; 访问附件。包括附件链接和嵌入(OLE)附件;在寻址过程 中,分析一个收件人的名字;对消息执行应答、全应答和转发 操作。 3.邮件及附件的收取和发送处理过程 该属性决定激活MAPISession控件时,执行什么动作。当 MapSignOn的值为1时将用户加载到根据User naltle和password 属性指定的帐户下,并对当前的消息系统提供了一个对话句 柄。对话句柄保存在SessionID属性中,依NewSession属性的 值,对话句柄可能参考一个新创建的对话或已有的对话。当 MapSignOff为0时。结束消息对话,并使用户退出指定的帐户 (2)DowaloadMail属性 指定用户从邮件服务器中下载新消息的时间,该值的缺省 值为True,表示在启动过程中来自邮件服务器的所有新消息将 下载到用户的收件箱中,若值为False时,服务器中的新消息 不是立即顺利下载到用户的收件箱,而是在用户设定的时候问 隔内下载到新消息。 (3)LogonUI属性 指定是否为启动对话提供一个对话框,设置值为true时对 话框提示用户输入用户名和密码,设置值为false时不显示对 话框。但要注意的是如果想开始一个邮件对话但又不希望用户 干预,并且已经有了该用户的用户名和密码时,将LogonUI设 置成fales是很有用的。然而,如果没有提供足够的信息或提 供了错误的信息值将产生错误。 (4)NewSession属性 指定是否建立一个新的邮件对话,当属性值为true时无论 是否已有一个有效对话,都建立一个新的消息对话,当属性值 为false时使用用户已建立的对话。 (5)UserName属性与Password属性 指定账户用户名,或建立对话所使用的配置文件。Pass— word制定和UserName属性相关的帐户密码。在安装了Mi— crosoft Exchange或Microsoft Oudook的计算机上,UserName属 性设置了当建立对话时所使用的配置文件。配置文件包括用户 实际使用的名称和口令,使得不再使用Password属性。通过单 击Windows控制面板上的“Mail and Fax”图标可以建立新的配 置文件。 (6)SessionID属性 在用SignOn方法建立消息处理对话后,该属性将返回一 个唯一的消息处理对话句柄。SignOn的值可被MAPIMessages 控件用来创建与合法消息处理对话的关联。 2.利用MAPIMessages控件管理和访问个人的收件箱 在利用MAPISession控件建立一个消息对话后,设置 MAPIMessages的属性SessionID与MAPISession的属性SessionID 相关联,这样就可以用MAPIMessages控件执行各种消息系统 功能。 编辑邮件发送程序的基本处理过程是:根据用户输入信息 组成邮件,然后使用MAPI消息控件的send方法将邮件发出。 邮件接收程序比邮件发送程序稍微复杂一些。首先需要使用 MAPI消息控件的Fetch方法读取邮件,这个过程将把用户收件 箱中所有未读邮件全部装入MAPI消息控件中。然后,检查 MAPI消息控件的MsgCount属性以确定通过Fetch方法读取的 邮件的总数。接着,可以通过设置MAPI消息控件的MsgIndex 属性来指定具体需要处理哪一封邮件。需要说明的是,Msgln dex属性值的计数是从0开始的,也就是说,第一封邮件的索 引号是0,第二封邮件的索引号是1,依次类推。与处理邮件 的方式一样,MAPI也为邮件的附件提供了一个计数器和一个 索引。在处理收到的邮件时,可以通过检查AttachmentCount属 性来确定该邮件携带了多少个附件,然后可以通过设置At— tachmentIndex属性依次处理每一个附件。 参考文献 1.清汉计算机工作室.Visual Basic 6.0网络开发实例. 机械工业出版社,2000 2.刘韬、骆娟.VisualBasic实效编程百例.人民邮电出版 社,2004 (收稿日期:2006年11月22日)