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

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


苹果谷歌都无力?前员工开发跨设备无缝同步应用 带你看会带你飞!MDCC 2014移动开发者大会参会指南 Meteor 1.0发布 构建更好的Web应用 【专访】敏捷专家吴穹:敏捷测试的行业应用与实战解析 英特尔中国研究院最新成果亮相 展示智能衣服瓷杯机器人等创新作品 Node.js 打造实时多人游戏框架 深圳微信开发者大会购票企业特征分析 上门汽车服务“e保养”完成A轮500万美元融资 Docker之父Solomon Hykes谈项目开发的初衷和挑战 浪潮是如何实现单日5000台x86服务器交付互联网的? Bootstrap 3.3.0发布 版本4不再支持IE8 漏洞预警:FTP曝严重远程执行漏洞 影响多个版本Unix 【简讯】W3C小组宣布HTML5标准制定完成 AMD发布GPUPerfAPI 2.14,GPU性能检测更Easy! 开放能力升级——微信公众号登陆授权开启公测! 百度最“智能”的新型推荐技术——智能因子分解机 消灭Bug!18款最佳的问题跟踪管理应用程序 Google Analytics为什么会这么快 【MDCC 2014】Xamarin深入体验营——开发实战大揭秘 【MDCC 2014】电信技术专场:运营商与开发者如何合作共赢 【MDCC 2014】高德LBS大赛闭幕式暨颁奖典礼:下一个50亿应用花落谁家? MDCC 2014移动开发者大会开幕:全生态系统齐聚 开发者成主角 蓝港互动有限公司董事长&amp;首席执行官王峰:移动互联网泛娱乐化趋势 多盟联合创始人&amp;总裁张鹤:多盟DSPAN助力开发者高效变现 创新工场联合创始人汪华:移动互联网时代的跃迁式增长 阿里巴巴集团UC移动事业群总裁俞永福:AMAP Inside——更专业、更开放 《程序员+》移动应用上线 启动“2014 MDCC十大人气应用/产品评选活动” 微软开发体验与平台合作事业部大中华区DX部门总经理Srikanth Raju:基于云的跨平台开发 Facebook平台工程合作部亚太区总经理张博:通过Facebook构建下一代移动应用 Vungle工程副总裁Wayne Chan:移动视频广告的未来 友盟副总裁焦岳:2014移动互联网行业趋势&amp;大数据的行业价值与运营支持 怎样做服务程序? (在系统后台运行) TComboBox的text能否设为只读? 站点属性中“应用程序保护”有三个选项,分别是---低,中,高。有什么区别吗?安全性有什么不同?为什么有的isapi程序必须设置成低才能正确执行啊? 怎样才能使Web页上的ACTIVEX控件自动下载注册? ADO 与 DATA MODUAL 怎样判断一个文本文件中的数据。 绝对的诚意邀请高手加盟 请问邮件服务器,如何用java实现,最好有源代码,谢谢了,急 急贴:>>>>>>>>>>>>>>>>>>>>>>>>>>这里有英语好的网络专家吗? 关于java中的画矩形 哪里有将股票数据转换成数据库格式的工具? 从哪里能找到用opengl绘制三维图形的源码?基于unix下的。 asp 怎么判断客户端的操作系统还有屏幕大小什么的? 卡在了一个错误里出不来,求救! 谁知道??????求救~~~~用asp操作注册表,从注册表中删除指定的主键! 何处能找到用opengl绘制三维图形的源码?基于unix下的 谁有多种字符窜转换的方法或代码呀? 用JBuilder5做的数据库应用程序怎么打包? 我的机器上没有装outlook,当我点击mailto时,就直接链接到hotmail的邮箱,怎么回事那 请问我在一个窗体里拖动了十几个ADODC控件,启动时很慢请问我该怎么样 怎样调整图片适应"picturebox"大小 请问那位大哥有求切线的C程序。 关于赵薇着装的讨论可以停止了 怎样远程连接安装在Linux 上的Mysql数据库? 谁能帮我解压缩从huizen.dds.nl/~roalt/h263.html下载的 H263软件 真诚的希望你加入振兴软件产业的 事业中来 两个函数之间变量可以共享吗 拷贝ACCESS 库 请教高手(关于数据结构)的一个问题 关于Rundll32.exe程序的问题 播放AVI动画的问题 c#和asp.net有什么关系? 串口打不开怎么办? 请问各位大虾,怎样在java里打开一个IE窗口。 网络问题! 我的浏览器怎么了? 在局域网中,如何在代理服务上作手脚,使处同一局域网某些人可以上网,某些人不能上网。各位帮忙! 如何制作安装盘,我的做好了,为什么到别的机器上安装不能运行 急急急·高手帮忙,在Java中引用C++的动态链接库,中文字符串参数变成乱码,怎么办? 有前锁问题 找个扫雷源程序! 发送邮件时,对现在大部网站要求的smtp认证,如何处理?急用! 连接的ACESS数据库可以是EXCEL的链接表吗? 神呀救救我吧? 谁知道哪有Delphi写的代理服务器源代码? 关于MFC的动态生成对象的问题 有谁把平台转向XP了,不知在这种新环境下开发出的软件在别的机器上会不会有问题(包括运行库及打包) 帮帮我,好吗?(谢谢大家了) 千山、恶人、老鱼、念雪、浪人及各位大虾,小弟也遇到了Dll引出MDIChild的问题,但是在linux下,不能正常退出,请各位帮忙,多谢了。 我的浏览器怎么了?? 心情好到最高点!放分!!!!!!!!!! 彩虹有几种颜色7 某工厂有一捆粗细均匀的裸铝导线,质量为108kg,横截面积为5mm2,这段导线长 m 铝的密度2700Kg/m3 质量为50kg的铁制机器,为了使他质量减少10kg,现将机器的部分钢件换为铝制的,刚需 类似于粗糙度仪,粗糙度计,粗糙度测量仪,粗糙度测试仪这样的产品在南京什么公司有销售的 铜导线、铝导线用什么性质区分?初三第一学期 初二物理(有关密度和重力的):质量为50kg的钢制机器,为了将它按住行在飞机上使用,必须将机器减轻200N质量为50kg的钢制机器,为了将它按住行在飞机上使用,必须将机器减轻200N,为此,设计时 空气负离子浓度测试仪在青岛有销售的吗 数控车锥度怎么算20大头30度角怎么算小头15的长度最好给个算法谢谢了谁能直接给用上面数字算出来 质量为60kg的钢制机器,为了把他安装在飞机上,必须将机器减轻10kg,为此,要将机器的部分零件改为钛质,至少要用多少kg钛件来代替刚件,才能达到要求.[钢密度8.0*10^3 钛密度4.0*10^3 某机械厂要铸造100个铁质的机件,铸造该机件的木模用的木料的密度为0.7g/cm3,每只木模质量是4.2kg,求所铸造的这100个机件的总质量 数控车大头40小头20锥度15度求大头到小头的长度最好给个算法的过程 钻石刻字必须英文的吗 苯检测仪,VOC检测仪在青岛有销售的吗 数控车内孔带0.03毫米的锥度怎么在程序里去掉?内孔长度是59.0直径是254.0车出来外小里大 石材雕刻机金刚石合金刀头,做浮雕,3D刻字用的 2、铸造铁质零件时,木模用密度为0.7g/cm的立方的樟木造成的,模型的质量是3.5kg,如果要铸造这样的零件100个,按120%下料,最少要多少千克水?(铁的质量:7.9g/cm的立方) 如何减少数控车加工轴类件带锥度的现象 请问,IGI给钻石腰部激光刻字,是用什么仪器啊?另外,给钻石刻字,有什么要求不? 测量仪器和网络测试仪分别有哪些品牌,他们属于哪个国家的,有何特点与优势,国内哪些代理商在代理?帮帮 彩虹是光的折射产生的吗?是折射还是反射? 车削一个长度为110的轴,要求两端中心孔,直径32.跳动在0.03以内.如何加装?如何加工?两顶可以,但是没有,请问有别的方法么? 泄漏电流测试仪等测量仪器 每一台都要拿去 做检测报告吗?如题,像我们公司的产品电热毯等,只要拿样品做检测报告就行了.我们供应商的这种泄漏电流测试仪 每一台都要有单独的检测报告的 彩虹是怎样形成的 为何要经过两次折射一次反射 质量为50kg的钢制零件在飞机上用,飞机超重100N,若把50kg的钢零件改为铝零件,至 由水反射出的彩虹颜色怎样排列的?最上面的是什么颜色?把镜子放在水中 一束光照在镜子上 放射出去的光 最上面的应该是什么色的? 彩虹是由光的反射还是折射? 将金刚石和石墨分别放在氧气中燃烧,结果都生成什么.写出反应的化学方程式 粗糙度测量中都要测量哪些参数 阳光照在红纸上,会反射出什么颜色的光?如题 10立方厘米的铁和40立方厘米的铝制成合金密度是多少?【铁密度:7.9g/cm^3铝密度:2.7g/cm^3 硅片表面的粗糙度怎样测量 彩虹由哪几种颜色? 莫氏五号锥度是多少度? 接触式和非接触式粗糙度测量的区别哪些地方有差异? 普车车内孔,图纸标数已知小径52,长度90,锥度8°,求大径的值径,计算方式怎么求的,急阿,有没有大神教教呢 钻夹头锥度请问1-13MM B16 的钻夹头配机床主轴锥孔是多大的锥度? 为什么三棱镜会反射出彩虹老师给我们上课时弄的实验这是为什么啊 还有为什么看的明显的只有三个颜色——红、黄、紫我们是下午大概两三点时做的实验不要只会打一个啊 飞机设计师为减轻飞机的重力,将一钢制零件改为铝制零件,使其质量减少104kg,则所需铝的质量是( )(р钢=7.9*10³kg/m³,Р铝=2.7*10³kg/m³)A.35.5kg B.54kg C.104kg D.158kg 钻石在直射灯光下能反射几种颜色.我的钻戒貌似是三到四种 分别为 黄色,橙红色 蓝色 与绿色,不过钻石在直射灯光下能反射几种颜色.我的钻戒貌似是三到四种 分别为 黄色,橙红色 蓝色 与绿 彩虹与三棱镜彩虹是空气中的水珠折射出来的,相当于三棱镜,但空气中那么多水珠怎么只能形成一道彩虹?而且为什么彩虹是弯的?究竟多少水珠相当于一个三棱镜? 飞机设计师为减轻飞机的重力,将一个钢制零件改为铝制零件,使其质量减少104kg,则所需铝的质量是 kg.(ρ 防辐射眼镜在灯光照射下会反射出什么颜色发射出来是绿色的不知道是好还是坏呢 眼镜店说是最好的—— 牛顿做三棱镜试验时把日光分为六色还是七色 飞机设计师为减轻飞机重力将一钢制零件改为铝制零件使其质量减少了104Kg求所需铝的质量是多少〔钢的密度7.8;铝的密度的2.7〕 飞机设计师为了减轻飞机的重力,将一钢制零件改为铝制零件,其质量减轻了104千克,则所需铝的质量是多少千克?要有科学过程,复制的不要,好的加分钢铁密度为7.9克每立方厘米,铝的密度为2.7克 三棱镜和阳光怎么可以作出彩虹七色光也行 彩虹到底是反射多还是折射多啊 飞机设计师为了减轻飞机的重力,将一钢制零件改为铝制零件,其质量减轻了104千克,则所需铝的质量是多少千 关于零件粗糙度测量仪器不同系统测出来的粗糙度值差异较大的疑问.我公司最近一批产品在客户处投诉密封孔粗糙度超差.我公司内部使用的是哈量的设备采用的应当是国标,测出来Rz 2 左右, 外园340毫米内园一头200毫米一头190毫米的内锥度轴承 飞机设计师为减轻飞机重力,将一钢制零件改为铝制零件,使其质量减少104千克,则所需铝的质量是%B 光学知识 彩虹 激光单狭缝的绕射条纹 肥皂泡的彩色条纹&光碟上的色彩分别是什么光学现象请分别注明它们所属的光学类别!我主要想知道 它们分别是什么光学 比如 几何光学 波动光学之类 彩虹是折射多一点还是反射多一点? CAD粗糙度如何标注 为什么向着太阳吹肥皂泡会显出色彩?为什么有的时候天上会出现彩虹? 急~~~~~~~希望大家帮帮! 双列圆柱滚子轴承锥型NN3006K轴承的内孔锥度是多少度?分不多,给点就行了 cad粗糙度什么情况下才标注啊?求Cad高手 彩虹是什么颜色 为什么彩虹经过反射会成为弧形呢?为什么一定是弧形的呢? 平行度问题:销钉孔的粗糙度一般多少合适?不影响装配的销钉孔平行度是不是没有必要?如果有必要,销钉孔的加工如何在保证自由度的同时保证平行度呢?即使用什么方法加工?貌似精铰是不
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn