VB:收发
发送和接收,对于某些执行特殊任务的应用程序而言,是一个十分有用的功能。例如,一个监视网络服务器资源使用情况的工具软件,如果它具有自动发送的功能,那么当它发现服务器的资源使用已经接近事先设定的临界状态时,便可以向系统管理员发送一封告警的,从而使系统管理员能够及时地采取措施,以避免重大事故的出现。在Visual Basic中,应用程序可以通过调用微软公司的MAPI(Messaging Application Programming Interface,消息应用程序编程接口),实现收发的功能。笔者将在本文中结合简单实例,向大家介绍在VB程序中实现收发功能的编程方法。
编制具有收发功能的VB程序,必须使用Visual Basic 4.0以上的版本,因为只有4.0以上的Visual Basic才带有两个实现收发功能的核心控件:MAPI会话控件和MAPI消息控件。MAPI会话控件用于建立和控制一个Microsoft Mail会话,MAPI消息控件用于创建和收发邮件消息。此外,程序必须运行在采用遵从MAPI的消息系统(如:Microsoft Exchange、Microsoft Mail、Outlook等)的环境中。
在开始编程之前,首先需要将MAPI控件加入VB工具箱。具体操作是:在VB菜单栏中选择Tools菜单项中的Custom Controls命令,调出"Custom Controls"对话框,在其中的"Available Controls"列表框中选中"Microsoft MAPI Controls"表项,然后按"OK"命令按钮退出该对话框。此后,工具箱中将新添两个图标,这就是MAPI会话控件和MAPI消息控件的图标。
下面,笔者将以两个简单的VB程序为例,分别介绍发送邮件和接收邮件的程序编制方法。
邮件发送程序
邮件发送程序的基本处理过程是:根据用户输入信息组成邮件,然后使用MAPI消息控件的Send方法将邮件发出。编程步骤如下:
1、新建一个VB项目。
2、将缺省窗体Form1的Caption属性设置为"发送邮件"。
3、将MAPI控件加入VB工具框。
4、在Form1中加入一个MAPI会话控件MAPISession1和一个MAPI消息控件MAPIMessages1。
5、在Form1中加入三个文本框控件,将它们的Name属性分别设置为txtSendTo、txtSubject、txtMessage,并将txtMessage的Multiline属性设置为True。这三个文本框控件将分别用于填写邮件的收件人、主题和内容。
6、在Form1中加入三个标签控件,将它们的Caption属性分别设置为"收件人"、"主题"和"内容",并将它们放在合适的位置用以标注相应的文本框控件。
7、在Form1中加入一个命令按钮控件,将其Caption属性和Name属性分别设置为"发送"和"cmdSend"。
8、将下列代码加入Form1的Form_Load事件:
Private Sub Form_Load()
MAPISession1.SignOn
End Sub
9、将下列代码加入Form1的Form_Unload事
件:
Private Sub Form_Unload(Cancel As Integer)
MAPISession1.SignOff
End Sub
10、将下列代码加入cmdSend的Click事件:
Private Sub cmdSend_Click()
With MAPIMessages1
.MsgIndex = -1
.RecipDisplayName = txtSendTo.Text
.MsgSubject = txtSubject.Text
.MsgNoteText = txtMessage.Text
.SessionID = MAPISession1.SessionID
.Send
End With
MsgBox "邮件发送完毕!", , "发送邮件"
End Sub
在填写完邮件的收件人、主题和内容后,按"发送"命令按钮,如果没有出现运行时错误提示,那么就表明邮件已经成功地发往目的地了,否则,请检查填写的收件人地址是否准确无误以及系统中运行的消息系统工作是否正常。
邮件接收程序
邮件接收程序比邮件发送程序稍微复杂一些。首先需要使用MAPI消息控件的Fetch方法读取邮件,这个过程将把用户收件箱中所有未读邮件全部装入MAPI消息控件中。然后,检查MAPI消息控件的MsgCount属性以确定通过Fetch方法读取的邮件的总数。接着,可以通过设置MAPI消息控件的MsgIndex属性来指定具体需要处理哪一封邮件。需要说明的是,MsgIndex属性值的计数是从0开始的,也就是说,第一封邮件的索引号是0,第二封邮件的索引号是1,依次类推。编程步骤如下:
1、新建一个VB项目。
2、将缺省窗体Form1的Caption属性设置为"接收邮件"。
3、将MAPI控件加入VB工具框。
4、在Form1中加入一个MAPI会话控件MAPISession1和一个MAPI消息控件MAPIMessages1。
5、在Form1中加入三个标签控件和一个文本框控件,将三个标签控件的Name属性分别设置为lblMsgDateReceived、lblMsgOrigDisplayName、lblMsgSubject,将文本框控件的Name属性设置为txtMsgNoteText,并将标签控件的Caption属性和文本框控件的Text属性的内容清空。这四个控件将分别用于显示邮件的日期、发件人、主题和内容。
6、将txtMsgNoteText控件的Locked属性和Multiline属性设置为True,ScrollBars属性设置为2 - Vertical。
7、在Form1中再加入四个标签控件用于标注上述四个控件,将它们的Caption属性分别设置为"日期"、"发件人"、"主题"、"内容"。
8、在Form1中加入一个标签控件,将其Name属性设置为lblMsgCount,Caption属性设置为"第 0 封邮件,总计 0 封邮件"。该控件用于显示接收的邮件总数以及当前正在处理第几封邮件。
9、在Form1中加入三个命令按钮控件,将它们的Name属性分别设置为cmdPrevious、cmdNext、cmdClose,Caption属性分别设置为"上一封"、"下一封"、"关闭"。
10、编写一个窗体级子例程FetchNewMail:
Public Sub FetchNewMail()
MAPIMessages1.FetchUnreadOnly = True
MAPIMessages1.Fetch
End Sub
11、编写一个窗体级子例程DisplayMessage:
Public Sub DisplayMessage()
lblMsgCount.Caption = "第 " & _
LTrim(Str(MAPIMessages1.MsgIndex + 1)) & " 封邮件,总
计 " & _
LTrim(Str(MAPIMessages1.MsgCount)) & " 封邮件"
lblMsgDateReceived.Caption = MAPIMessages1.MsgDateReceived
txtMsgNoteText.Text = MAPIMessages1.MsgNoteText
lblMsgOrigDisplayName.Caption = MAPIMessages1.MsgOrigDisplayName
lblMsgSubject.Caption = MAPIMessages1.MsgSubject
End Sub
12、将下列代码加入Form1的Form_Load事件:
Private Sub Form_Load()
MAPISession1.SignOn
MAPIMessages1.SessionID = MAPISession1.SessionID
FetchNewMail
DisplayMessage
End Sub
13、将下列代码加入cmdPrevious的Click事件:
Private Sub cmdPrevious_Click()
If MAPIMessages1.MsgIndex > 0 Then
MAPIMessages1.MsgIndex = MAPIMessages1.MsgIndex - 1
DisplayMessage
Else
Beep
End If
End Sub
14、将下列代码加入cmdNext的Click事件:
Private Sub cmdNext_Click()
If MAPIMessages1.MsgIndex < MAPIMessages1.MsgCount - 1 Then
MAPIMessages1.MsgIndex = MAPIMessages1.MsgIndex + 1
DisplayMessage
Else
Beep
End If
End Sub
15、将下列代码加入cmdClose的Click事件:
Private Sub cmdClose_Click()
Unload Me
End Sub
在窗体加载过程中,窗体Load事件中的代码会读取新邮件,如果有新邮件,就显示第一个新邮件。如果有多个新邮件,则可以使用"上一封"和"下一封"命令按钮前后翻阅。
接收邮件
本例是读取用户收件箱中所有未读邮件,如果要读取收件箱中所有的邮件,那么只需在执行Fetch方法之前,将MAPI消息控件的FetchUnreadOnly属性设置为False。具体接收的邮件是否已经读过,可以通过MsgRead属性来判别。如果邮件的正文或附件曾经被浏览过,那么该邮件就会自动标记为已读,不过只浏览邮件的主题不会标记该邮件已读。
邮件附件
与处理邮件的方式一样,MAPI也为邮件的附件提供了一个计数器和一个索引。在处理收到的邮件时,可以通过检查AttachmentCount属性来确定该邮件携带了多少个附件,然后可以通过设置AttachmentIndex属性依次处理每一个附件。
AttachmentIndex的合法取值范围为0至AttachmentIndex-1。在设置了AttachmentIndex属性值后,可以读取附件的下列属性:
AttachmentName:当附件是一个文件时,该属性用于指定文件的名称。当附件是一个OLE对象时,该属性用于指定对象的类型。
AttachmentPath:该属性用于指定做为附件的文件的全路径名。
AttchmentPosition:该属性用于指定附件在邮件内容部分中的位置。当邮件收发程序显示邮件内容时,将使用该属性提供的信息把附件的标志放在合适的位置。
AttachmentType:该属性用于指定附件的类型,其合法取值为三个整数型数值,在VB中分别由下列常量表示:
·mapData-附件是一个数据文件
·mapEOLE-附件是一个嵌入式OLE对象
·mapSOLE-附件是一个静态OLE对象
发送邮件时,上述属性的使用方法与接收邮件时相同,只不过由读操作改为写操作
了。值得一提的是AttachmentIndex属性,发送邮件时可以将其设置为任意值。而AttachmentCount属性则会自动设置为正确的值,无需人为设置。
小结
通过分析上述两个程序的代码,可以归纳出具有收发功能的VB程序的基本流程如下:
1、使用MAPI会话控件建立一个邮件会话。
2、使用MAPI消息控件进行邮件的处理工作。
3、再次使用MAPI会话控件释放邮件会话。
由于上述两个VB程序只是简单的示例,因而略去了一些与本文主题关系不大的细节,如错误处理等。在编制实用程序时,为了保证程序的可靠性,应该考虑加入这些细节部分。
MAPISession 控件
消息应用程序接口 (MAPI) 控件可以创建具有邮件功能的 Visual Basic MAPI 应用程序。有 2 个 MAPI 控件:
MAPISession
MAPIMessages
MAPISession 控件登录并且建立一个 MAPI 会话。它也用于结束一个 MAPI 会话并退出。MAPIMessages 控件使用户可以可以执行多种消息系统功能。
语法
MAPISession
说明
登录成功后,SessionID 属性包含访问 MAPI 会话的句柄。当使用 MAPIMessages 控件时,会话句柄必须传给 MAPIMessages 控件,否则将引发错误。
MAPISession 控件在运行时是不可见的。而且,该控件不产生事件。为使用它,必须指定适当的属性和方法。
为使这些控件正常工作。必须有 MAPI 服务。MAPI 提供的 MAPI 服务是符合系统规范的。
注意 如果试图运行一个使用 MAPI 控件的程序,必须先保证已正确安装了 32 位 MAPI DDLs,否则将不能完成象SignOn这样简单的 MAPI 功能。例如,为了正确使用 MAPI 功能或者来自 visual basic 的 MAPI 自定义控件,在 Windows 95 上必须在操作系统的安装过程中安装 Exchange,或者从控制面板上单独地安装 MAIL。
使用 MAPI 控件
消息处理应用程序接口 (MAPI) 控件,可用于创建具有功能的 Visual Basic 应用程序。MAPI 是一系列的核心系统部件,它们可将任何用于或工作组的应用程序,和适应 MAPI 的消息服务天衣无缝地连接起来。例如,通过使用 MAPI 驱动程序,Microsoft Exchange 消息系统可被连接到绝大多数私用或公用系统中。
在 Visual Basic 中,MAPI 控件可用于与基本的消息子系统进行交互。要使用这些控件,则必须先安装适应 MAPI 的系统,比如 Microsoft Exchange。基本的消息服务已由工作组环境提供了,比如说,在 Windows 95 或 Windows NT 环境下运行的 Microsoft Exchange 服务器。
使用 MAPI 控件包括两个步骤:建立 MAPI 会话,然后使用各种属性和方法访问和管理个人的收件箱。比如,创建并发送消息、加上附加文件、验证系统地址簿中的收件人地
址,等等。
MAPISession 控件登录并建立 MAPI 会话。它也可用于退出 MAPI 会话。MAPIMessages 控件包含了完成上面所说的消息系统功能所需的所有属性和方法。
MAPI 控件在运行时是不可见的。另外,这些控件不具有任何事件。只有通过设置适当的属性,或指定适当的方法来使用它们。
注意 如果要运行使用了 MAPI 控件的程序,则需要保证已经正确安装了 32 位的 MAPI DLL,否则就不能完成象 SignOn 之类的 MAPI 功能。例如,为了正确使用 MAPI 功能,在 Windows 95 中,安装系统时必须同时安装 Exchange,或者在“控制面板”中单独安装。
用途
在应用程序中加入消息系统功能。
创建功能完备的应用程序。
使用 MAPISession 控件
MAPISession 控件用于登录和退出一个 MAPI 会话。假如已存在 MAPI 服务,那么用 MAPISession 控件进行登录只是提供注册用户的姓名和密码。MAPISession 控件将确定操作系统中的设置,并调用基本的消息子系统(服务器)。
MAPISession 控件
设置 MAPISession 的属性
在设计时可用 MAPISession 的“属性页”设置 MAPISession 的属性。用鼠标右键单击 MAPISession 控件,并单击“属性”以显示“属性页”对话框。
在设计时设置 MAPISession 的属性
UserName 和 Password 属性被用来向基本的消息系统提供合法的登录信息。可以在设计时设置这些属性,也可以在运行时向用户提示输入这些属性。在需要向用户提供基本的系统的登录对话框时,请将 LoginUI 属性设置为 True。如果不存在这样的对话框,则忽略该属性。可以创建自定义的对话框提示用户输入这些信息。
NewSession 属性指定是否需要建立新的会话。如果已经建立了合法的会话,通过设置 NewSession 属性可使两个会话并发运行。
DownloadMail 属性指定在当前会话开始时,是否自动下载该用户的。将该值设置为 True,将把该用户的所有下载到其收件箱。根据系统的速度和接收的数量,该操作有可能是很耗时的操作。通过将该属性设置为 False,用户可以选择是否等到以后再下载,或者设置自动下载的时间间隔。
SignOn 和 SignOff 方法
设置了 UserName 和 Password 属性后,就可以在运行时使用 SignOn 方法启动 MAPI 会话了。
例如:
mpsSession.SignOn
简单的vb程序代码会话建立后,该会话的句柄被保存在 SessionID 属性中。根据 NewSession 属性的值,该会话句柄可能指向新创建的会话,也可能指向已经存在的会话。
要终止会话,请使用 SignOff 方法。
注意 Action 属性也可用于登录和退出 MAPI 会话。然而,建议使用 SignOn 和 SignOff 方