如何在VFP中实现邮件收发

如何在VFP中实现邮件收发,第1张

邮件发送测试

para  _cTo, _cSub,_cBody, _cur_fujian

Local cTo,cSub,cAtta,cBody,cSmtp,cFrom,cUid,cPwd,cErrMsg

cTo =   _cTo      &&"收件人"

cSub =  _cSub     &&""

cBody = _cBody    &&"测试发件"

cAtta = _cur_fujian

cSmtp = "smtp.163.com"

cFrom = "test<tesT@163.com>"

cUid = "NATION_DFXT" && 账号

cPwd = "*******" && 密码

cErrMsg = SendMail(cTo,"","",cSub,cBody,cAtta,cSmtp,cFrom,cUid,cPwd)

If EMPTY(cErrMsg)

Messagebox("邮件发送成功! ",64,"系统消息")

Else

Messagebox(cErrMsg,64,"发送邮件出错消息")

Endif

* 邮件发送函数

Function SendMail( &&参数列表

cMail,         && 收件人列表

cCC,           && 抄送收件人列表

cBCC,          && 密件抄送收件人列表

cSubject,      && 主题

cBody,         && 邮件内容

cAttachFile,   && 附件文件列表

cSmtp,         && SMTP服务器名或地址(必须)

cFrom,         && 发件人邮件地址(需验证发信的服务器需要)

cUid,          && 用户名(需验证发信的服务器需要)

cPwd)           && 口令(需验证发信的服务器需要)

* 参数错误判断

* ...............

* ...............

Local cError,cErrMsg,m,n,i,j,k,objFields

m.cErrMsg = ""

m.cError = ON("ERROR")

On ERROR m.cErrMsg = MESSAGE()

*服务器设置

m.objMail = CREATEOBJECT("CDO.Message")

* 清除原默认配置

m.objFields = m.objMail.Configuration.Fields

For i = 0 TO objFields.Count - 1

m.objFields.Delete(i)

Endfor

m.objFields.Update

* 设置发信服务配置

m.objConf = m.objMail.Configuration

m.objConf.Fields.Append("http://schemas.microsoft.com/cdo/configuration/languagecode",2)

m.objConf.Fields(0).value = "zh-cn"

m.objConf.Fields.Append("http://schemas.microsoft.com/cdo/configuration/postusing",2)

m.objConf.Fields(1).value = 0

m.objConf.Fields.Append("http://schemas.microsoft.com/cdo/configuration/sendemailaddress",2)

m.objConf.Fields(2).value = m.cFrom     &&发送邮件地址

m.objConf.Fields.Append("http://schemas.microsoft.com/cdo/configuration/sendpassword",2)

m.objConf.Fields(3).value = m.cPwd      &&发件口令

m.objConf.Fields.Append("http://schemas.microsoft.com/cdo/configuration/sendusername",2)

m.objConf.Fields(4).value = m.cUid      &&用户名

m.objConf.Fields.Append("http://schemas.microsoft.com/cdo/configuration/sendusing",2)

m.objConf.Fields(5).value = 2

m.objConf.Fields.Append("http://schemas.microsoft.com/cdo/configuration/smtpaccountname",2)

m.objConf.Fields(6).value = "网易服务器" &&Smtp名称

m.objConf.Fields.Append("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate",2)

m.objConf.Fields(7).value = 1

m.objConf.Fields.Append("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout",2)

m.objConf.Fields(8).value = 180

m.objConf.Fields.Append("http://schemas.microsoft.com/cdo/configuration/smtpserver",2)

m.objConf.Fields(9).value = m.cSmtp     &&SMTP服务器

m.objConf.Fields.Append("http://schemas.microsoft.com/cdo/configuration/smtpserverport",2)

m.objConf.Fields(10).value = 25

m.objConf.Fields.Append("http://schemas.microsoft.com/cdo/configuration/usemessageresponsetext",2)

m.objConf.Fields(11).value = .T.

m.objConf.Fields.Append("urn:schemas:calendar:timezoneid",2)

m.objConf.Fields(12).value = 21

m.objConf.Fields.Update

*邮件设置

*注:邮件地址和附件文件可以同时多个,在字符串中使用分号()分隔

m.objMail.To = m.cMail           &&收件人

m.objMail.CC = m.cCC             &&抄送

objMail.BCC = m.cBCC             &&密件抄送

m.objMail.Subject = m.cSubject   &&主题

m.objMail.TextBody = m.cBody     &&内容

objMail.From = m.cFrom           &&发件人(服务器要校验的)

*根据附件列表添加附件

If !EMPTY(m.cAttachFile)

m.cAttachFile = m.cAttachFile + ""

m.j = 0

m.n = OCCURS("", m.cAttachFile)

For m.i = 1 TO m.n

m.k = AT("", m.cAttachFile, m.i)

m.cFile = SUBSTR(m.cAttachFile, m.j+1, m.k-m.j-1)

If !FILE(m.cFile)

*!* MESSAGEBOX("附件文件["+m.cFile+"没找到! ",16,"出错消息")

On ERROR &cError

Return m.cErrMsg

Endif

objMail.AddAttachment(m.cFile)    &&添加附件

m.j = m.k

Endfor

Endif

*发送邮件

m.objMail.Send

On ERROR &cError

Return m.cErrMsg

Endfunc

***********************************************************************

使用时用

sendmail('<收件地址>' , '标题', '内容' , 附件路径)

使用VB收发电子邮件

一、准备工作

在VB中编写电子邮件程序需要通过调用微软公司的MAPI(Messaging Application Programming Interface,消息应用程序编程接口),这需要借助两个实现电子邮件收发功能的核心控件:MAPI会话控件和MAPI消息控件。MAPI会话控件用于建立和控制一个Microsoft Mail会话,MAPI消息控件用于创建和收发邮件消息。此外,Windows系统中必须要有遵从MAPI的邮件系统,比如Exchange、Outlook等软件,而还要进行一番设置,确保邮件系统可以正常使用。

MAPI控件在哪里找呢?

在VB中就有现成的,不过程序没有直接放置在工具箱里,需要我们自己将MAPI控件加入VB工具箱。首先直接在VB左边的控件栏中右击鼠标,并在d出菜单中选择“部件”命令,这时可以激活部件设置窗口,在其中的“控件”列表框中选取“Microsoft MAPI Controls”一项(如图1所示),接着按下“确定”按钮之后可以发现工具箱中将多出了两个图标,这就是MAPI会话控件和MAPI消息控件的图标(如图2所示)。

二、邮件发送程序

添加好我们所需要的控件之后,就开始定制邮件的发送程序吧。这个邮件发送程序的基本处理过程是:根据用户输入信息组成邮件,然后使用MAPI消息控件的Send方法将邮件发出。具体的方法按照下述步骤完成:

1、新建一个VB项目,并将缺省窗体Form1的Caption属性设置为“发送邮件”。

2、在Form1中加入一个MAPI会话控件MAPISession1和一个MAPI消息控件MAPIMessages1。

3、在Form1中加入三个TextBox控件,将它们的名称属性分别设置为“txtSendTo”、“txtSubject”和“txtMessage”,另外还要将txtMessage的Multiline属性设置为“True”。这三个TextBox控件将分别用于填写邮件的收件人地址、邮件主题和邮件正文。

4、在Form1中加入三个Label控件,将它们的Caption属性分别设置为“收件人”、“主题”和“内容”,并将它们放在合适的位置用以标注相应的TextBox控件。

5、在Form1中加入一个Command Button控件,将其Caption属性和名称属性分别设置为“发送”和“Send”。

所有的控件添加完毕之后应该如图3所示。

下面是代码部分的内容:

1、将下列代码加入Form1的Form_Load事件:

Private Sub Form_Load()

MAPISession1.SignOn /运行程序之后进行邮箱登录 *** 作

End Sub

2、将下列代码加入Form1的Form_Unload事件:

Private Sub Form_Unload(Cancel As Integer)

MAPISession1.SignOff /退出程序时候进行退出邮箱 *** 作

End Sub

3、将下列代码加入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

这样一个电子邮件发送部分就制作完成了,运行程序之后只要填写好邮件的收件人、主题和内容后,按下“发送”命令按钮,邮件就已经成功地发往目的地了(如图4所示)。

三、邮件接收程序

邮件接收程序比邮件发送程序要复杂一些,这个程序首先需要使用MAPI消息控件的Fetch方法读取邮件,这个过程将把用户收件箱中所有未读邮件全部装入MAPI消息控件中。接着,检查MAPI消息控件的MsgCount属性以确定通过Fetch方法读取的邮件的总数,然后可以通过设置MAPI消息控件的MsgIndex属性来指定具体需要处理哪一封邮件。需要说明的是,MsgIndex属性值的计数是从0开始的,也就是说,第一封邮件的索引号是0,第二封邮件的索引号是1,依次类推。具体步骤如下:

1、新建一个VB项目,将缺省窗体Form1的Caption属性设置为“接收邮件”。

2、在Form1中加入一个MAPI会话控件MAPISession1和一个MAPI消息控件MAPIMessages1。

3、在Form1中加入三个Label控件和一个TextBox控件,将三个标签控件的名称属性分别设置为“lblMsgDateReceived”、“lblMsgOrigDisplayName”和“lblMsgSubject”,将TextBox控件的名称属性设置为“txtMsgNoteText”,并将标签控件的Caption属性和文本框控件的Text属性的内容清空。这四个控件将分别用于显示邮件的日期、发件人、主题和内容。

4、将txtMsgNoteText控件的Locked属性和Multiline属性设置为“True”,ScrollBars属性设置为“2-Vertical”。

5、在Form1中再加入四个Label控件用于标注上述四个控件,将它们的Caption属性分别设置为“日期”、“发件人”、“主题”和“内容”。

6、在Form1中加入一个Label控件,将其名称属性设置为“lblMsgCount”,Caption属性设置为“第 0 封邮件,总计 0 封邮件”。这个控件用于显示接收的邮件总数以及当前正在处理第几封邮件。

7、在Form1中加入三个Command Button控件,将它们的名称属性分别设置为“cmdPrevious”、“cmdNext”和“cmdClose”,Caption属性分别设置为“上一封”、“下一封”和“关闭”。

所有的控件添加完毕之后应该如图5所示。

小蘑菇:那么具体的程序代码呢?

小叮当:又着急了不是?我还会骗你吗?下面就是具体的程序代码:

1、编写一个子程序FetchNewMail:

Public Sub FetchNewMail()

MAPIMessages1.FetchUnreadOnly = True

MAPIMessages1.Fetch /Fetch命令将信件抓到系统存贮器的inbuffer中

End Sub

2、编写一个子程序DisplayMessage:

Public Sub DisplayMessage()

lblMsgCount.Caption = "第 " &Ltrim(Str(MAPIMessages1.MsgIndex + 1)) &" 封邮件,总计 " & Ltrim(Str(MAPIMessages1.MsgCount)) &" 封邮件"/由MsgCount知道信件数量,再用MsgIndex设置要看 哪一封信件的内容、标题

lblMsgDateReceived.Caption = MAPIMessages1.MsgDateReceived /收取信件的日期

txtMsgNoteText.Text = MAPIMessages1.MsgNoteText/收取信件的内容

lblMsgOrigDisplayName.Caption = MAPIMessages1.MsgOrigDisplayName /发送邮件的姓名

lblMsgSubject.Caption = MAPIMessages1.MsgSubject /邮件主题

End Sub

3、将下列代码加入Form1的Form_Load事件:

Private Sub Form_Load()

MAPISession1.SignOn

MAPIMessages1.SessionID = MAPISession1.SessionID

FetchNewMail/调用Fetch子程序

DisplayMessage/调用DisPlayMessage子程序

End Sub

4、将下列代码加入cmdPrevious的Click事件:

Private Sub cmdPrevious()

If MAPIMessages1.MsgIndex >0 Then

MAPIMessages1.MsgIndex = MAPIMessages1.MsgIndex - 1 /当收取信件超过1封的时候,通过“上一封”按钮查看前面的信件

DisplayMessage

Else

Beep

End If

End Sub

5、将下列代码加入cmdNext的Click事件:

Private Sub cmdNext_Click()

If MAPIMessages1.MsgIndex <MAPIMessages1.MsgCount - 1 Then

MAPIMessages1.MsgIndex = MAPIMessages1.MsgIndex + 1 /当收取信件超过1封的时候,通过“下一封”按钮查看后面的信件

DisplayMessage

Else

Beep

End If

End Sub

15、将下列代码加入cmdClose的Click事件:

Private Sub cmdClose_Click()

Unload Me

End Sub

程序运行后如图6所示。在窗体加载过程中,窗体Load事件中的代码会读取新邮件,如果有新邮件,就显示第一个新邮件,如果有多个新邮件,则可以使用“上一封”和“下一封”命令按钮前后翻阅。

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

在填写完邮件的收件人、主题和内容后,按"发送"命令按钮,如果没有出现运行时错误提示,那么就表明邮件已经成功地发往目的地了,否则,请检查填写的收件人地址是否准确无误以及系统中运行的消息系统工作是否正常。

邮件接收程序

邮件接收程序比邮件发送程序稍微复杂一些。首先需要使用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

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


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12035511.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-20
下一篇2023-05-20

发表评论

登录后才能评论

评论列表(0条)

    保存