您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 市场营销 > 支持SMTP认证的发送E-mail程序的课程设计
发送E-MAIL程序的设计一、课程设计目的《网络应用与开发课程设计》是学完《网络应用与开发》课程之后,让学生综合运用网络高层协议的工作原理和WINSOCKAPI的网络编程接口及WINSOCKI/O模型知识,进行实际网络通信程序的设计、调测,以加深对WINSOCKAPI的网络编程接口及WINSOCKI/O模型知识的理解,提高综合应用应用层协议知识的能力、分析解决问题的能力和网络通信程序设计技能,初步培养设计实用网络通信程序的能力。二、课程设计任务掌握E-MAIL信件结构,掌握e-mail协议的会话过程,掌握支持SMTP认证的SMTP会话过程,理解BASE64编码的作用,并能用程序实现他们。1、课程设计题目及要求发送E-MAIL程序的设计⑴有发送e-mail的界面。⑵程序流程符合e-mail协议的会话过程。⑶实现BASE64编码,能发送附件,在ISP邮箱中能收到所发邮件。2、任务⑴学习网络应用与开发的基本理论,具备初步的独立设计能力。⑵学会查阅技术资料和手册。⑶掌握网络应用与开发的基本应用方法。⑷提高综合运用所学的理论知识独立分析和解决问题的能力。⑸撰写规范的课程设计报告,培养严谨的作风和科学的态度。三、设计方案1、RFC822信件的格式和内容电子邮件的主要部分是信件,电子邮件的各个方面几乎都是围绕它发展的。信件的内容是有ASCII码构成的一系列字符,就是通常所说的文本文件。文本的构成都有一定的格式和规范。无论使用SMTP或者是POP3,了解其信件的基本格式是非常重要的。对于POP3而言,从POP3接收的信件是没有经过整理的,有关信件的一些信息,如发送人、主题、时间、内容都包含在取回的文本中,而一个接收邮件的程序,不仅仅能够把信件从服务器上取回来,而且必须能够对取回来的内容进行分类整理,最终让用户所看到的是经过处理过的有条理的信件内容。这一点对于SMTP而言,同样很重要,发送的信件要使得对方接收的客户端软件收到信件时,能够识别信件所包含的信息。信件的格式不可以自己定义,许多程序要求对电子邮件进行编制特定的其他功能,以满足需要。和其他客户机/服务器的应用程序一样,指定规范的协议是必须的,根据协议编写的无论是发送还是接收e-mail的软件,彼此在进行邮件交流时不会存在障碍。以上所说的SMTP和POP3协议只不过InternetE-mail协议的一部分,它给出了与SMTP服务器或POP3服务器进行邮件对话的规范。在信件格式中也有协议。最早规范电子邮件核心结构的是RFC822,它是InternetE-mail信件的当前标准。RFC822定义了信件从主机传送到主机时需要的格式化方式。它的主要用途是为信件提供规范化的格式。这样使得不同类型的网络可以相互传送电子邮件。信件主要有三部分组成:信头:Date:Tue,04Dec200116:19:02+0800From:MDaemon@company.com.mailSubject:test.mailTo:wang@company.com.mail空白行信件体:111信件结构可以说分为两大部分:信头和信件体。空白行通常分离各个元素,以便于进行分析,在信件头和信件体之间有一个空白行,用于分隔信头和信件的其余部分。信头是必需的,信体是可选的,如果存在信体,空白行规是必需的,如果只有信头,空白行就是可选的。在信体中,通常也有空白行,起的作用也是一样的。这样设计的信件便于进行语法分析,提取信件的基本信息。2、支持SMTP认证的SMTP会话过程:[RFC2554]规范中定义了SMTP的认证过程,但RFC2554中没有定义具体的认证参数。SMTP的认证功能主要是增加了AUTH命令,AUTH命令有很多种用法,而且有很多中认证机制,AUTH支持的认证机制主要有LOGIN,CRAM-MD5等。LOGIN是大多数免费邮件服务器都支持的,如163、263与新浪都支持。而新浪还支持CRAM-MD5机制。认证机制一般只在真正发送邮件之前进行,而且只需要执行一次。当认证成功后,即可按原来正常的处理发送邮件。原理是口令-应答(Challenge-Response),即会话的过程是发送文本来完成的,过程为交互式的请求应答模式,每次会话服务器总是返回一定的响应码,表示客户端的请求是否被正确地应答,会话过程有一定的次序。由服务器发送命令要求客户端回答,客户端根据服务器发送信息进行回答,如果应答通过了,则认证成功,即可继续处理。下面对LOGIN机制作一个简单介绍。S:表示服务器返回,C:表示客户端发送,三位数字代码如334为服务器响应码。LOGIN口令-应答过程如下:1C:AUTHLOGIN2S:334dXNlcm5hbWU63C:bXlnOTQ=(假设邮箱名为”myg94”)4S:334cGFzc3dvcmQ65C:MzQ5OTA5Mg==(假设密码为”3499092”)6S:235Authenticationsuccessful.上述6个步骤的说明如下:1为客户端向服务器发送认证指令。2服务端返回base64编码串,成功的响应码为334。编码字符串解码后为“username:”,说明要求客户端发送用户名。3客户端发送用base64编码的用户名,此处为“myg94”。4服务端返回base64编码串,成功响应码为334。编码字符串解码后为“password:”,说明要求客户端发送用户口令。5客户端发送用base64编码的口令,此处为“3499092”。6成功后,服务端返回码为235,表示认证成功可以发送邮件了。在SMTP的[RFC821]中,在与邮件服务器连接成功后,第一个命令一般是“HELO”。但是在支持认证的邮件服务器中,第一个命令应改为“EHLO”。所以这时的SMTP会话过程应修改如下:1C:EHLO2S:2503C:AUTHLOGIN4S:334dXNlcm5hbWU65C:bXlnOTQ=(假设邮箱名为”myg94”)6S:334cGFzc3dvcmQ67C:MzQ5OTA5Mg==(假设密码为”3499092”)8S:235Authenticationsuccessful.9C:MAILFROM:netmao94@163.com10S:25011C:RCPTTO:MYG94@163.COM12S:25013C:DATA14S:35415C:QUIT16S:221S:表示服务器返回,C:表示客户端发送。3、一封e-mail从用户手中发出,首先要有一个程序把这封e-mail发到smtp服务器上,再由发送邮件服务器负责传递邮件到目的信箱,还要一个程序接收邮件。简单的说是由四个模块组成:发送端,smtp服务器,pop3服务器,接收端。⑴SMTP是工作在两种情况下:一是电子邮件从客户端传输到服务器,二是从某一个服务器传输到另一个服务器。⑵SMTP服务器是个请求/响应协议,命令和响应都是基于ASCII文本,并以CR和LF符结束。响应包括一个表示返回状态的三位数字代码。⑶SMTP在TCP协议25号端口监听连接请求。4、BASE64编码:按照RFC2045的定义,BASE64被定义为:BASE64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。要采用BASE64编码,这是因为在e-mail的传输过程中,由于历史原因,e-mail只被允许传送ASCII字符,即一个8位字节的低7位。因此,如果发送了一封带有非ASCII字符(即字节的最高位是1)的e-mail通过有“历史问题”的网关时就可能会出现问题。网关可能会把最高位置为0,而单靠改变你字母的位置之类的方案也不能解决这一问题,关于这一点可以参考RFC2046.基于以上的一些主要原因产生了BASE64编码,BASE64的编码方式类似于Unencode。编码过程中还需要注意,邮件信件内容的文本行应该控制在76个字符以内。所以编码时超过76个字符的需要插入crlf(回车换行),插入的crlf不需要经过编码,而原来的要编码的数据中可能有CR(0A)和LF(0D),则与其他字符一样需要编码,在译码时将碰到的crlf删除即可。四、算法或框图、关键代码(或配置清单)说明按照连接和发送的SMTP会话过程建立TCP连接是用visualbasic6.0中winsock控件实现的,程序流程如图所示.1、关键代码①BASE64编码DWORDCBase64Coder::_DecodeToBuffer(constTempBucket&Decode,PBYTEpBuffer){TempBucketData;DWORDnCount=0;_DecodeRaw(Data,Decode);for(inti=0;i3;i++){构造邮件连接SMTP服务器按照支持SMTP认证的SMTP会话会话过程发送命令发送EHLO命令发送AUTHLOGIN命令发送用户名发送密码发送MAILFROM命令发送RCPTTO命令发送DATA命令发送QUIT命令BASE64编码模块pBuffer[i]=Data.nData[i];if(pBuffer[i]!=255)nCount++;}returnnCount;}voidCBase64Coder::_EncodeToBuffer(constTempBucket&Decode,PBYTEpBuffer){TempBucketData;_EncodeRaw(Data,Decode);for(inti=0;i4;i++)pBuffer[i]=Base64Digits[Data.nData[i]];switch(Decode.nSize){case1:pBuffer[2]='=';case2:pBuffer[3]='=';}}voidCBase64Coder::_DecodeRaw(TempBucket&Data,constTempBucket&Decode){BYTEnTemp;Data.nData[0]=Decode.nData[0];Data.nData[0]=2;nTemp=Decode.nData[1];nTemp=4;nTemp&=0x03;Data.nData[0]|=nTemp;Data.nData[1]=Decode.nData[1];Data.nData[1]=4;nTemp=Decode.nData[2];nTemp=2;nTemp&=0x0F;Data.nData[1]|=nTemp;Data.nData[2]=Decode.nData[2];Data.nData[2]=6;nTemp=Decode.nData[3];nTemp&=0x3F;Data.nData[2]|=nTemp;//第4个6位=第三个8位的后6位}voidCBase64Coder::_EncodeRaw(TempBucket&Data,constTempBucket&Decode){BYTEnTemp;Data.nData[0]=Decode.nData[0];Data.nData[0]=2;Data.nData[1]=Decode.nData[0];Data.nData[1]=4;nTemp=Decode.nData[1];nTemp=4;Data.nData[1]|=nTemp;Data.nData[1]&=0x3F;Data.nData[2]=Decode.nData[1];Data.nData[2]=2;nTemp=Decode.nData[2];nTemp=6;Data.nData[2]|=nTemp;Data.nData[2]&=0x3F;Data.nData[3]=Decode.nData[2];Data.nData[3]&=0x3F;}BOOLCBase64Coder::_IsBadMimeChar(BYTEnData){switch(nData){case'\r':case'\n':case'\t':case'':case'\b':case'\a':case'\f':case'\v':returnTRUE;defa
本文标题:支持SMTP认证的发送E-mail程序的课程设计
链接地址:https://www.777doc.com/doc-5700003 .html