首页 vc编写电子邮件程序

vc编写电子邮件程序

举报
开通vip

vc编写电子邮件程序VC++编写电子邮件程序时间:2008-08-27作者:佚名编辑:本站点击:635[评论]VC++编写电子邮件程序一、概述----本文主要讲述如何使用VisualC++用MAPI编写E-mail程序。MAPI是包含在Windows之中的,因此不需要安装其他额外的部件。MAPI有以下三种形式:SMAPI,SimpleMAPI,简单的MAPICMC,CommonMessagingCalls,一般通讯调用完整的MAPI----SMAPI和CMC都包含在完整的MAPI中,当用户想执行一些高级操作,比如编写自己的E-mail...

vc编写电子邮件程序
VC++编写电子邮件程序时间:2008-08-27作者:佚名编辑:本站点击:635[评论]VC++编写电子邮件程序一、概述----本文主要讲述如何使用VisualC++用MAPI编写E-mail程序。MAPI是包含在Windows之中的,因此不需要安装其他额外的部件。MAPI有以下三种形式:SMAPI,SimpleMAPI,简单的MAPICMC,CommonMessagingCalls,一般通讯调用完整的MAPI----SMAPI和CMC都包含在完整的MAPI中,当用户想执行一些高级操作,比如编写自己的E-mail服务器的时候,必须使用完整的MAPI。本文主要阐述如何编写能够收发电子邮件的程序,因此使用SMAPI就足够了。二、编写电子邮件程序3-1初始化MAPI----要使用MAPI,必须首先对它进行初始化。初始化包括以下三个步骤:装载MAPI32.DLL动态链接库找到想要调用的MAPI函数地址登录到电子邮件对象3-1-1装载MAPI32.DLL---- 要装载MAPI,用户必须程序运行时动态的装载一个动态链接库。LoadLibrary函数提供了此功能,它定位一个动态链接库,并返回HINSTANCE局柄(需要保存该句柄)。LoadLibrary的语法如下:LoadLibrary(lpLib);其中lpLib为LPCTSTR结构变量,是所要调用的库的路径和名称。程序示例://调用MAPI32.DLL并计算函数地址HINSTANCEhInstMail;hInstMail = ::LoadLibrary( “MAPI32.DLL”);if (hInstMail==NULL){//错误处理//受篇幅限制,下面的错误处理部分省略}3-1-2确定函数地址----由于MAPI32.DLL是被动态装载的,因此不知道所要调用的函数地址,也就不能一开始就调用它们,而要通过函数名获得函数的地址,并在动态链接库中查找每一个函数并核实。因此首先必须为这些函数声明指针程序示例:// 为MAPI32.DLL中的函数声明函数指针ULONG (PASCAL *lpfnMAPISendMail)(LHANDLElhSession,ULONGulUIParam,lpMapiMessagelpMessage,FLAGSflFlags,ULONGulReserved);ULONG (PASCAL*lpfnMAPIResolveName) (LHANDLElhSession,ULONG ulUIParam,LPTSTRlpszName,FLAGS ulFlags,ULONGulReserved,lpMapiRecipDescFAR*lppRecip);ULONG (FARPASCAL*lpfnMAPILogon)(ULONGulUIParam,LPSTRlpszPro,LPSTR lpszPassword,FLAGSflFlags, ULONG ulReserved,LPLHANDLElplhSession);ULONG(FAR PASCAL *lpfnMAPILogoff)(LHANDLE lhSession,ULONG ulUIParam,FLAGSflFlags,ULONGulReserved);ULONG(FARPASCAL*lpfnMAPIFreeBuffer)(LPVOID lpBuffer);ULONG(FARPASCAL*lpfnMAPIAddress)(LHANDLElhSession,ULONGulUIParam,LPSTR lpszCaption,ULONGnEditFields,LPSTR lpszLabels,ULONGnRecips, lpMapiRecipDesclpRecips,FLAGSflFlags,ULONGulReserved,LPULONGlpnNewRecips,lpMapiRecipDescFAR *lppNewRecips);ULONG(FARPASCAL*lpfnMAPIFindNext)(LHANDLElhSession,ULONGulUIParam,LPSTRlpszMessageType,LPSTRlpszSeedMessageID, FLAGSflFlags,ULONGulReserved,LPSTR lpszMessageID);ULONG (FARPASCAL*lpfnMAPIReadMail)(LHANDLElhSession,ULONGulUIParam,LPSTR lpszMessageID,FLAGS flFlags,ULONGulReserved,lpMapiMessageFAR*lppMessage);----为了决定每一个函数的地址,必须为每一个函数调用GetProcAddress。GetProcAddress的语法为:GetProcAddress(hModule,lpProcName);其中,hModule为HMODULE结构,是所调用DLL模块的句柄;lpProcName为LPCSTR结构,是函数名称。程序示例://找到MAPI32.DLL函数的地址,并将它们保存在函数指针变量里(FARPROC&) lpfnMAPISendMail =GetProcAddress(hInstMail,“MAPISendMail”);(FARPROC&)lpfnMAPIResolveName=GetProcAddress(hInstMail,“MAPIResolveName”);(FARPROC&)lpfnMAPILogon=GetProcAddress(hInstMail,“MAPILogon”);(FARPROC&)lpfnMAPILogoff = GetProcAddress(hInstMail,“MAPILogoff”);(FARPROC&)lpfnMAPIFreeBuffer=GetProcAddress(hInstMail,“MAPIFreeBuffer”);(FARPROC&)lpfnMAPIAddress=GetProcAddress(hInstMail,“MAPIAddress”);(FARPROC&)lpfnMAPIFindNext= GetProcAddress(hInstMail,“MAPIFindNext”);(FARPROC&)lpfnMAPIReadMail=GetProcAddress(hInstMail,“MAPIReadMail”);3-1-3 登录到电子邮件对象---- 用户必须在电子邮件系统中登录,才能实现MAPI的各种功能。MAPI提供了登录的三种选择:登录到一个已经存在的对象。登录到一个新对象,用编程的方法确定解释新信息。使用对话框提示用户登录。----我们通常选择登录到一个已经存在的电子邮件对象,因为网络合作用户通常会保持自己的电子邮件程序处于激活状态。登录通常使用MAPI提供的函数lpfnMAPILogon。lpfnMAPILogon的语法为:lpfnMAPILogon(lpszPro,lpszPassword,flFlags,ulReserved, lplhSession);----其中,lpszPro指向一个256字符以内的登录名称,lpszPassword指向密码,它们均为LPTSTR结构。flFlags为FLAGS结构,其值详见 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 1。ulReserved必须为0。lplhSession为输出SMAPI的句柄。表1:lpfnMAPILogon函数中flFlags的值值 意义MAPI_FORCE_DOWNLOAD在函数调用返回之前下载用户的所有邮件。如果MAPI_FORCE_DOWNLOAD没有被设置,那么信件能够在函数调用返回后在后台被下载。MAPI_NEW_SESSION建立一个新会话,而不是获得环境的共享会话。如果MAPI_NEW_SESSION没有被设置,MAPILogon使用现有的共享会话。MAPI_LOGON_UI显示一个登录对话框来提示用户输入登录信息。例如Outlook检查用户电子邮件时便是如此。MAPI_PASSWORD_UIMAPILogon只允许用户输入电子邮件的密码,而不许改动账号。程序示例:LHANDLE lhSession;ULONGlResult=lpfnMAPILogon(0,NULL,NULL,0,0,&lhSession);if(lResult!=SUCCESS_SUCCESS)//SUCCESS_SUCCESS在MAPI.H中被定义{//错误处理}3-2阅读电子邮件----MAPIFindNext和MAPIReadMail使用与阅读E-mail的两个基本函数。MAPIFindNext用于定位第一封或下一封电子邮件并返回标识号,MAPIReadMail返回以该标识号为基础的电子邮件的 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 。另外,一个常用的函数是MAPIFreeBuffer,用于释放内存。3-2-1 定位到第一封信----要找到第一封信,需要使用MAPIFindNext函数,其函数声明如下:ULONGFARPASCALMAPIFindNext(LHANDLE lhSession,ULONGulUIParam,LPTSTRlpszMessageType,LPTSTRlpszSeedMessageID,FLAGSflFlags,ULONGulReserved,LPTSTRlpszMessageID )----其中,lhSession为提交SMAPI的会话句柄 ;ulUIParam为父窗体的句柄;lpszMessageType指向一个字符串,用来鉴别邮件类型,并加以查找;lpszSeedMessageID为指向起始信息ID的指针,其值为0时,MAPIFindNext获得第一封电子邮件;flFlags的值见表2;ulReserved必须为0;lpszMessageID为输出值,它是指向信息ID地址的指针。----表2:MAPIFindNext函数中flFlags的值值意义MAPI_GUARANTEE_FIFO 按邮件发送的时间顺序接受电子邮件。MAPI_LONG_MSGID返回信件标识符可达512字符。MAPI_UNREAD_ONLY只列举没有阅读过的电子邮件。程序示例://找到第一条没有阅读的电子邮件charpMessageID[513];ULONG lResult = lpfnMAPIFindNext(lhSession,NULL,NULL,NULL,MAPI_LONG_MSGID|MAPI_UNREAD_ONLY,0,pMessageID);3-2-2 阅读信息当信件ID被获取后,就可以调用MAPIReadMail阅读实际的E-mail信息了。MAPIReadMail的函数声明如下:ULONGFARPASCALMAPIReadMail(LHANDLE lhSession,ULONGulUIParam, LPTSTRlpszMessageID,FLAGSflFlags, ULONGulReserved,lpMapiMessageFAR *lppMessage);其中,lppMessage为指向MapiMessage的指针;除flFlags外的其他参数与lpfnFindNext函数的同名参数意义相同,flFlags参数的值见表3:表3:MAPIReadMail函数中flFlags的值:值意义MAPI_BODY_AS_FILE将邮件信息写到一个临时文件中,并且将它作为第一个附件添加到附件列表中。MAPI_ENVELOPE_ONLY 只读取邮件标题。MAPI_PEEK 读完邮件之后不把它标记为“已读”。MAPI_SUPPRESS_ATTACHMAPIReadMail函数不拷贝附件,但是将邮件文本写入MapiMessage结构中。程序示例://读取电子邮件long nFlags=MAPI_SUPPRESS_ATTACH;if(!bMarkAsRead)nFlags= nFlags|MAPI_PEEK;lResult =lpfnMAPIReadMail(lhSession,NULL,pMessageID,nFlags, 0,&pMessage);if(lResult !=SUCCESS_SUCCESS);return false;如果调用成功,就可以访问MapiMessage结构了(使用pMessage):pMessage->ulReserved:0pMessage->lpszSubject:邮件标题pMessage->lpszNoteText:邮件信息pMessage->lpszMessageType:邮件类型pMessage->DateReceived:接收时间pMessage->lpszConversationID:邮件所属的会话线程IDpMessage- >flFlags:其值见表4表4:MapiMessage结构中的flFlags值意义MAPI_RECEIPT_REQUESTED接收 通知 关于发布提成方案的通知关于xx通知关于成立公司筹建组的通知关于红头文件的使用公开通知关于计发全勤奖的通知 被申请。客户端应用程序在发送消息时设置该项。MAPI_SENT 邮件已被发送。MAPI_UNREAD邮件是“未读”状态。pMessage->lpOriginator:指向MapiRecipDesc结构,包含发件人信息。pMessage->nRecipCount:信件者数目。pMessage- >lpRecips:指向MapiRecipDesc结构数组,包含接收者信息。pMessage->n:附件数量。pMessage->lpFiles:指向Mapi结构数组,每一个结构包含一个文件附件。3-2-3释放内存---- 在访问另一条信件以前应当释放内存,否则会出现内存泄漏。程序示例://释放内存lpfnMAPIFreeBuffer(pMessage);3-2-4 定位到下一条信件定位到下一条信件依然使用MAPIFindNext函数,该函数声明及参数意义详见3-2-1节。下面示范如何定位到下一条信件。程序示例://定位到下一条没有阅读的信件ULONGlResult=lpfnMAPIFindNext(lhSession,NULL, NULL,pMessageID, MAPI_LONG_MSGID|MAPI_UNREAD_ONLY,0,pMessageID);3-3发送电子邮件----发送电子邮件的一般步骤:----1.建立MapiMessage结构对象----2.调用MAPIResolveName使发送者名称合法----3.添加附件----4.调用MAPISendMail发送电子邮件----5.调用MAPIFreeBuffer释放内存---- 下面详细分别详细阐述。3-3-1建立MapiMessage结构对象----对于MapiMessage结构,3-2-2节已经做过介绍,下面一步步介绍如何设置其中的值:----1.为MapiMessage对象分配内存:MapiMessagemessage;Memset(&message,0,sizeof(message));----2.将ulReserved设置为0:message.ulReserved =0;----3.设置信息类型指针lpszMessageType,可以为NULL:message.lpszMessageType =NULL;---- 4.设置信件标题(lpszSubject):charsubject[512];strcpy(subject,sSubject);message.lpszSubject=subject;---- 5.设置信件内容:char text[5000];strcpy(text,sMessage);message.lpszNoteText =text;---- 6.设置flFlags标识,详见3-2-2节中表4:message.flFlags= MAPI_SENT;----7.用一个指向MapiRecipDesc结构的指针设置发送者信息(lpOriginator),或将其设置为NULL:message.lpOriginator=N文章出处:DIY部落()++ SMTP协议电子邮件传送剖析2002-11-19 18:05作者:信息产业部电子第二十二研究所青出处:yesky责任编辑:方舟ﻫ摘要:本文介绍了一种采用SMTP协议规范并通过直接使用SMTP协议命令而在程序中实现电子邮件传送的方法。并在VC++开发环境下给出了部分关键的实现代码。  前言ﻫﻫ 电子邮件服务作为Internet上应用最多和最广的服务项目得到了非常广泛的应用,在网络应用中也起到非常重要的作用。如同其他的网络服务,电子邮件系统也有其使用的传输协议,包括SMTP(SimpleMailTransferProtocol,简单邮件传输协议)、POP(PostOffice Protocol,邮局协议)和IMAP(InternetMessage AccessProtocal,消息访问协议)等,这些协议应用于电子邮件的发送和接收。一些邮件处理软件如OutLook Express和FoxMail等就是按照SMTP和POP3协议结合WindowsSockets套接字进行 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 来收发邮件的。本文以SMTP协议为研究对象,在VisualC++6.0编程环境下按照SMTP协议通过套接字发送SMTP命令,接收并处理邮件服务器的反馈信息,从而实现对电子邮件的发送。ﻫSMTP协议的通讯模型和会话流程 SMTP协议通讯模型ﻫﻫ SMTP协议是TCP/IP协议族中的一员,主要对如何将电子邮件从发送方地址传送到接收方地址,也即是对传输的规则做了规定。SMTP协议的通信模型并不复杂,主要工作集中在发送SMTP和接收SMTP上:首先针对用户发出的邮件请求,由发送SMTP建立一条连接到接收SMTP的双工通讯链路,这里的接收SMTP是相对于发送SMTP而言的,实际上它既可以是最终的接收者也可以是中间传送者。发送SMTP负责向接收SMTP发送SMTP命令,而接收SMTP则负责接收并反馈应答。可大致用下面的通讯模型示意图来表示:ﻫ SMTP协议的命令和应答从前面的通讯模型可以看出SMTP协议在发送SMTP和接收SMTP之间的会话是靠发送SMTP的SMTP命令和接收SMTP反馈的应答来完成的。在通讯链路建立后,发送SMTP发送MAIL命令指令邮件发送者,若接收SMTP此时可以接收邮件则作出OK的应答,然后发送SMTP继续发出RCPT命令以确认邮件是否收到,如果接收到就作出OK的应答,否则就发出拒绝接收应答,但这并不会对整个邮件操作造成影响。双方如此反复多次,直至邮件处理完毕。SMTP协议共包含10个SMTP命令,列表如下:SMTP命令命令说明HELLO<domain><CRLF>识别发送方到接收SMTP的一个HELLO命令MAIL FROM:<CRLF> <reverse-path>为发送者地址。此命令告诉接收方一个新邮件发送的开始,并对所有的状态和缓冲区进行初始化。此命令开始一个邮件传输处理,最终完成将邮件数据传送到一个或多个邮箱中。RCPTTO:<forward-path><CRLF><forward-path>标识各个邮件接收者的地址DATA <CRLF> ﻫ接收SMTP将把其后的行为看作邮件数据去处理,以<CRLF>.<CRLF>标识数据的结尾。REST 退出/复位当前的邮件传输NOOP要求接收SMTP仅做OK应答。(用于测试)QUIT<CRLF>要求接收SMTP返回一个OK应答并关闭传输。VRFY <string> 验证指定的邮箱是否存在,由于安全因素,服务器多禁止此命令。EXPN <CRLF>验证给定的邮箱列表是否存在,扩充邮箱列表,也常禁止使用。HELP查询服务器支持什么命令ﻫ注:<CRLF>为回车、换行,ASCII码分别为13、10(十进制)。  SMTP协议的每一个命令都会返回一个应答码,应答码的每一个数字都是有特定含义的,如第一位数字为2时表示命令成功;为5表失败;3表没有完成。一些较复杂的邮件程序利用该特点,首先检查应答码的首数字,并根据其值来决定下一步的动作。下面将SMTP的应答码列表如下:应答码说明501 参数格式错误502命令不可实现503错误的命令序列504命令参数不可实现211 系统状态或系统帮助响应214帮助信息220<domain>服务就绪221 <domain>服务关闭421 <domain>服务未就绪,关闭传输信道250要求的邮件操作完成251用户非本地,将转发向<forward-path>450要求的邮件操作未完成,邮箱不可用550要求的邮件操作未完成,邮箱不可用451放弃要求的操作;处理过程中出错551 用户非本地,请尝试<forward-path>452 系统存储不足,要求的操作未执行552过量的存储分配,要求的操作未执行553邮箱名不可用,要求的操作未执行354 开始邮件输入,以"."结束554操作失败VC++SMTP协议电子邮件传送剖析2002-11-1918:05作者:信息产业部电子第二十二研究所青出处:yesky责任编辑:方舟 在应用程序中使用SMTP协议ﻫ SMTP协议的会话流程在进行程序设计之前有必要弄清SMTP协议的会话流程,其实前面介绍的内容已经可以大致勾勒出用SMTP发送邮件的框架了,对于一次普通的邮件发送,其过程大致为:先建立TCP连接,随后客户端发出HELLO命令以标识发件人自己的身份,并继续由客户端发送MAIL命令,如服务器应答为"OK",可继续发送RCPT命令来标识电子邮件的收件人,在这里可以有多个RCPT行,而服务器端则表示是否愿意为收件人接受该邮件。在双方协商结束后,用命令DATA将邮件发送出去,其中对表示结束的"."也一并发送出去。随后结束本次发送过程,以QUIT命令退出。下面通过一个实例,@sina.com来更详细直观地描述此会话流程:R:220sina.comSimpleMail TransferServiceReadyS:HELLO sohu.comR:250sina.comS:MAIL FROM:<>R:250OKS:RCPTTO:<>ﻫR:250 OKﻫS:DATAR:354 Start mail input;endwith "<CRLF>.<CRLF>"ﻫS:……ﻫR:250 OKS:QUITR:221sina.comServiceclosingtransmissionchannel 邮件的格式化 由于电子邮件结构上的特殊性,在传输时是不能当作简单的文本来直接处理的,而必须按照一定的格式对邮件头和邮件体进行格式化处理之后才可以被发送。需要进行格式化的部分主要有:发件人地址、收件人地址、主题和发送日期等。在RFC文档的RFC822里对邮件的格式化有详尽的说明,有关详情请参阅该文档。下面通过VC++6.0按照RFC822文档规定将格式化邮件的部分编写如下(部分代码)://邮件头准备ﻫstrTemp=_T( "From:" )+ m_strFrom;发件人地址add_header_line((LPCTSTR)strTemp);strTemp= _T("To:")+m_strTo;收件人地址ﻫadd_header_line((LPCTSTR)strTemp);m_tDateTime =m_tDateTime.GetCurrentTime();//发送时间ﻫstrTemp=_T("Data:");ﻫstrTemp+= m_tDateTime.Format( "%a,%d%b%y%H:%M:%S %Z" );add_header_line( (LPCTSTR)strTemp);ﻫstrTemp=_T( "Subject:" )+ m_strSubject;主题add_header_line((LPCTSTR)strTemp);邮件头结束ﻫm_strHeader+= _T("\r\n" );邮件体准备if(m_strBody.Right(2)!=_T("\r\n"))确认最后以回车换行结束ﻫm_strBody+=_T("\r\n");   其中add_header_line(LPCTSTRszHeaderLine)函数用于把szHeaderLine指向的字串追加到m_strHeader后面。其中,格式化后的邮件头保存在m_strHeader里,格式化后的邮件体保存在m_strBody中。ﻫ 由Socket套接字为SMTP提供网络通讯基础ﻫ许多网络程序都是采用Socket套接字实现的,对于一些 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 的网络协议如HTTP、等协议的编程也是基于套接字程序的,只是端口号不再是随意设定而要由协议来指定,比如HTTP端口在80、,而SMTP则是25。Socket只是提供在指定的端口上同指定的服务器从事网络上的通讯能力,至于客户和服务器之间是如何通讯的则由网络协议来规定,这对于套接字是完全透明的。因此可以使用Socket套接字为程序提供网络通讯的能力,而对于网络通讯连路建立好之后采取什么样的通讯应答则要按SMTP协议的规定去执行了。Socket套接字网络编程方面的文章资料非常丰富,限于本文篇幅,在此不再赘述,有关详情请参阅相关文档。为简便起见,没有采用编写较复杂的WindowsSocketsAPI进行编程,而是使用经过较好封装的MFC的CSocket类。在正式使用套接字之前,也要先用AfxSocketInit()函数对套接字进行初始化,然后用Create()创建套接字对象,并由该套接字通过Connect()建立同邮件服务器的连接。如果一切正常,再后续的工作中就是遵循SMTP协议的约定来使用Send()、Receive()函数来发送SMTP命令和接收邮件服务器发来的应答码以完成对邮件的传送。SMTP会话应答的实现ﻫﻫ在同邮件服务器建立好链路连接后就可以按前面介绍过的会话流程进行程序设计了,对于SMTP命令的发送,可按命令格式将其组帧完毕后用CSocket类的Send()函数将其发送到服务器,并通过CSocket类的Receive()函数接收从邮件服务器发来的应答码,并根据SMTP协议的应答码表对其做出响应的处理。下面是用于接收应答码的函数get_response()的部分实现代码:BOOLCSMTP::get_response(UINTresponse_expected )//输入参数为希望的应答码{ﻫ……//m_wsSMTPServer为CSocket的类对象,调用Receive()将应答码接收到缓存//response_buf中m_wsSMTPServer.Receive( response_buf, RESPONSE_BUFFER_SIZE )sResponse=response_buf;sscanf((LPCTSTR)sResponse.Left(3 ), _T( "%d"),&response);pResp=&response_table[ response_expected];检验收到的应答码是否是所希望得到的if( response!=pResp->nResponse)ﻫ{ﻫ……//不相等的话进行错误处理returnFALSE;}returnTRUE;ﻫ} 会话的各个部分比较类似,都是命令--应答方式,而且均成对出现,下面是本文的重点也是实现的关键部分--在程序控制下完成对SMTP命令的格式化以及对命令的发送和对邮件服务器应答码的检验处理://格式化并发送HELLO命令,并接收、验证服务器应答码ﻫgethostname( local_host,80 );ﻫsHello.Format(_T("HELO%s\r\n"), local_host);ﻫm_wsSMTPServer.Send( (LPCTSTR)sHello,sHello.GetLength());ﻫif(!get_response(GENERIC_SUCCESS))检验应答码是否为250ﻫ{ﻫ……ﻫreturnFALSE;}ﻫ格式化并发送MAIL命令,并接收、验证服务器应答码sFrom.Format(_T("MAILFrom:<%s>\r\n"),(LPCTSTR)msg->m_strFrom);ﻫm_wsSMTPServer.Send( (LPCTSTR)sFrom,sFrom.GetLength());ﻫif(!get_response(GENERIC_SUCCESS))检验应答码是否为250ﻫreturnFALSE;ﻫ格式化并发送RCPT命令,并接收、验证服务器应答码ﻫsEmail=(LPCTSTR)msg->m_strTo;ﻫsTo.Format(_T("RCPTTO: <%s>\r\n"), (LPCTSTR)sEmail);m_wsSMTPServer.Send((LPCTSTR)sTo,sTo.GetLength());if(!get_response( GENERIC_SUCCESS )) 检验应答码是否为250returnFALSE;ﻫ格式化并发送DATA命令,并接收、验证服务器应答码sTemp=_T("DATA\r\n");m_wsSMTPServer.Send((LPCTSTR)sTemp, sTemp.GetLength());if( !get_response(DATA_SUCCESS ))检验应答码是否为354return FALSE;ﻫ发送根据RFC822文档规定格式化过的邮件头m_wsSMTPServer.Send((LPCTSTR)msg->m_strHeader, msg->m_strHeader.GetLength());ﻫ……ﻫ发送根据RFC822文档规定格式化过的邮件体sTemp = msg->m_strBody;if( sTemp.Left(3)==_T( ".\r\n"))ﻫsTemp=_T( ".")+sTemp;ﻫwhile((nPos =sTemp.Find(szBad))>-1 )ﻫ{sCooked=sTemp.Mid(nStart,nPos);sCooked+= szGood;ﻫsTemp=sCooked+sTemp.Right(sTemp.GetLength()- (nPos +nBadLength));}m_wsSMTPServer.Send((LPCTSTR)sTemp,sTemp.GetLength());发送内容数据结束标志"<CRLF>.",并检验返回应答码sTemp=_T("\r\n.\r\n" );ﻫm_wsSMTPServer.Send((LPCTSTR)sTemp, sTemp.GetLength() );if(!get_response( GENERIC_SUCCESS) )//检验应答码是否为250returnFALSE; 到此为止,已基本在程序中体现出了SMTP协议的会话流程,能在Socket套接字所提供的网络通讯能力基础之上实现以SMTP命令和SMTP应答码为基本会话内容的通讯交互过程,从而最终实现SMTP协议对电子邮件的发送。ﻫﻫ 结论ﻫﻫ  电子邮件类软件作为Internet上的应用软件,其设计开发必须符合Internet上成熟的技术规范(如RFC文档系列规范)和相关协议(如POP、SMTP、IMAP以及LDAP等)。只有在遵循了上述规范和协议的基础上进行编程才能真正实现邮件类软件产品和服务的开放性和标准化。本文着重对SMTP协议及其在VC++编程中的应用做了介绍,并按照SMTP协议对电子邮件的发送进行了开放性和标准性较好的程序设计。本文所述程序在Windows98下,由MicrosoftVisual C++ 6.0编译通过。
本文档为【vc编写电子邮件程序】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
洛衣含
暂无简介~
格式:doc
大小:75KB
软件:Word
页数:0
分类:生产制造
上传时间:2021-03-04
浏览量:0