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

使用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程序只是简单的示例,因而略去了一些与本文主题关系不大的细节,
如错误处理等。在编制实用程序时,为了保证程序的可靠性,应该考虑加入这些细
节部分。


将阿拉伯数字转成中文字的程式 -VB资料 将包含有Null结尾的字符串转换为VB字符串 切分字符串-VB资料 清除字符串中指定的字符 -VB资料 VB如何取得计算机的所有字型? VB如何取得中英混合字符串的长度? 使VB的网格控件具有输入功能 VB如何使用未安装的字体? VB如何由两个ASC码(区位码)复原成一个汉字? VB如何转换C代码中的高字和低字 一些字符串操作的问题和回答 -VB资料 VB怎样把VC++代码转换成VB代码 字符串中包含双引号-VB资料 字符串中文的问题 -VB资料 巧用CLIPBOARD建立图像数据库-VB资料 在VB中存取数据库中的图片 Access97的报表解决方案-VB资料 Access下如何使用通用对话框-VB资料 ADO简介 -VB资料 ADO三大对象的属性、方法、事件及常数(二)-VB资料 ADO三大对象的属性、方法、事件及常数(三)-VB资料 ADO三大对象的属性、方法、事件及常数(一)-VB资料 Data 控件使用有密码的 Access 数据库 -VB资料 Excel、Access、VB的结合应用 Microsoft SQL Server 7.0安装问题(二)-VB资料 主题: MDB文件的导出 使用 DAO-VB资料 Microsoft Access秘密、技巧和陷阱-VB资料 SQL的基本操作(1.数据类型) -VB资料 SQL的基本操作(2.数据库的相关操作)-VB资料 SQL的基本操作(3.表的相关操作) -VB资料 SQL的基本操作(4.数据的检索)-VB资料 MYSQL权限与mysql库里的所有表问题~!~!请指教! Installshield中怎样调用MSI文件,并能执行MSI文件 售书 鼠标指针的问题(菜鸟问) 向CList模板类的对象追加节点时出现异常,谁惹的祸??? 为什么我的VB运行时会清空剪贴板? 大侠求救!我的考试题!20分的!急急急急急急急急! 目前asp中使用的主要加密算法有哪些? 怎样设置tab! 关于vb的问题,谢谢大家了。 计算机操作者的食谱(想想大家每天都对着电脑,看看这个食谱吧,或许有好处,人还是要学会爱护自己) 如何将png文件格式转换成bmp文件格式,小弟急需这方面的资料,尤其是关于压缩方面的 关于在存储过程中调用链接服务器权限的问题 用vb打包程序打包后安装出错,运行不了? 我要独自去广州发展,请大家看看我的情况,给我一些帮助,如何在广州找工作? 求助!请问谁有源代码?(画一个线段、图形区域填充、图形区域截剪) 物价飞涨,福建省软考提价!!! 在数据表里,我保存了图片存放的路径,现在我想让他显示出来,怎么做啊?有几个方法啊,请指点 阿沐进来看看,你要的东西 VC++ ADO用SELECT FOR UPDATE锁定Oracle数据库的记录,为什么无效? 关于CGI连接关系数据库? 关于动态链接库一问,释放时的异常 阿沐进来看看2 怎样才能不添加OCX和DLL做出反色效果? 好奇怪的问题,大家帮忙来分析一下 阿沐进来看看3 !!再次求解,关于ADO!! 高分求解!高手请进!疑难杂诊? 在LINUX下,如何修改屏幕分辨率 请教如何将图片插入到sqlserver 7/2000里? 急急急!UDP的问题 有关ISA SERVER 昨晚做了个大梦,哈哈!! 疑问 JINI究竟是什么东东呀?去SUN看了半天也没能明白,谁能解释一下? vb.net的一个问题!!是关于在form1上写字的东西! 关于如何输入的问题*******vb高手请进***************(在线等候,我只有这么多分了) 简单的问题,textbox取不到值。 关于DIALOG对话框的继承问题 。 Response->SetCookieField()可以将用户登陆信息保存在cookie内,可是... 为什么我用AddString()无法为Combo Box添加上新项? 请问程序员中有多少是喜欢打《帝国时代》的,我是一个,请报名,谈谈感受。 文件读写:前一部分是文肩头,含几个概括性数据;后一部分是数量不定的大量整形数据。该怎么办?我想用块读写的方式,不知可否?解决了保 请版本进来帮忙解决一下!!! 我的机子怎么拉? find a bbs(asp and xml) 学好c 请版主进来帮忙解释一下!!! asp.net中怎样才能把图片存贮在Sql server 的Images字段中? 请问在Delphi中如何防止(或提示)用户输入在文本框中的不能为字母?????? 急:exe调用DLL里面方法,运行exe,从dll方法里面出错,弹出“内存不能read”对话框 先导式 溢流阀的作用有哪些? 屋檐每隔一段时间滴下一滴水,每当5滴正欲滴下时,第1滴刚好落到地面,而第3滴与第2滴分别位于高1米的窗子上、下沿,(g=10m/s²)问1.此屋檐离地面多高?2.滴水时间间隔是多少?3.雨滴落地前最 吃菠菜要注意什么?做菠菜前 先去草酸 先导型溢流阀中的先导作用是什么? 物理中,物体的振幅越大,产生声音的响度越大.振幅是什么? 煮菠菜汤时怎样去除菠菜的草酸 当渔夫看到已经在帐子里睡熟的两个孩子时,他会对桑娜说什么呢? 地球的形状和内部结构问题1.2. 把我网走吧 一个渔夫去打鱼,一条鱼游过来对渔夫说"快把我网走吧"!看了怎样写? 配套练习册第一单元测试的的阅读鉴赏的5 6 7小题,(二)只管向前奔跑的答案?谁有呀 常温下,碘和镁化合时速率很慢,若滴入几滴水,则反应剧烈,且形成一股美丽的紫色烟雾,此时水的作用是( )A.反 根据碘与氢气反应的热化学方程式(i) I2(g)+H2(g) \2HI(g)+9.48kJ (ii) I2(S)+H2(g)2HI(g)-26.48kJ下列判断正确的是(  )A.254gI2(g)中通入2gH2(g),反应放热9.48kJB.1mol固态碘与 从桑娜和渔夫的语言和神态中,你能体会到什么? 碘与镁化合,反应方程式是什么?形成的一股美丽的紫色烟雾,是什么? 【标题】怎样处理菠菜中的草酸 屋檐定时滴水,当第5滴正欲滴下时.第一滴已经刚好到达地面,而第三滴与第二滴正好位于高为1米的窗户的上,下沿,问(1)屋檐离开地面多高?(2)滴水的时间间隔是多少?(g=10m/s^2)三种方法做 常温下,当碘与镁反应时,加水后形成的一股美丽的紫色烟雾是什么?常温下,当碘与镁化合产生碘化镁,若滴几滴水则剧烈反应生成一股美丽的紫色烟雾,那么在这个反应中的水是紫色烟雾是什么? 往锌粉和碘粉的混合物中加水,为什么反应速率会加快?它们的反应是怎样的?若大的世界,求真相! 文中描写环境和人物对话心理描写的语句,从描写中可以看出桑娜和渔夫是个怎样的人? 碘与镁反应,为什么会形成的一股美丽的紫色烟雾? 小学四年级语文园地七作文(成长中的一件事)怎写不要写别人写过八百遍的,选材要新颖.能得一类文的.分数25以上就行,500字. 小孩不小心吃温度计水银怎么办 碘和镁反应,加水后看到的紫色烟雾是什么镁和水反应吗? 四年级下语文园地七作文! 摩尔质量与相对原子质量的分别是什么?还有,气体摩尔体积与气体体积有什么分别? 吃菠菜有草酸好吗? 炖猪骨头汤都放什么调料味道比较好?怎么操作?20 分呦. 早上不小心在孩子床前把水银温度计摔碎,孩子56天,该怎么办? 配制碘液时为什么要加入碘化钾? 如何炖猪骨头汤更好喝 摩尔质量,气体摩尔体积,有那些结论 咏柳赞美了春天还是柳树?急……………………………………………………………………………………………… 怎么炖牛骨头汤 下列有关气体摩尔体积的描述中正确的是:A.1摩尔气体的就是该气体的摩尔体积B.通常状况下的气体摩尔体积约为22.4L C.标准状况下的气体摩尔体积约为22.4升每摩尔 D.单位物质的量的气体所占 咏柳 把对柳树的赞美引向对____和_____的赞美我知道是对春天的赞美,但是是什么和春天的赞美.有哪位知道的. 四年级上册语文园地七作文怎样写 鸡蛋与地球的内部结构的特点地球的内部结构有点像煮熟的鸡蛋,请你根据煮熟鸡蛋的内部结构特点来描述地球内部的结构特点.请详细的说. 《咏柳》通过赞美柳树表达了诗人_______________________ ( )天气怎样,明天的活动照常进行 填上关联词 屋檐每隔一定时间滴下1滴水,当第5滴水正滴下时,第1滴刚好落到地面,而第三滴和第二滴分别位于1m的窗子的上、下沿,(g取10米每二次方秒)(1)这屋檐离地面多高?(2)滴水的时间间隔是多 温度计里面的水银进了宝宝的眼睛有没有事阿 ( )天气恶劣,同学们( )是按时上学.请填上关联词! 屋檐上每隔相同的时间间隔滴下一滴水,当第5滴正欲滴下时,第1滴已刚好到达地面.从第1滴离开地面开始计时,到第N滴水到达地面共用时间为T,则相邻两滴水到达地面的时间间隔为? 温度计水银进入了眼睛里温度计不小心打破,而且弄到宝宝眼睛里去了,去医院医生说想办法弄哭宝宝,让他自己的眼泪把水银流出来,半天都没有流出来,后来还是护士用棉签弄出来了,眼睛里是 平常人用的水银温度计能给狗狗用么? 屋檐上每隔相同的时间间隔滴下一滴水,当第五滴水正欲滴下时,第一滴水刚好到达地面,而第三滴水与第二滴水分别位于高为一米的窗户的上下沿.(g取10米每二次方秒).(1)滴水的时间间隔是多少 屋檐每隔一滴时间地下一滴水,当第5滴水正欲滴下时,第1滴水正好落地,这时第4滴和第5滴相隔1m,屋檐高? 水银温度计打碎了怎么办,对宠物狗有危害吗 菠菜里有草酸能直接炒着吃吗 55g硝酸铅和碘化钾反应生成34g硝酸钾和多少g碘化铅? 一长一短两根蜡烛点燃,用一个玻璃杯同时罩住.问哪根蜡烛先熄灭,为什么 那些蔬菜含草酸多?比如菠菜 碘化溴和碘化钾反应最好标出电子转移和数目 猪骨头汤里放什么好?我已烧了一锅猪骨汤,里面还放了几片家乡咸肉.接下来烧什么好? 两只燃着的蜡烛罩上玻璃杯一会都熄灭了原因是? 骨头汤要什么做呢 骨头汤的营养价值有哪些呢! 写迈克尔杰克逊的作文(五年级下册语文园地七的习作)不少于350字 雨过天晴,水滴从屋檐一一滴落,当水滴通过一个1m高的窗子时雨过天晴,水滴从屋檐一一滴落,当水滴通过一个1m高的窗子时用0.2s求屋檐到窗台(窗子下沿)的距离.(取g=10m/s2) 煮沸菠菜为什么可以除草酸吗? 热化学方程式怎么自发反应 △H与△S之间有什么关系 还有△S怎么判断
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘