简单邮件传输协议SMTP.doc_第1页
简单邮件传输协议SMTP.doc_第2页
简单邮件传输协议SMTP.doc_第3页
简单邮件传输协议SMTP.doc_第4页
简单邮件传输协议SMTP.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

简单邮件传输协议SMTPSMTP是因特网电子邮件系统重要的应用层协议。它使用由TCP提供的可靠的数据传输服务把邮件消息从发信人邮箱所在邮件服务器传送到收信人邮箱所在邮件服务器。SMTP是客户-服务器应用模式,由发信人的邮件服务器执行的客户端和收信人的邮件服务器执行的服务器端组成。SMTP的客户端和服务器端同时运行在每个邮件服务器上。当一个邮件服务器向其它邮件服务器发送邮件消息时,它是作为SMTP客户端。当一个邮件服务器从其它邮件服务器接收邮件消息时,它是作为SMTP服务器端。SMTP规范定义在RFC 821中,它的作用是把邮件消息从发信人的邮件服务器传送到收信人的邮件服务器。SMTP限制所有邮件消息的信体必须是简单的7位ASCII字符格式。这个限制使得二进制多媒体数据在由SMTP传送之前必须编码成7位ASCII文本;SMTP传送完毕之后,再把相应的7位ASCII文本邮件消息解码成二进制数据。下面通过假设Alice给Bob发送一个简单的ASCII文本邮件消息的情形来说明SMTP的基本操作:Alice调用自己的电子邮件用户代理,给出Bob的电子邮件地址(例如),写好邮件内容,然后让用户代理发送本邮件消息。Alice的用户代理把该邮件消息发送到其邮件服务器中,由邮件服务器把该消息放入某个消息队列中。运行在A1ice的邮件服务器上的SMTP客户端看到消息队列中的这个邮件消息后,打开一个到运行在Bob的邮件服务器主机上的SMTP服务器端的TCP连接。经过最初的一些SMTP握手之后,SMTP客户把A1ice的邮件消息发送到TCP连接上。在Bob的邮件服务器主机上,SMTP服务器收到这个邮件消息后,把这个消息投递到Bob的邮箱中。Bob在方便的时候调用自己的电子邮件用户代理阅读该邮件消息。图11.2展示了上述情形。图1 A1ice的邮件服务器把邮件消息传送到Bob的邮件服务器SMTP通常不使用中间的邮件服务器主机中转邮件。如果Bob的邮件服务器不工作了,那么A1ice发给Bob的邮件消息将存留在Alice的邮件服务器中等待新的尝试,而不会存放到某个中间的邮件服务器中。SMTP协议与现实社会人们面对面交互的礼仪之间有许多相似之处。首先,运行在发送端邮件服务器主机上的SMTP客户,发起建立一个到运行在接收端邮件服务器主机上的SMTP服务器端口号25之间的TCP连接。如果接收邮件服务器当前不工作,SMTP客户就等待一段时间后再尝试建立该连接。这个连接建立之后,SMTP客户和服务器先执行一些应用层握手操作。就像人们在转手东西之前往往先自我介绍那样,SMTP客户和服务器也在传送信息之前先自我介绍一下。在这个SMTP握手阶段,SMTP客户向服务器分别指出发信人和收信人的电子邮件地址。彼此自我介绍完毕之后,客户发出邮件消息。SMTP使用传输层提供的可靠数据传输服务(TCP服务)把该消息无差错地传送到服务器。如果客户还有其它邮件消息需发送到同一个服务器,它就在同一个TCP连接上重复上述过程;否则,它就指示TCP关闭该连接。假设客户所在主机名为,服务器所在主机名为。前面标以“C:”的ASCII文本行是客户发送到它的TCP套接字中的完整文本行,前面标以“S:”的ASCII文本行是服务器发送到它的TCP套接字中的完整文本行。一个客户和服务器交互的例子如下(以下传输脚本在TCP连接建立之后发生):S: 220 C: HELO S: 250 Hello , pleased to meet youC: MAIL FROM:S: 250 . Sender OKC: RCPT TO:S: 250 .Recipient OKC: DATAS: 354 Enter mail, end with . on a line by its selfC: Do you like ketchup?C: How about pickles?C: .S: 250 Message accepted for deliveryC: QUITS: 221 closing connection在这个例子中,客户发送了一个从邮件服务器主机到的邮件消息,信体内容为:“Do you like ketchup? How about pickles?”。客户总共发出了5个命令。其中HELO命令标识发信人自己的身份;MAIL FROM命令表示请求发送邮件,初始化邮件传输;RCPT TO命令标识某电子邮件的计划接收人;DATA命令表示所有的邮件接收人已标识,并初始化数据传输,以.结束;QUIT命令表示退出邮件发送过程,结束会话。服务器给每个命令发回应答,其中每个应答都由应答码和一些英语解释(可选)构成。SMTP使用持久连接,如果发送邮件服务器有多个邮件消息需发送到同一个接收邮件服务器,那么所有这些消息可以在同一个TCP连接中发送。对于其中的每一个消息,客户以一个新的“HELO ”命令开始整个消息发送过程,但是QUIT命令要等到所有消息都发送完之后才发出。一旦SMTP把Alice发给Bob的邮件消息从Alice的邮件服务器传送到Bob的邮件服务器,该邮件消息就存放在Bob的邮箱中。一个典型的电子邮件信头:From: To: Subject: this is a letter信头之后空一行就是信体。一个MIME消息:From: To: Subject: picture of mineMIME-Version: 1.0Content-Transfer-Encoding: base64Content-Type: image/jpeg.base64编码数据.base64编码数据.表1 Base64编码表值编码值编码值编码值编码值编码值编码值编码值编码0A8I16Q24Y32g40o48w5641B9J17R25Z33h41p49x5752C10K18S26a34i42q50y5863D11L19T27b35j43r51z5974E12M20U28c36k44s5206085F13N21V29d37l45t5316196G14O22W30e38m46u54262+7H15P23X31f39n47v55363/邮件消息:From: To: MIME-Version: 1.0Content-type: multipart/mixed; Boundary=StartOfNextPart-StartOfNextPartDear bob, Please look at the picture-StartOfNextPartContent-Transfer-Encoding: base64Content-type: image/jpeg.base64编码的数据. .base64编码的数据.-StartOfNextPartthere is some acsii letter here作为接收者的用户看到的邮件消息大致如下: Received: from by ; 18 Oct 2007 09:53:37 GMTFrom: To: MIME-Version: 1.0Content-type: multipart/mixed; Boundary=StartOfNextPart-StartOfNextPartDear bob, Please look at the picture-StartOfNextPartContent-Transfer-Encoding: base64Content-type: image/jpeg.base64编码的数据. .base64编码的数据.-StartOfNextPartthere is some acsii letter here2实验内容2.1 实验目的学习电子邮件系统的工作原理,深入理解SMTP协议,熟悉多媒体邮件格式和Base64编码,掌握简化的SMTP邮件服务器的设计与实现方法。2.2 实验工具硬件:小型局域网(PC机不少于4台)软件:windows 2000操作系统、Jbuilder9.0编程环境、Java编程语言2.3 实验要求编写简化的SMTP邮件服务器,实现邮件消息在邮件服务器之间的传输;提供用户远程登陆邮件服务器撰写、发送、阅读、回复、转发、删除邮件等功能。2.4 实验指导熟练掌握实验工具部分所列出的软件工具。仔细阅读电子邮件系统工作原理部分,勾画出实现邮件服务器的各组成部分的总体结构图。图2是一个示例。图2 一种电子邮件服务器组成及交互关系熟悉动态交互页面的编写技术,例如JSP。编写基于Web的用户代理,实现邮箱注册,撰写、发送、阅读、回复、转发、删除邮件等功能。熟悉SMTP协议规范。编写SMTP客户端,实现定期扫描待发送邮件队列、主动发起与SMTP服务器端的TCP连接、发送邮件消息等功能。编写SMTP服务器端,实现对SMTP客户端发送邮件请求的响应、接收邮件消息、根据用户邮箱名将邮件存入用户邮箱。解码算法实现 右移两位,清0依此类推。AND取第一个字节的后2位和第二个字节的前4位移位放入新变量中, 右移两位,高两位清0, 用AND取前6位,放入新的变量中, 读取数据3字节 解码的类C语言实现的算法: BYTE LMoveBit(int base, int MoveNum) BYTE result=base; if(MoveNum = = 0)return 1; if(MoveNum = = 1)return MoveNum; result=base(MoveNum-1); return result; char base64_alphabet= A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P, Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f, g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v, w,x,y,z,0,1,2,3,4,5,6,7,8,9,+,/,=; BYTE Base64Decode(char *base64code, DWORD base64length) char buf4; int i,j; int k; int l=0; BYTE temp14,temp2; BYTE *Buffer=new BYTEbase64length*3/4; DWORD base64a=(base64length/4)-1; DWORD base64b=0; for(;base64bbase64a+1;base64b+) for(i=0;i4;i+) bufi=*(base64code+(base64b*4)+i); for(j=0;j65;j+) if(bufi=base64_alphabetj) temp1i=j; break; i-; for(k=1;k4;k+) if(temp1i-(k-1)=64)m_padnum+; continue; temp1i-(k-1)=temp1i-(k-1)/LMoveBit(2,(k-1)*2); temp2=temp1i-k; temp2=temp2&(LMoveBit(2,k*2)-1); temp2*=LMoveBit(2,8-(2*k);/move 4 temp1i-(k-1)=temp1i-(k-1)+temp2; Bufferbase64b*3+(3-k)=temp1i-(k-1); return Buffer; Java实现扩展Base64编码import java.lang.*;import java.io.*;public class CLSBase64 private static char base64EncodeChars = new char A, B, C, D, E, F, G, H,I, J, K, L, M, N, O, P,Q, R, S, T, U, V, W, X,Y, Z, a, b, c, d, e, f,g, h, i, j, k, l, m, n,o, p, q, r, s, t, u, v,w, x, y, z, 0, 1, 2, 3,4, 5, 6, 7, 8, 9, +, / ;private static byte base64DecodeChars = new byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1 ; /编码public static String encode(byte data) StringBuffer sb = new StringBuffer();int len = data.length;int i = 0;int b1, b2, b3;while (i 2);sb.append(base64EncodeChars(b1 & 0x3) 2);sb.append(base64EncodeChars(b1 & 0x03) 4);sb.append(base64EncodeChars(b2 & 0x0f) 2);sb.append(base64EncodeChars(b1 & 0x03) 4);sb.append(base64EncodeChars(b2 & 0x0f) 6);sb.append(base64EncodeCharsb3 & 0x3f);return sb.toString();/解码public static byte decode(String str) throws UnsupportedEncodingException StringBuffer sb = new StringBuffer();byte data =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论