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

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


携程开放平台发力 将实现旗下产品全流程API支持 Puppet labs发布2013自动化运维报告 “国”字号开发者:航旅纵横负责人薄满辉专访 金山云杨钢:核心算法保证安全和低成本 加速软件交付 企业级模拟测试服务CA LISA受追捧 盛大云业务重点转向自服务 转战中小型企业:Prediction API请求一个月内飙升至7亿多次 利用光子 耶鲁大学研究人员让量子计算机离现实更近一步 技术为王的云计算会让IT部门消亡么? 从Discuz到APP:安米移动社区转化工具 覆盖全领域:Google、Facebook、Twitter等大师的最佳推荐 苹果CEO宣布更改保修政策 并向中国用户道歉 拒绝使用现有Web组件的6个愚蠢理由 Github宣布支持SVN方式访问 iPad,正在改变什么? Go Mobile:行业大牛谈行业应用开发 亚马逊Cloud Drive新增文件同步功能 对抗Dropbox 35万奖金发放,BlackBerry 10大赛奖项揭晓 超越Google Apps:排行榜前10的相关云应用 荣耀终将消散 全球第一台千万亿次级超级计算机退役 谷歌已推免费Android和iPhone版Quickoffice,微软你呢? 用于响应式设计的9个CSS技巧 微软Surface Pro正式登陆中国市场 售价6588元起 岳雷:Windows Server 2012虚拟化性能提升巨大 陈健:Windows Server 2012让企业轻松管理IT 智能手机:革命已经波及到阴间 兄贵草泥马:重口味单机移动游戏为什么能火? 最炫HTML5框架Famo.us 将免费面向开发者 MySQL到NoSQL:数据的重思和查询方式的转换 程序员心髓:移动应用API设计10大技巧 Netflix公布个性化和推荐系统架构,3种类型作业通实时 are there any software in linux, just as netant,office etc in windows? ASP的中文問題 请问:测试工程师的工作是什么?主要测试软件的哪些项目? (100分征集)如何做使得访问JSP服务器时不用加端口号(当然不能用80)?? 菜鸟求助:关于句柄的问题。请高手多多指教 请问什么是存储过程(在SQL 2000SERVER中)? 1000分的大问题!***************怎么突破内存禁区读写的权限 java学什么?怎么学? java学什么?怎么学? 高分急救:Oracle安装完成后,服务可以启动,数据库不与服务一起启动,要手动启动 如何让启动时不自动进入x windows? 下载问题 如何得到CPU的序列号(编程) 向ActiveX控件是否可以传递数组参数 can i read or copy files in windows OS to linux? 什么错误? 将SYBASE数据库移植到SQL SERVER 过程中遇到的问题。急!help session问题 为什么我的web不能进断点? SO_REUSEADDR的疑问 关于web数据库的问题 怎么解??? 再送100分,求jtable例子! 怎样清除在image上画出的线,矩形(在运行时画上去的)?? 寻找在杭州文三路创业大厦11楼上班的朋友 where can i download simsun, and how can i use it? IIS与Apache一起工作,访问Apache时有什么办法不用指定端口? 是不是微软的一个低级漏洞? 谢谢zheng017给你的win2k superuser password的源程序。 在access2000的开发中,text框中如果只输入了空格,用text1.value取数据返回值却是null,如何能够返回空格呢? 强烈推荐:Robocode! 为了全体中国人!请回答我的问题!现在该如何访问google??????????????? =======请大家帮我介绍几个比较好的,LOTUS做的WEB网站。====== 为什么我在 M$ Win2000 使用钩子拦截键盘鼠标消息就那么困难 请问在datagrid里面如何增加记录??? 打算成立程序员单身者协会,欢迎大家发表意见,欢迎加入, snowy_howe请进来接分 邦定问题 高手指点 请问大家如何实现VB导入导出TXT文件(TAB分隔的数据)到数据库中?请具体一点,最好有例子 如何让一个模块在运行过程中中止运行. 请教如何控制目录返回?急!谢谢! 修改const常量问题 高手请进,关于asp远程读取信息的问题!急 关于VB 中的字符串截取 询问:国内有没有好的搜索网站????............... google不能用了,想用“3个代表”来搜索了 对在csdn灌水乐园混的程序员和非程序员突然有了种敬畏的感觉 如何远程获得对方机器的操作系统的类型? 请问Oracle和DB2 都是用什么写的? 有谁知道pbm_keydown事件返回值的含义? 何不试之以足呢是什么意思?郑人买履的寓意呢?最好今天! 用西班牙语介绍一下智利!特别是旅游的地方 小船渡河,河宽d=180m,水流速度v1=2.5m/s,(1) 若船在静水中的速度为v2=5m/s,求①欲使船在最短的时间内渡河,船头应朝什么方向,用多长时间,位移是多少.②,若航程最短,船头朝什么方向?用多少时 郑人买履里,回答要快一点那,明天就要交了!(>_ 用英语介绍一下智利的情况原文是这样的:Do you know anything about Chile?我是初三的,不要太复杂的单词与语法.围绕地理、人文、盛产等大方面说就好了.不能超过初中生的水平阿 电打火机里的产生高压电火花的原理是什么? 已知集合A={5},B={1,2},C={1,3,4},从这三个集合中各取一个元素构成空间直角坐标系中点的坐标,则?2已知集合A={5},B={1,2},C={1,3,4},从这三个集合中各取一个元素构成空间直角坐标系中点的坐 固体氢氧化钠加水后现象? 焊接电源是如何分类的?共分几类?焊接电源是不是只是指弧焊电源还是弧焊电源只是焊接电源的一种? 电路题(功率求解)美国纽约市需要大约10的10次方W的电能供应,电压是110V;由纯铜制造的电缆来传输这一功率,他的电阻是每英尺5x10的负8次方Ω.求每英尺I平方R的损耗功率? ※1,3-二丁烯与HCl的加成反应方程式1,3-二丁烯与HCl的加成反应方程式 电源电池掉了,正负级的代码符号各是什么?在哪焊接? 怎么计算锥度尺寸 比如图纸上面给了大头尺寸还有锥度[10°]怎么计算小头、有什么公式吗比如图纸上面给了大头尺寸还有锥度[10°]怎么计算小头、有什么公式吗 氯化氢与3-甲基-1-丁烯加成为什么生成 C-C(CH3)(Cl)-C-C和 C-C(CH3)-C(Cl)-C不是马氏和反马氏吗?为什么Cl在双键旁边的C上?我知道了,是重排了对吧那问下什么时候会重排,这个怎么考虑?希望有 飞镖盘最大多少寸的 家里的暖气片,在最后一片的回水管放一会水,整个房间的暖气片就开始凉了是怎么回事,集体供暖 2-甲基-1-丁烯 和HCl加成得到两种卤代烃?可是按马氏规则只能得到一种啊,答案是不是错了? 地理等高线专项训练,最好是有答案的, 甲壳素用作组织形成剂? 什么叫做氮化?氮化的目的是什么?氮化的最佳温度是多少? 地理等高线是啥意思等高线是啥子东东,讲讲哈 十二烷基苯磺酸钠可以用来做发泡剂吗? 是氢氧化钠固体与二氧化碳反应生成盐和水 还是氢氧化钠溶液与二氧化碳反应生成盐和水.还是氢氧化钠与二氧化碳反应生成盐和水.为什么若有一个判断题.1.氯化钠溶液与氢氧化钡反应生成 地理中的等高线什么高于高的、低于低的,怎么判断? 氩弧焊、电焊、二保焊它们各自的优缺点各是什么呢?就是针对某种金属各自焊的结实. 飞镖靶边缘上数字是啥意思 怎样培养初中生的地理学习兴趣和有关经纬网,等高线,地球运动的相关问题呢? 串联电路功率最大还是并联电路的功率最大 tig焊接什么意思 如图,有四个正方体,每个正方体的六个面上的A、B、C、D、E、F六个字母徘列顺序相同F对面的字母是() 关于串联电路总功率的问题.给一个额定电压220V,40W的小灯泡串联一个电阻,这个电阻消耗30W的电能,问这个额定电压220V,40W的小灯泡它所消耗的电能比10大还是比10小? 磁性飞镖靶的材料是什么 如图,有四个正方体,每个正方体的六个面上的A、B、C、D、E、F六个字母徘列顺序相同第一个B对面的字母是(B的对面 A的对面 E的对面 设a,b是非零实数,y=a/|a| + |b|/b + c/|c| 可能取值的集合.为什么这个集合属于空集? 焊接TIG的英文全称是什么? 中国铜排铜材中铜矿物的特点及分布特征? 设a、b是非零实数,则y=a/|a|+|b|/b+c/|c|可能取值的集合.这个集合属于集合分类中的哪一类,为什么? 飞镖的训练靶和比赛靶有什么区别 把一个正方体的六个面分别标上字母A、B、C、D、E、F并展开如图所示,已知:A=x2-4xy+3y2,C=3x2-2xy-y2,B=12(C-A),E=B-2C,若正方体相对的两个面上的多项式的和都相等,求D、F.快呀, 数控锥度计算公式 大头为37.4长度为43,比为1比35 求小头 飞镖靶上有1-20个区域,打在靶上的任意一镖,落在5的倍数区域上的可能性是( ) 铜矿在中国分布主要在哪几个城市 在哪个省 总结一下简洁一点 自度其足的度是什么意思 推荐几本讲高中自然地理的书,比如等高线,昼长夜长之类的书, 江西铜矿的具体分布、、、 EPDM为什么有橡胶特性呢? rotrac六个字母组合成的单词 世界铜矿分布 大头60小头20长度40等于锥度多少 把 reatmk 这六个字母排列成单词 打火机里面的火花是电流还是电压?电人为什么会麻呢?在一根很长的铁棍或者别的金属的一头打一下,火花到了铁棍,另一头的铁棍的人也感觉到手也麻了,这么长的铁棍,为什么,没有电阻呢? 晶状体调节能否恢复视力 下面六个字母,符合音序排列的一组是A.LHPSQLB.HLNPQSC.HNLQPSD.HLNQPS 电子打火机里面的火花产生是什么原理?为什么会有那么高的电压? 何不试之以足在郑人买履的意思 AAABBB 六个字母共有多少种不同的排列方法,请一一列出,如:ABABAB AABBAB 打火机里产生火花的那个东东叫叫什么?原理是什么? 《郑人买履》中“吾望持度”的“度”意思? 氢氧化钠能与水反应吗? 那些橡胶适合做洗衣机皮碗
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘