说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

使用VB收发电子邮件

HTML文档下载 WORD文档下载 PDF文档下载
使用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
程序运行后如图3所示。在填写完邮件的收件人、主题和内容后,按"发送"命令按钮,如果没有出现运行时错误提示,那么就表明邮件已经成功地发往目的地了,否则,请检查填写的收件人地址是否准确无误以及系统中运行的消息系统工作是否正常。

邮件接收程序

邮件接收程序比邮件发送程序稍微复杂一些。首先需要使用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
程序运行后如图4所示。在窗体加载过程中,窗体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程序只是简单的示例,因而略去了一些与本文主题关系不大的细节,
如错误处理等。在编制实用程序时,为了保证程序的可靠性,应该考虑加入这些细
节部分。


TXT文件的读取-VB资料 VB 如何将dbgrid印出来 VB5.0调用Office97技巧 VB5如何把帮助文件加到设计的程序内? VB编程步步高-打印篇(二) VB编程的好帮手资源文件 VB的OPEN对话框控件图示功能扩充 VB通用数据表格输出程序的设计 VB网格中输入数据 VB应用程序中打印条形码的两种方法 VB与Windows资源管理器互拷文件 VB中DOS文件名与长文件名的转换 VB中的Unicode 和 Ansi 格式 VB中如何实现文本查找功能 VB中自制文件搜索器 Windows 初始化文件的修改 -VB资料 Word 97与WPS97的完美结合 -VB资料 比较两个文件-VB资料 采用递归算法删除带有多级子目录的目录-VB资料 菜单项的动态装入 -VB资料 处理加了密码的MDB文件-VB资料 VB创建临时文件 从公共对话框控件中提取多个文件名称 -VB资料 从全路径名中提取文件名 -VB资料 打印MsChart之类的控件 -VB资料 谈谈在VB6.0中如何使用资源文件进行编程 动画图像分解在VB动画设计中的应用 多重文档界面设计方法-VB资料 恢复回收站中的文件 -VB资料 VB获得位图文件的信息 VB获得文本框中光标所在行的内容 正式到新公司上班,送300分,感谢在我最困难的时候在“软件工程”版给过我帮助的朋友们!! 请问斑竹及所有人,怎样得到QuickReport的总页数? Websphere3.5的一个BUG.希望有人反对.多谢.. 什么是DAMAP的对象 哪里有 winpcap 或 libnet 及其他网络编程辅助包下载? 谁能提供PSP文档?最好是Humphrey的那本书! 代码出现bebug.请大家帮我找!!!! TO:net_lover(孟子E章),详情请入内! 有谁用过DEV express系列的dxdbgrid??它是如何把一个文本文件txt读到dxdbgrid1.columns[i]的picklist中去,作为picklist的内容的啊? 我想在Linux下做数据库开发,用什么数据好? 我的pws可能出了问题,那位高手能解决一下 关于控制winamp 各位同行你们有这个的源程序吗(Cacio DT-900数据采集器) Html Help 制作方法 luodi(无知者无畏), 请进: 我用shell(app.path+"\mdac.exe"),来调用微软数据访问控件2.0,提示出错:命令行语法错误, 求救:如何将剪贴板中的内容放到image控件上 how to get the sytax of customer user object ? jsp中的打印问题 pb中有没有类似iif之类的语句 大虾们,怎样将String 类型转换成float 请问在及时战略中,怎么实现寻路的 我想在状态栏显示时间,有没有属性可以让时间自动变化,而不用其它辅助控件? 不会没人愿意回答这个问题吧,都贴第二次了!! 吃西瓜 我在注冊自創構件時總是出錯,請各位幫忙解決. 关于ado连接sybase的问题,紧急求救!!!(我的最高分了) 29分:flexcell定位 请教一下,关于Delphi COM类型库的问题 大家来谈谈申奥成功对我们的影响吧,我想知道怎么利用这个契机大赚一笔 各位谁喜欢“后街男孩”??喜欢的给分! 请问在DBGRID中改变当前选定行的颜色? 我想在DataSourceDataChange()中实现。 客户端怎么与服务器端通信 为什么我在窗口里修改了一个记录的图片字段后,在数据窗口内不能正常显示? 我要在RedLinux71下安装WEB服务器软件,请部如何做? 如何计算某年某月的天数和每天对应的星期 help!!! 为什么我的D6在编译时出现错误:“Fatal Error QuickRpt.pas(23):File not found:'Dsgnintf.dcu' 帝国时代之农民搞笑版……哈哈 如何用DEBUG的命令取消cmos密码!!!急急急! 请教一个Redhat安装的问题 该死的创新virba128…… 急!!!给tripofdream(梦之旅)和能解决全文检索的高手! 有台WIN95机器启动是时出错缺文件mtrr.vxd,udf.vxd谁能帮我! 对于BMP图象的旋转(90、180)的处理。用BitBlt()能否实现。 《Windows网络编程技术》例子中的一个问题。 急!各位帮忙!!!!!!!!!!! 这个java程序有什么问题吗? 那能下载win2000profesional? oracle sql语句高手请进,为什么这句话无法执行,好像上了锁,来解一下吧! 有谁真正的用ado结合oracle做开发。 一个clientsocket的问题!当serversocket没有启动时,clientsocket总是有个弹出提示,如何不显示这个提示? 如图:一个圆柱体被截去5厘米后,圆柱的表面积减少了31.4平方厘米,求原来圆柱的表面积是一个圆柱体被截去5厘米后,圆柱的表面积减少了31.4平方厘米,求原来圆柱的表面积是多少?图没标圆柱 圆锥体的表面积公式 一个圆柱体的侧面积是50.24平方厘米,高和底面半径相等,这个圆柱体的表面积是多少平方厘米?算式和结果, 一个圆柱体,如果把它的高截短了3厘米,表面积就减少了94.2立方CM,体积就减少了多少立方厘米 圆锥体的表面积的公式是什么? 一个圆柱体的侧面积是100.48平方厘米,高和底面半径相等,这个圆柱体的表面积是多少? 一个圆柱的高是10cm,若高减少4cm,则表面积减少125.6平方cm,求圆柱体的体积? 圆柱体的体积 容积公式一个圆柱体 长585毫米 直径是35毫米 求体积 容积 另一个是长度560毫米 直径23毫米 求体 容积 最好有公式 体积与容积是一个意思吗? 一个圆柱体,如果高增加1cm,表面积就增加50.24平方厘米.这个圆柱的底面积是多少?我是说表面积不是侧面积 从一个圆柱上截下一个高10cm小圆柱体.表面积比原来减少了188.1平方cm截下的圆柱的体积是多少 圆锥,圆柱体表面积体积公式 一个圆柱体的高减少2厘米,表面积就减少50.24平方厘米.圆柱体底面面积是多少? 一个底面直径是8cm,高是16cm圆柱体从中间劈开后得到的图形,这个图形的表面积是多少? 在推导圆柱体公式过程中,拼出的长方体表面积比圆柱大20平厘米,圆柱体侧面积是多少? 一个圆柱体,如果它的高增加2厘米,它的表面积就增加50.24平方厘米,这个圆柱体的底面半径是多少? 一个底面直径是8cm,高是16cm的圆柱,如果它的高增加了10cm,它的表面积是多少? 球的表面积公式推导过程个位同志,球的表面积公式到底是如何推出的,为何我推了几次都是 S=π平方*R平方,原理是先割成1个半球,再把这个半球割成无数个小三角形,小三角形的底之和即为圆周 一个圆柱的高增加4厘米表面积增加50.24平方厘米,求圆柱体的底面积 一个底面直径是8cm,高是16cm圆柱体从中间劈开后得到的图形,这个图形的表面积是多少?,说清每步 圆柱形表面积的公式是什么? 一个圆柱体的高是5厘米,若高增加3厘米,圆柱的表面积就增加37.68,原来圆锥体的体积是多少立方厘米 把长2米的圆柱体木料锯成两段,表面积增加了6平方米,原来这个圆柱体的体积是() 把一个底面周长为31.4分米的圆柱体的高减少三分之一,表面积就减少了125.6平方分米,原来圆柱体的体积是多少立方分米 把高10厘米的圆柱沿底面直径切开,拼成一个近似的长方体,表面积就增加了60平方厘米,圆柱体的体积的多少 把一个高8分米的圆柱体割拼成一个与圆柱体等底等高的近似长方体后,表面积增加了24平方分米,把一个高8分米的圆柱体割拼成一个与圆柱体等底等高的近似长方体以后,表面积增加了24平方分 一个圆柱体,底面周长6.28分米,将他平均切成4块,求每块的体积和表面积 圆柱体底面直径4厘米,分成若干份拼成一个长方体,长方体表面积比圆柱体表面积增加40厘米,求长方体体积 把一个高8分米的圆柱体割拼成一个与圆柱体等底的近似长方体后,表面积增加24平方分把整个过程写下来 一个圆柱体高8厘米,底面周长25.12厘米.现在沿着它的直径垂直切开,表面积增加了【 】 将一个直径10CM的圆柱体沿直径平均切成若干份,拼成一个长方体,表面积增加了20平方厘米圆柱体的体积是多 把1张周长是80的圆柱体木柴锯成三段相等的圆柱,表面积增加了48平方厘米,原来的圆柱体木柴的体积是 把一个高8分米的圆柱体割拼成一个与圆柱体等底的近似长方体后,表面积增加24平方分米,原来圆柱体体积是多少 一个圆柱体底面周长28.26厘米,高10厘米,求表面积、体积 一个高5厘米的圆柱体,沿底面直径将圆柱体锯成两块,其表面积增加40平方厘米,原来这个圆柱的体积? 把一个高8dm的圆柱体,割拼成一个等底的近似长方体,表面积增加了24平方分米,圆柱体体积是多少? 一个底面周长和高相等的圆柱体如果高降低1厘米他的表面积就要减少6.28平方厘米这个圆柱体的体积是多少?我意思不懂 一个高为5厘米的圆柱,沿底面直径将圆柱锯成两块,其表面积增加了40平方厘米,原来这个圆柱的体积是() 圆柱体表面积公式是什么? 一个圆柱体底面周长和高相等,如果高缩短了2厘米,表面积就减少6.28平方厘米,求这个圆的体积. 一个圆柱体的体积是125.6立方厘米,底面直径是4厘米,它的侧面积是多少平方厘米?2.把一个棱长是6分米的正方体木块,削成一个最大的圆柱体,这个圆柱体的体积是多少立方分米? 求所有计算公式!和所有简算,还有求长方体正方体圆柱体圆锥体的表面积公式的体积公式!(包括字母公式)圆锥不求表面积.计算公式如:axb=bxa 一个底面周长和高相等的圆柱体,如果高降低1厘米,它的表面积就要减少6.28平方厘米,这个圆柱体的体积是多 一个圆柱体,高10厘米,如果高增加2厘米,它的表面积就增加12.56平方厘米,求这个圆柱的侧面积 圆柱体体积公式(字母)急.55555555 一个圆柱体的底面周长和高相等,如果高缩短3厘米,则表面积比原来减少94.2平方厘米,求原来圆柱体的体积?现在回答 一个圆柱体侧面积是62.8平方厘米,地面积是12.56平方厘米,它的表面积是多少平方厘米? 求圆柱体和圆锥体体积的公式 一个圆柱体底面周长和高相等.如果高缩短了2厘米,表面积就减少6.28平方厘米.求这 一个圆柱体,他的直径是10cm,高是10cm,它的表面积是多少? 圆柱体,圆锥体的表面积和容积公式分别是什么?请大家讲清楚点,还有我想知道这个公式几年级教的啊?答案能清晰点不,譬如圆柱体1 表面积2 容积(体积)圆锥体1 表面积2 容积(体积) 在一个地面直径为4分米的圆柱体上截去一个高2分米的小圆柱体,原来圆柱体的表面积减少( )平方米 底面直径是4cm,高是10cm的圆柱体,表面积、侧面积和表面积分别怎么算? 圆锥体 体积 表面积 面积公式 圆柱体 体积 表面积 面积公式看好了 6个公式 从一个高1米,底面直径为4分米的圆柱体上,截下一个高2分米的小圆柱体,原来圆柱体的表面积减少了多少平方分 若上面圆柱表面积展开图中侧面的长是25.12cm,宽是10cm.本这个圆柱的表面积. 圆锥体表面积公式用字母表示(并把每个字母代表什么讲一下)谢~ 一个圆柱体的底面直径和高都为10分米,这个圆柱体的表面积是多少平方分米? 一个高为10cm的圆柱,如果他的高增加2cm,那么它的表面积就增加125.6平方厘米,求原来圆柱的表面积. 圆锥体的表面积的计算公式? 一个圆柱体的侧面积是50.24CM2,高恰好与底面半径相等,这个圆柱体的表面积是多少?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn