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

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


Twitter面对危机火速上线照片滤镜产品 Nike推创业孵化器:每个参与团队获2万美金 傲游发布云浏览器 支持跨终端数据同步 12个git实战建议和技巧 用友UAP产品线总设计师史周军访谈录 IE10新功能解析 支持Media Query(图) 单页Web应用或引领下一代Web新趋势? [CTO俱乐部第89期]新时代的前端开发 [多图]160台Mac mini打造的数据中心机架 是谁动了我的CPU! 欧朋CEO:GPU加速是手机浏览器的新趋势 TOP30专访:Splashtop研发中心总经理Alex Xu 2012Q3国内App开发者半数以上入不敷出 细微之处见真章 为什么要在try-catch-finally里加大括号 独立开发者:面对攻击就要“脸皮厚+更自豪” IBM纳米光子芯片对付大数据 单个通道25Gbps AWS数据仓库服务Redshift是最好的选择吗? 又赚了一笔:微软向两公司收取Android专利费 深度解析:Android4.2系统“应用验证服务” 欧洲移动游戏大会:五大行业趋势 大揭秘:Windows Phone 8 键盘输入的8个设计精髓 朝鲜:探寻最神秘的移动互联网王国 如何让IE 10玩转响应式网站 Windows Server 2012:令CIO激动的三个新特性 高德和新浪微博战略合作 打通账号互调数据 乐观锁和悲观锁 你更钟情于哪一个? Apple索30%分成 iOS版微软SkyDrive更新搁浅 [简讯] Linux 3.7发布 开源图形卡驱动程序 高效敏捷的十大经验法则 佛瑞斯特资讯公司预测2013年云计算的十个变化 百会中小企业CRM年会成功举办 发布CRM选型指南 asp怎样连到SQL Server 2000?给100分,在线等 ASP.NET和SQL 哪位兄弟有用asp.net做的OA完整的例子...大家快来.. 关于dllhost占用系统资源的问题! Kylix是否和Delphi一样有RTF控件可以处理丰富文本? 小弟想考程序员!各位大哥指点一下嘛!有要考的交流一下嘛! 查询条件的问题?? 从事共享软件开发的进来谈谈做共享的辛酸好吗? TListView中某一SubItem怎末实时更新?在线等。。 http://www.000163.com/的空间能不能信得过? 请帮忙哟,在线急等 asp.net下如何用c#编写程序实现调用数据库中的多个表显示在datagrid 如何调用存储过程来删除表中的列名???? 给一个变量赋空值的问题 如何在DirectDraw显示Edit,输入文字?? 贴子回复次数大于跟给分次数是什么意思啊?让不让结啊?? 结交delphi爱好者! 请各位高手给我指点一下方向? 如何在Sybase数据库中获得刚插入的那条记录的主键? 怎样获得菜单项(menuitem)名? 简单问题 请问如果有一个dll文件,我想知道里面有什么函数,但我又没有说明书,有什么工具么? 报表设计器怎末没有在外接程序菜单中显示出来呀?? 如何知道选哪个? 急,如何将图标保存在一个数组中,并将它显示出来? struts配制数据源中如何指定url编码? 在csdn设立开放源代码的项目 妈的!等咱有了钱... zt 请问那位大哥有在linux用mysql管理前端啊 client script动态改变表单的问题 我从网上下载了一个例程,可是太大了,不知道从哪里开始读 如何能在程序的线程被kill的时候将定义的变量写入文件保存 有做过图书馆管理系统的请进(VB+SQL Server)C/S结构 请问这样一行代码是什么意思? 简单问题给100分 在csdn如何改变字体,还有,如果不必自动登陆? 关于创建共享库(.so)的问题,高手帮忙 关于如何限定一个文本框的数据类型 超出一个月未结贴的名单公布 用DATAGRID的绑定列能传一个ID给下一下FROM吗? 模板应用时出现的图片不能显示出来的问题? 这么简单的问题 就20分吧 郁闷...辞过职的人帮帮我 电脑极不稳定 那里可以下载到VC++6.0的MSDN啊??着急看呢! 请问visio的数据库模型的关系怎么删除?? Linux无法启动, 请高手解决!!! 请问wmv格式的文件怎么打开?!(视频) 地址栏中不能输入别的网址,请问是什么原因? 如何知道win2003已被激活? 这个格式怎么实现? You must add at least one person to the To line to send a message. 如果你的生命只剩下几天,你会做什么? 边际替代率怎么算 弄了抓啥意思? 如果生命还有几天,你会去做什么 关于边际替代率题若张某消费牛奶和面包时的边际替代率为1/4,即一单位牛奶相当于1/4单位的面包,则()为什么当牛奶价格为1,面包价格为4时,张某获得最大效用? 如何用封锁机制保证数据的一致性 波的性质是否改变?某波源发出人耳能听到的波,某人远离波源的速度是足够使该人的接受频率小于20Hz.那么这样所得的次声波,是否与波源直接发出的次声波的性质相同? 要挟,勉励的意思? 伟大,隐蔽,谨慎,朴实的近义词是什么? 总是说把你抓起来 关于“劝学”的文言文和诗句就是找不到哒.. 天文望远镜上的, 抓现形 什么意思? 劝学的词语解释《劝学》中:“登高而招”“顺风耳呼”的而都是什么意思? 写出近义词:诧异( ) 观察( )抱怨( )伤害( )温暖( ) 祈盼( ) 注视( ) 舒畅( ) 兴起和崛起这两个词怎么区分用法?如上 试验有何不足之处 舒畅的近义词 已知各项点都在同一个球面上的正四棱柱的高为3,体积为24,则这个球的表面积是 消失的英文怎么写? 捉急什么意思 飞利浦380伏2000瓦一个灯泡要多少安开关 下面是测量密度的实验,请指出不足之处,怎样改进?1:将天平置于水平台后,立即调节平衡螺母,使横梁平衡2:用天平测出装有适量食用油的烧杯的总质量m13:将烧杯中的一部分食用油倒入量筒 抓现行什么意思 人具有波的性质吗? 植物呼吸作用的实验的不足之处有两个实验:①放蜡烛,蜡烛熄灭的实验②一个袋子罩在植物上,一个管子一头在袋子里,一头在澄清的石灰水里,一挤袋子,石灰水变浑浊了指出这两个实验的不 缩写【虎门销烟】100字 求半径为R的球的内接正四棱柱侧面积的最大值 短期边际成本曲线与平均可变成本曲线的交点称为什么?…,与平均成本曲线的交点称为什么?…. 拿破仑称帝的因素? 如何看pcr的结果图 轻质弹簧的上端固定在电梯的天花板上,弹簧下端悬挂着一个小铁球,在电梯运行时,乘客发现弹簧的伸长量比电梯静止时的伸长量小,这一现象表面( )A.电梯一定是在下降B.电梯可能是在上升C Pass the book to her改为否定句 实时定量pcr的图怎么看?就是标准曲线图,我看不懂啊!横坐标是循环数,纵坐标还看不清是啥...哪位能给我详细讲讲实时定量的图怎么看, 既然消失,就永远别出现了.用英文怎么说? 抓马困是什么意思?有人知道吗? 1,促成拿破仑称帝的原因?2,华盛顿拒绝称王,其个人原因何在? 那么就永远不见吧 用英语怎么说? BL 抓马什么意思 拿破仑为什么称帝前叫波拿巴比如以前都是波拿巴将军,波拿巴第一执政,称帝后却成了拿破仑皇帝,为什么不是波拿巴皇帝 中奶酪和迷宫有什么寓意 上海话 抓 各服马巷 不来赛啊 来赛!哪能不来塞了 "抓不住的才是最真实的"什么意思 谁动了我的奶酪是什么意思? 哥哥姐姐怎马捉 如何正确的指出孩子的不足之处 缩写这句话娘儿俩最高兴的事是他们的小牛活了 怎么抓马要去哪抓 求此诗 赏析 另请指出作者不足之处芳菲残尽莺啼愁 故人邀约重旧游 昨是今非不堪赏 欣容背后是苍凉 春花新月碍人眼 风过疏竹侵哀肠 触景伤情陷往事 烟云坠眉起悲绪 心知此番重会后 君 非洲动物有哪些?名字要英文的.不需要太全,几个就行,英文名字,带中文翻译 在做万有引力题目时,什么情况下可以用F=G(Mm/R2)?怎么判断? 《星空思》请大家点评一下有什么不足之处,星空思 望星空之浩瀚,感宇宙之无穷.求心灵以栖息,喜皓月之圣洁.包星辰于无数,慕胸怀之广博.观天地以万物,唯星空之壮丽! 汤姆最喜欢的动物是熊猫 的英语是什么 You are the first person to pass the 拿破仑称帝了吗? ppr管子遇冷会有水吗,各位帮看一下是漏了还是凝结我家金德的ppr自来水管子,进户与楼道里的那段管子,我放一会自来水(把管子里存水放干净)隔一会用手摸上去会有水,请问各位是漏了,还 波的性质问题发生干涉的两列波是不是要频率相同,波速相同,振幅也要相同吗, 拿破仑为什么称帝一直搞不清楚. 边际替代率 是什么? 土耳其总统警告说大规模杀伤性武器扩散俄总理:美国窃听外国领导人的行为“无桐庐环保局局长办乔迁宴被免职杭州秋石高架半山匝道11月初启用孕妇被车撞伤无人施救 2名村官停车救3名中国专家受邀参与叙利亚化学武器核联大主席称新兴经济体成为促进发展中国运营商公布垃圾短信举报方式 违规号码河南大货车路过徐州遭胡乱罚款 涉事警中储粮掺转基因油续:千吨进口菜子油获印度开建182米高世界最高雕塑 呼吁加沙唯一发电站停运使供电形势严峻美国洛杉矶国际机场发生枪击事件中储粮就掺转基因油事件处分6人 一公联合国秘书长与世行行长将再次联合访问希腊首都发生枪击事件两死一伤北京黑停车场当城管面收费 称公司领导希腊首都雅典发生枪击事件 致两人死亡男孩疑因被逼检讨跳楼身亡 老师至殡仪北京多部门称对荷兰艺术家“雾霾吸尘器崔永元未明确回应“因抨击转基因离开央结婚离婚登记今起需指纹认证琼瑶诉于正抄袭获500万赔偿金国画专业走出的漫画大赛冠军大学生爱回家其实不奇怪大学生网络贷款 机会与陷阱并存镜头说话:春运路上的大学生销量论英雄 2015年度销量前四SU新能源补贴、牌照都没戏?宝马插电式混硬汉终于谢幕 路虎卫士最后一辆正式下【底价购车】全国主要城市 别克昂科拉磁悬浮马达的魔力 松下电动剃须刀49再多衣物也能掌握 松下洗衣机新品推荐官方:西汉姆联租下费内巴切前锋拜仁vs霍村赛后评分:莱万满分全新A4L/新款Q3等 奥迪2016今天穿啥 | 长风衣配喇叭裤,复古s“分布式账本”到来之后,可能再无以前保险饕餮去杠杆过于急躁导致股市失速下行2023年游泳世锦赛落户多哈 南京落河南省十二届人大五次会议闭幕
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘