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

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


对产业互联网战略的战术思考——争夺企业信息入口的战争 加入Cassandra,OpenStack发力DBaaS生态圈 死磕Google Keep,微软正式发布Mac免费版OneNote 《近匠》安管云CTO石磊:降维安全的开放平台 2014 Unity亚洲开发者大会&#183;中国站讲师名单议题全部出炉 【独家专访】红旗Linux元老:猎猎红旗永飘扬 借助三大技巧 助你提升API状态页面 集成GemFire,Hadoop生态圈的又一把火 次世代光照体验:Unity 5面世,功能系统全升级 深入浅出,以咖啡店为例演示Web应用程序扩展 百度Clouda:可依赖的实时JavaScript开发框架 Oracle发布Java 8正式版及JDK 8 编程语言中一些令人抓狂的规则 廉颇未老,微软股价创14年新高 中国云计算大会PPT集萃(三):核心架构及应用实践 特性是增多了,但是Google的云服务仍然不温不火 全国云计算大数据创新项目评选活动正式启动 【独家专访】Perl发明者首次来华:将在OSTC大会分享其编程人生 腾讯核心创始人张志东半年后卸任首席技术官 改任终身荣誉顾问和学院讲师 咱们约会吧,Web设计师教你不一样的语言 开发者不容错过的10款免费JavaScript游戏引擎 付费授权、开放源码,全新虚幻引擎4正式发布! Larry Page未来计划:用科技创造美好生活 AWS 8周年,收入超四主要对手之和 分析:北京网络广播电视台私有云实践 腾讯云总经理陈磊分享微信云三步曲 十大技术,十家机构,从行业制高点一览大数据 【OSTC讲师专访】严旭:文艺豆瓣也很开源 大姨吗携手睿仁医疗 推智能体温贴Raiing 三个火枪手将重袭传统零售业 网易王健宗:革命Hadoop,Spark带来百亿市场价值! 文本两边对齐 请问sqlserver2000中bit类型值怎样表示 谁有jspsmart 上传组件。我上不了jspsmart.com ,好心人给我发一个!!! 时间格式有误,不知是何原因? 怎样开、关进程!(不是线程)? 今年高考的一篇旷世奇文 cnn连接怎么单独写出来,让Sub或Function调用?不用每次都写一次连接, 请附上Code ,谢谢 请教multibytetowidechar的用法 请救各位. 关于用nmudp实现传输!up也有分,:)) jcreator的debug模式不是很好用,怎么(黄色小三角)指的位置不对啊? 关于用mscomm编程的问题,请大虾指教 导出数据库和操作时经常出现无法分配共享内存错误. 关于ListBox 重分请教:关于制作自定义报表的问题!!! 请问怎样编程查询一个字符串的五笔字型编码? 我们单位要上ERP,作为公司分管微机这一块的我该准备些什么? 右键菜单问题 d7+ADO+SQL2000,如何判断SQL2000数据库中存在某个表? 想要去清华读研究生,大家帮忙出出意见!!!!!!!!!!!!!!!!!!!!!!!! 大价钱求解小问题 好硕的5460!!!! iwantsay 关于MSComm的output和Chr()函数的问题 好久没来这里了这里的朋友们还在吗? 如何在TreeView的节点中调用一个方法? 关于deploytools 一个有关代理文件操作的问题,困扰很久了!! 如何由资源ID得到资源的句柄 向oracle 中插入纪录,日期格式由问题,见内 查询问题 如何取消验证 关于asp打印的一些设置的请教 dbgrid显示不同小数位数问题 关于用nmudp实现传输!up也有分,:)) 我在WSAD5.0中创建的WAS 5.0Server 为什么总是启动出错???请各位高手指点!!! 关于Apache+mysql 100分求《设计模式-可复用面向对象软件的基础》电子书! 向oracle 中插入纪录,日期格式由问题,见内 在线等候 在企业管理器里附加了一数据库,显示为readonly,为什么!!!! 就要实习了,不知哪些公司比较乐意接受实习生呢 急!!请问如何在WEB自定义控件中响应事件? 本人最近写了一个服务器端文件管理的程序,基本的功能都已经实现,但是下载的功能还是不行,欢迎大家讨论实现。 奇怪的comboBox的数据绑定问题! 为什么不能把记录成批插入到表中? 在VC中操作access:update的where子句中用"and"组织成多个表达式时出错! 在线等候 怎么将数据库中的字段项动态的添加到COMBOX里面去。(我用的是DB2数据库) sql关于多个数据库的问题 散分了! 我也散点分吧 滥用中的“滥”在这里当什么讲? 滥用权职的滥是什么意思①.泛滥。②.过度,没有节制。 3x²+2x=0,3x﹙2x-1﹚=4﹙2x-1﹚,﹙x+3﹚²=﹙2x-1﹚²分解因式法 滥第六画是什么 求教 珍禽异兽的意思别出心裁一点哦!要与其他的不一样!最好造句子! 安利柯是哪本书上的人物?他或她是怎样的人? 克莱谛与安利柯的故事,思考:这是发生在两个小伙伴之间的平凡小事,为什么我们读起来会觉得那么精彩?它的闪亮点是什么? 1、如图,EA⊥AB,BC⊥AB,AB=AE=2BC,D为AB中点,以下四种判断:(1)DE=AC;(2)DE⊥AC;(3)∠CAB=30°;(4)∠EAF=∠ADE正确的是?(每种判断都要理由)2、如图,在Rt△ABC中,∠ACB=90°,∠A<∠B,M是斜边中点, 2(x-1)+3(3+2x)=31求x matlab 两个高斯函数卷积后求积分对y和z进行卷积后得到s,求s图形与x轴的面积应该怎么求啊,我想求面积后再比上y与x轴的面积,clear;clc;close all;x=0:0.1:12;y=gaussmf(x,[140 6]);figure;plot(x,y);z=gaussmf(x,[9 6] 1,We should not be ________ towards our comrades.一、单选题1、We should not be ________ towards our comrades.A.coldB.friendlyC.kind2、A: I’m keen on baseball. B: So ________ I.A.haveB.doC.am3、A: I don’t have tea in the morning. B: ____ 日媒:盘点世界各地免费Wi-Fi那些少女遭性侵后被活埋 恢复意识后挖土逃驻日美军基地现近300只毒蜘蛛日本“黑色家庭”为何欲散还休浙江桶装水企业抽查合格率不到8成 8杭州市民给地铁\"挑刺\" 交通部门古巴外长将访华2012年恐怖袭击超过8千起 不幸遇伊核对话进展积极 伊朗或做重要让步德国联邦情报局否认监听美国政要俄否认G20峰会用手机充电器监控外国加拿大华裔学生获资助访华 推广烈治文国家体育总局官方网站撤下肖天名字(图北京北海公园荷花迎夏盛放大马华裔男童遇车祸身亡 肇事者系无照肖天上月为刘翔颁发中国田径杰出贡献奖国防部:有的国家在南海大\"秀肌肉\日本人气猫“站长”16岁高龄去世 众四川乐山第一中学校长袁光大涉严重违纪青海实现食品安全监测点县级全覆盖饮酒致死连发透出纠风“死角”国防部:有的国家在南海大\"秀肌肉\
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘