用VB收发电子邮件发送和接收电子邮件,对于某些执行特殊任务的应用程序而言,是一个十分有用的功能。
例如,一个监视网络服务器资源使用情况的工具软件,当它发现服务器的资源使用已经接近事先设定的临界状态时,便可以向系统管理员发送一封告警的电子邮件,从而使系统管理员能够及时地采取措施,以避免重大事故的出现。
在VB中,应用程序可以通过调用MAPI,实现收发电子邮件的功能。
编制具有收发电子邮件功能的VB程序,必须使用VB4.0以上的版本,因为只有4.0以上的Visual Basic才带有两个实现电子邮件收发功能的核心控件:MAPI会话控件和MAPI消息控件。
MAPI会话控件用于建立和控制一个Microsoft Mail会话,MAPI消息控件用于创建和收发邮件消息。
此外,程序必须运行在采用遵从MAPI的消息系统(如:Microsoft Exchang e、Microsoft Mail、Outlook等)的环境中。
在开始编程之前,首先需要将MAPI控件加入VB工具箱。
具体操作是:在VB菜单栏中选择Tools菜单项中的Custom Controls命令,调出"Custom Controls"对话框,在其中的"Av ailable Controls"列表框中选中"Microsoft MAPI Controls"表项,然后按"OK"命令按钮退出该对话框。
此后,工具箱中将新添两个如图1所示的图标,这就是MAPI会话控件和MAP I消息控件的图标。
@@1337300.JPG;图1 MAPI工具图标@@下面,笔者将以两个简单的VB程序为例,分别介绍发送邮件和接收邮件的程序编制方法。
一、邮件发送程序邮件发送程序的基本处理过程是:根据用户输入信息组成邮件,然后使用MAPI消息控件的Send方法将邮件发出。
编程步骤如下:1. 新建一个VB项目。
2. 将缺省窗体Form1的Caption属性设置为"发送邮件"。
3. 将MAPI控件加入VB工具框。
4. 在Form1中加入一个MAPI会话控件MAPISession1和一个MAPI消息控件MAPIMessag es1。
5. 在Form1中加入三个文本框控件,将它们的Name属性分别设置为txtSendTo、txtS ubject、txtMessage,并将txtMessage的Multiline属性设置为True。
这三个文本框控件将分别用于填写邮件的收件人、主题和内容。
6. 在Form1中加入三个标签控件,将它们的Caption属性分别设置为"收件人"、"主题"和"内容",并将它们放在合适的位置用以标注相应的文本框控件。
7. 在Form1中加入一个命令按钮控件,将其Caption属性和Name属性分别设置为"发送"和"cmdSend"。
8. 将下列代码加入Form1的Form_Load事件:Private Sub Form_Load()MAPISession1.SignOnEnd Sub9. 将下列代码加入Form1的Form_Unload事件:Private Sub Form_Unload(Cancel As Integer)MAPISession1.SignOffEnd Sub10. 将下列代码加入cmdSend的Click事件:Private Sub cmdSend_Click()With MAPIMessages1.MsgIndex = -1.RecipDisplayName = txtSendTo.Text.MsgSubject = txtSubject.Text.MsgNoteText = txtMessage.Text.SessionID = MAPISession1.SessionID.SendEnd WithMsgBox "邮件发送完毕!", ? "发送邮件"End Sub程序运行后如图2所示。
@@1337301.JPG;图2 发送邮件@@二、邮件接收程序邮件接收程序比邮件发送程序稍微复杂一些。
首先需要使用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消息控件MAPIMessag es1。
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 = TrueMAPIMessages1.FetchEnd Sub11. 编写一个窗体级子例程DisplayMessage:Public Sub DisplayMessage()lblMsgCount.Caption = "第 " & _LTrim(Str(MAPIMessages1.MsgIndex + 1)) & " 封邮件,总计 " & _ LTrim(Str(MAPIMessages1.MsgCount)) & " 封邮件" lblMsgDateReceived.Caption = MAPIMessages1. MsgDateReceivedxtMsgNoteText.Text = MAPIMessages1.MsgNoteTextlblMsgOrigDisplayName.Caption =MAPIMessages1.MsgOrigDisplayNamelblMsgSubject.Caption = MAPIMessages1.MsgSubjectEnd Sub12. 将下列代码加入Form1的Form_Load事件:Private Sub Form_Load()MAPISession1.SignOnMAPIMessages1.SessionID = MAPISession1.SessionIDFetchNewMailDisplayMessageEnd Sub13. 将下列代码加入cmdPrevious的Click事件:Private Sub cmdPrevious_Click()If MAPIMessages1.MsgIndex > 0 ThenMAPIMessages1.MsgIndex =MAPIMessages1.MsgIndex - 1DisplayMessageElseBeepEnd IfEnd Sub14. 将下列代码加入cmdNext的Click事件:Private Sub cmdNext_Click()If MAPIMessages1.MsgIndex <MAPIMessages1.MsgCount - 1 ThenMAPIMessages1.MsgIndex =MAPIMessages1.MsgIndex + 1DisplayMessageElseBeepEnd IfEnd Sub15. 将下列代码加入cmdClose的Click事件:Private Sub cmdClose_Click()Unload MeEnd Sub程序运行后如图3所示。
@@1337302.JPG;图3 接收邮件@@本例是读取用户收件箱中所有未读邮件,如果要读取收件箱中所有的邮件,那么只需在执行Fetch方法之前,将MAPI消息控件的FetchUnreadOnly属性设置为False。
三、邮件附件与处理邮件的方式一样,MAPI也为邮件的附件提供了一个计数器和一个索引。
在处理收到的邮件时,可以通过检查AttachmentCount属性来确定该邮件携带了多少个附件,然后可以通过设置AttachmentIndex属性依次处理每一个附件。
AttachmentIndex的合法取值范围为0至AttachmentIndex-1。
在设置了AttachmentIndex属性值后,可以读取附件的下列属性:AttachmentName:当附件是一个文件时,该属性用于指定文件的名称。
当附件是一个OLE对象时,该属性用于指定对象的类型。
AttachmentPath:该属性用于指定做为附件的文件的全路径名。
AttchmentPosition:该属性用于指定附件在邮件内容部分中的位置。
当邮件收发程序显示邮件内容时,将使用该属性提供的信息把附件的标志放在合适的位置。