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

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


VB利用 API 可以直接拨号 VB利用API 使Text框只读 VB利用API创建文件目录 VB利用API函数实现VB特殊窗体的两种方法 VB利用API函数实现无TittleBar窗体的移动 VB利用API在VB5.0中实现清除文档名 VB利用App.PrevInstance防止同一程序执行多次 VB判断应用程序是否仍在运行并设置焦点 巧用VISUAL BASIC的RND()函数 让你的程序不在任务栏中显示 -VB资料 VB如何不用API使文本框属性只读? VB如何从文件中提取图标 VB如何关闭/重新启动计算机? VB如何建立快捷方式? VB如何让窗口始终在最前面? VB如何使你的程序同文件扩展名建立关联? VB如何提高调用WINDOWS API函数编程技巧 VB如何为你的应用程序设置热键? VB如何隐藏鼠标指针 VB如何用api检查任务栏中有多少种输入法 VB如何在函数中传递数量不定的参数? VB使用 kb_event 函数模拟键盘操作 VB使用API获取颜色 VB使用标签控件调出浏览器 VB使用调用外部程序函数实现API函数高级功能 未公开API函数揭秘——通用对话框-VB资料 显示文件属性对话框-VB资料 VB用 API 打开打印对话框 VB用API函数改进ListView控件的显示效果 VB用API函数控制光驱的开关 VB用注册表保存数据(VB函数篇) 当FORM1窗体最小化时 如何注册c++build6.0?注册机用不了? 而当FORM1窗体最小化时 --在线等待,高手入内:-IE打印中4.23的问题--- 请问如何在另外一个服务器的文件里写入数据?帮帮忙,急!! 我的困惑 weblogic7.0部署JavaBean和Servlet问题 CComboBox的GetCurSel()问题? 象《金山快译》那样的导航条效果该怎么做了? sql查询的问题,急于解决,请指教! 请问笔记本的开机密码忘了怎么办? 我的困惑 如下小程序,怎么也有问题???请教!? 请问.asf用什么播放 有什么办法能把文本文件中的一个空行给删除 求解(非常急)——在VC中开发电子相册需要哪些技术??? 谁听到过bios这样的报警声 谁知道哪里可以下载vtk4.0软件吗? 斑竹:为什么我提问的帖子没了,难道被删了吗?http://expert.csdn.net/Expert/topic/1323/1323618.xml?temp=.942135 请教?题目:用名为min的函数模板计算两个参数的最小值,用一对整形、字符和浮点数测试所编程序! C++builder6 下载 在线等待有关TurboC4.3的安装问题(还有D版VC的安装) 如何通过EJB删除数据库中的一行记录? 请帮忙 远程桌面共享的密码在注册表中的位置???急!!! 推荐软件:WinReplace批量文件内容替换工具 请推荐一个Java Decompiler 怎样用VB 检测EXCEL是否运行出 (菜鸟级100分) 高分求购 数据库中的OLE字段的读取问题。 研考快了,有几到题莫名其妙,求帮助! 求助大虾??????? 帮忙!! 如何获得当前程序的完整路径和文件名? 高分请教:resin2.1.6+sql2000下,jsp提取的字段显示均为乱码 Ftpcommand ? 如何获取最小化按钮消息?PreTranslateMessage(MSG* pMsg)如何处理? 请教高手——图片如何转换成视频? 河北的高程什么时间报名?什么时间考呀? 等待在线 JS文件打开乱码,如何看到其真实内容? 急,在线等待,90获取如何让Collection集合内对象的顺序改变!!! 在那里可以找到浪潮英信服务器 的声卡和显卡的驱动程序? 一个文学性网页,有砖头尽量扔过来。散分!!! 在jsp中连接oracle报错,请高手帮我分析原因(100分) 很丢脸的,兄弟们来帮我一下哦,? 我的困惑 谁知道哪里可以下载vtk4.0吗? 两个关于日期的问题,请大家帮帮手. #include windows.h 的问题 OS 很多近期帖子打不开,WHAT CAN I DO? 求regionMatches的使用实例! 《好声音》台湾首播 收视率超《康熙来东京申奥混血美女大使泷川雅美性感美照《好声音》冠军梁博美国街头献唱 获网4位战队冠军决出那姐即兴演唱媒体全票好声音“袭”台 张玮张赫宣金池丁丁首中国“恐龙女”上韩国整容节目变绝美芭《中国好声音》第一季冠军梁博美国街头北影表演系新生自曝K歌美照 真的好美中国好哥哥吴大伟走红 相差18年兄妹《好声音》四强选手3男1女东北学员占《好声音》36强产生 下周开始“36张馨予李晨被爆分手 张馨予珍藏版性感好声音决出四位战队冠军 101家媒体SHE巡演Ella尺度全开 深V露到58岁刘晓庆再演少女 被小21岁男演汪东城北京个唱与辣妹“肉搏” 大秀腹中国好声音庾澄庆现场即兴表演现鬼马本《中国好声音》萱萱学员的音乐梦想之路邓鼓VS余俊逸中国好声音:邓鼓VS余俊逸《天黑黑》蘑菇兄弟VS戴荃17173游戏风云榜:中国游戏产业见互联网等于低价?看看这个定价8000港媒:PLA拉改革大幕 7军区合并为俄军舰紧急调动到地中海 意向不明(图三星GALAXY A9在官网亮相 或贾跃亭:乐视移动完成5.3亿美元首轮Coolhear李斌的“活法”——一云通讯的商业诱惑力有多大?inLife早报 | 智能表收集的数这个X装的给个满分不为过!SKT阵容上单空缺 Faker曝Ma惊人发现:揭丝绸之路上的千年干尸之谜放下遥控器走向电影院 这才是院线崛起完美变身红龙!《龙之谷》卢比纳特六件微软已撤掉主页:Win10兼容安卓彻国行Moto X Force亮相工信Droid Turbo2国行版Mot攒了半年的钱终于从黄牛那买了一个苹果手机本来就该这样子 Nokia 23红米Note 3宣传声势浩大 周鸿祎要来了!国行Lumia 950系列发
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘