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

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


Babylon.js:拥有微软背景的开源3D游戏引擎 EMC 2014存储布局及十大新技术要点 腾讯推出零流量地图 离线实现公交步行导航 Atmel 1.4亿美元收购Newport Media 巩固物联网产品线 微信大会首批议程出炉 深度解析招行服务号是如何炼成的? 指尖上的阅读:MIT开发盲人专用设备FingerReader 从桌面到移动:异构计算翻天覆地的技术变革 《近匠》Blueware何晓阳,不做中国的New Relic 全球最杰出的14位程序员 Microsoft、RedHat、IBM、Docker等公司加入Kubernetes社区 Intel携手三星、博通等 建立物联网联盟OIC 一周消息树:微软半年内将终止对Win 7、Office 2010 SP1等产品的支持 深度神经网络DNN的多GPU数据并行框架 及其在语音识别的应用 浪潮通软GSP将打造开放平台 吸引更多ISV加入生态系统 国外安全产品再遭信任危机 安全产品国产化步伐加快 最终幻想XIV的重生--SQUARE ENIX《最终幻想14》制作人吉田直树介绍 如何打造百万级自然增长的微信HTML5应用 听邵海杨聊聊1000+台服务器背后的故事 借助Facebook、Twitter等社交平台API打造超炫酷的那些应用 Unity中Shader的开发运用实战详解,开放报名! 我从独立游戏开发学到的6件事儿 果断Mark!Searchcode——源代码搜索利器 《近匠》图灵机器人:App和移动硬件的智慧大脑 极路由发布HiWiFi OS及应用开放平台 Loom SDK框架:命令行快速开发跨平台2D游戏 安全管家Q2移动安全数据报告:窃取隐私最多 Project Adam vs. Artificial Brain,微软与谷歌角力人工智能 “微信公众平台优秀开发商”征集评选活动正式启动 移动数据库新疆界:开源、Swift、可穿戴... Chromebook侵蚀微软商用PC市场,成绩喜人 2014微信开发者大会议程公布 8月1日前购票8折优惠并赠书 ###Profiles使Powerbuilder与后台数据库联系起来。根据数据访问的不同,Profiles应用的接口又分为那两类?### EVC中的CFileDialog怎么不能选择文件啊? 备份数据日志时出现下面提示.请高手指教 对《程序员》的建议,大家都来说说!!! 100分!!!!!在Win32中用那个函数可以打开指定的字符文件,如指定code.out,怎样打开????? 安装VS.NET失败,不想重装系统,怎么回事? 如何退定CSDN的邮件? 救命啊!小弟遇到一个非常奇怪的问题 请问,delphi6的中文版有吗? 请问目前比较流行的数据库对中文表及中文段的支持情况 薪水问题求教 VB调用动态链接库的问题,HELP! 高分求教,MyODBC!!!!!!!!!!!!!!!!!! vc++ 写了一个vb控件,如何让客户端打包下载 关于如何在linux下运行xml的程序的问题 急!请问那为大虾知道wast这个软件啊? 求救:用VC怎么调试程序(怎样设断点) 各位高手:>>>送分问题.....谢谢!! 关于安装程序.... 在Form上放一个Memo,响应Form的onMouseMove时,为什么在Memo上移动鼠标,事件中的传递的参数Sender总是Form而不是Memo? tc++中怎样使用bitmap 送分了!! bcb报表中只有richedit可以自动折行,如何解决? 如何把asccii字符串转化为unicode形式的字符串??? 高手请帮帮我吧 打印RichTextBox 的内容时,如何设置页边距? 可变参数的函数 想找个老师帮我提高 要做一个dll需要在不同的平台调用该如何声明? 硬盘分区表是哪个文件? 我准备写篇有关软件企业的管理的文章,谁愿提供建议和材料,谢谢! 急!如何在VB中控制扫描仪,并按要求取得图象? 高手请指点 [给分]请global_boy(准备蒸发)进来领分!帮助解决Win2000启动选项的配置..原贴:http://www.csdn.net/expert/topic/592/592163.xml?temp= 请教高手!如何通过文件名获得其图标 MCSE?! 数据连接错误? 如何让datagrid绑定数据 ISAPI程序里输出的网页无法显示,大家救命! 请问如何在Jb6中使用中文字体,比如说宋体 HTTP 和 FTP 一个黑客问题? SQL 急的!谢谢大家帮忙!关于interbase与c++builder5的连接。 请教高手! 哪里有免费下载<thinking in c++>等图书的? 那位大侠懂在 VC 中用汇编??? 有会命名管道操作的高手吗 请教高手! 异步传送的问题? 小明每分钟走70米,小东每分钟跑90米,小明走10分钟后,小东才去追他,小东几分钟追上他 作文:痛并快乐着(450字) 以什么的味道作文700字 能追得上小明吗?A,B两地相距90千米,甲从A地骑自行车去B地,1小时后乙骑摩托车也从A到去B地,已知甲每小时行12千米,乙每小时行30千米 问1:乙出发后多少时间追上甲?2:若乙到达B地后立即返回, 痛并快乐着 帮我写初一英语作文60字OK大神们帮帮忙网友想知道你的日常生活,现在根据以下提示,给网友发个邮件,告诉她你的情况 要点提示:1.在深圳阳光中学上学 2.6:30分起床 3.8:30-11:30上课 4.下午4 小明要测量自己100米跑的平均速度小明要测量自己100m跑的平均速度和其中后60m跑的平均速度,他请来三位同学,按以下步骤进行了测量.a、选出二个同学做计时员,分别站在距起点_________m和____ 以《痛并快乐着》为题的作文.急白岩松的《痛并快乐着》、郭敬明的《梦里花落知多少》1、任选其一做题目,写一篇不少于600字的文章.2、可以记叙经历,抒发感情,发表见解等.3、除诗歌、戏 作文____的滋味 600~700字 小明从A地处发言公路朝一个方向慢跑,速度2米/秒,过了一会,一只小狗从A地出发追 小明从A地处发言公路朝 六年级作文痛并快乐着.怎么写层次深一点,成长中的 一篇英文的作文100单词(关于中国传统节日的) 圆中国梦,共建美好校园 作文演讲模式的,重点写创建校园,略写中国梦!但仍希望为我解答, 英语自我介绍 适合于口语比赛中 急大致内容如下 请尽量用高级词汇和从句翻译 大学水平 不一定要都一样 可以适当自己添加 里面人名可不翻译 请不要出现语法错误很荣幸能在这里介绍我 读书的滋味 作文 记叙文 600字左右 作文中华情中国梦怎写? 英语自我介绍口语各位主考官你们好!我叫XXX年龄18岁或者19!我学的是计算机应用技术!爱好足球,网球,吉他! 英语小论文,做英语海报是这样的,我们要做英语海报,需要一些关于fashion show的文章, 修改病句:小丽和小华一起上学,她在路上捡到一个钱包. 口语比赛自我介绍英文版 阅读下列文字,根据要求写一片不少于700字的作文长沙街头一位青年牵着白发父亲的手缓慢过马路,感动了许多路人,该视频在网上发出后短短一天时间,被两万多网友关注,不少人跟帖说这份孝 小丽的朗读和写作水平在逐渐增强.该病句错在哪里小丽的朗读和写作水平在逐渐增强.说这是病句 请找出错误.儿子做不出问我,我愣是看了五分钟,实在惭愧,找不出错在哪里,请指教~ 五年级上册语文第三单元作文说明文怎么写?(要写小兔子)_ 作文-小兔爱看书700字 两只兔子一共摘了96个蘑菇.大兔子摘的是小兔子的3倍;大兔子分别和小兔摘了多少蘑菇? 关于兔子的作文 说明文 初中生作文说明文:我的卧室500字 五年级下册语文第三单元作文:竞选劳动委员演讲稿1、为什么竞选这个岗位2、自己有那些优势3、如果竞选成功怎样为同学服务,如果竞选失败怎么办 竞选英语组长发言稿作文快! 关于说明文的作文500字 五年级下册语文作文发言稿450字竞选数学课代表的450字必须!注意,最好别加入性格! 一本童话故事书,点点第一天看了全数的7分之1,第二天看了15页,这两天看的与剩下的页数比是1:3,这本书共多少页?要有过程. 说明文作文500字 写状物 五年级下册作文第三单元劳动委员400字大哥大姐,快 介绍一种物品,最好要用到列数字、举例子、作比较、打比方其中的几种说明方法. 感恩母亲作文100字 我想考托福,请问有什么准备方法、比较好的参考书.我现在初三,打算在高2~高3考托福请问有什么参考书可以推荐给我的(或者某个出版社、作者的书籍)?词汇书、语法书、阅读、聆听、说话 求用七十个单词写的上学路上的见闻故事的英语作文 写景作文材料可以有哪些 小明在路上看到一袋米和一百块钱!请问小明会选择哪个 我想考托福,介绍几本参考书.我大二刚刚把六级过了,但分数不高446分 现在想准备托福,希望找一本基础一点的辅导书 我为什么爱讲话作文600字知道的快来 急用 可以给500分 去菜市场卖菜赚钱吗? 怎么办!我要考托福! 为什么friends是最适合锻炼听力和口语的英语电影 捡到一块钱,怎么处理今天捡到一元钱,怎么处理好一点,听说捡钱不吉利? 英语翻译 求关于英语学习方法的英文短文可包括培养兴趣良好习惯勤能补拙自信等要点 我要一篇作文《竞选班长发言稿》,400字左右.急. 第十三届全国英语创新大赛复赛口语需不需要准备自我介绍?速度 为你喜爱的电影做一张海报例子:It's "Shaolin Temple".It's an action movie.It's very evciting.Jet Li is in the movie.写动画片也可以 我回家的路上,捡到一块钱.英文怎么说?我看语法书上说长的动作要用过去进行时,段的用过去式. 人教版五年级下册第三单元作文:竞选体育委员发言稿 大毛看了一本数学童话书,已看页数与未看页数的比是1:4,如果再看5页,这时已看页数占总页数的30%,问这本书共有多少页? 兔妈妈把才回的蘑菇的八分之五,按2:3分给两只小兔,得到蘑菇较多的小兔得了45个.兔兔妈妈一共采回蘑菇多少个?算式和方程(方程是要x不要y什么的) 第十届全国创新英语大赛复赛怎么准备?尤其是口语部分?望曾拿过优胜的同学指导下~ 求700至800字作文, 两只兔子一共采了240个蘑菇,平均每个兔子采了6个.每只大兔子踩了八个蘑菇,每只小兔子采了三个蘑菇大兔大兔子和小兔子各有多少只? 创新英语大赛口语怎么比?话题陈述是电脑自动抽出一道题,思考30s,陈述90s,还是抽取好几道题,然后思考,然后陈述呢?另外看完题目会紧张,万一啥都不敢说了怎么办 急用
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘