为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > 简单邮件传输协议SMTP

简单邮件传输协议SMTP

2018-03-10 13页 doc 62KB 11阅读

用户头像

is_003124

暂无简介

举报
简单邮件传输协议SMTP简单邮件传输协议SMTP SMTP是因特网电子邮件系统重要的应用层协议。它使用由TCP提供的可靠的数据传输服务把邮件消息从发信人邮箱所在邮件服务器传送到收信人邮箱所在邮件服务器。SMTP是客户-服务器应用模式,由发信人的邮件服务器执行的客户端和收信人的邮件服务器执行的服务器端组成。SMTP的客户端和服务器端同时运行在每个邮件服务器上。当一个邮件服务器向其它邮件服务器发送邮件消息时,它是作为SMTP客户端。当一个邮件服务器从其它邮件服务器接收邮件消息时,它是作为SMTP服务器端。 SMTP规范定义在RFC 821中,它的作用...
简单邮件传输协议SMTP
简单邮件传输协议SMTP SMTP是因特网电子邮件系统重要的应用层协议。它使用由TCP提供的可靠的数据传输服务把邮件消息从发信人邮箱所在邮件服务器传送到收信人邮箱所在邮件服务器。SMTP是客户-服务器应用模式,由发信人的邮件服务器执行的客户端和收信人的邮件服务器执行的服务器端组成。SMTP的客户端和服务器端同时运行在每个邮件服务器上。当一个邮件服务器向其它邮件服务器发送邮件消息时,它是作为SMTP客户端。当一个邮件服务器从其它邮件服务器接收邮件消息时,它是作为SMTP服务器端。 SMTP定义在RFC 821中,它的作用是把邮件消息从发信人的邮件服务器传送到收信人的邮件服务器。SMTP限制所有邮件消息的信体必须是简单的7位ASCII字符格式。这个限制使得二进制多媒体数据在由SMTP传送之前必须编码成7位ASCII文本;SMTP传送完毕之后,再把相应的7位ASCII文本邮件消息解码成二进制数据。 下面通过假设Alice给Bob发送一个简单的ASCII文本邮件消息的情形来说明SMTP的基本操作: ?Alice调用自己的电子邮件用户代理,给出Bob的电子邮件地址(例如bob@csu.edu),写好邮件内容,然后让用户代理发送本邮件消息。 ?Alice的用户代理把该邮件消息发送到其邮件服务器中,由邮件服务器把该消息放入某个消息队列中。 ?运行在A1ice的邮件服务器上的SMTP客户端看到消息队列中的这个邮件消息后,打开一个到运行在Bob的邮件服务器主机上的SMTP服务器端的TCP连接。 ?经过最初的一些SMTP握手之后,SMTP客户把A1ice的邮件消息发送到TCP连接上。 ?在Bob的邮件服务器主机上,SMTP服务器收到这个邮件消息后,把这个消息投递到Bob的邮箱中。 ?Bob在方便的时候调用自己的电子邮件用户代理阅读该邮件消息。图11.2展示了上述情形。 SMTP 因特网 Alice的邮件服务器Bob的邮件服务器 图1 A1ice的邮件服务器把邮件消息传送到Bob的邮件服务器 SMTP通常不使用中间的邮件服务器主机中转邮件。如果Bob的邮件服务器不工作了,那么A1ice发给Bob的邮件消息将存留在Alice的邮件服务器中等待新的尝试,而不会存放到某个中间的邮件服务器中。 SMTP协议与现实社会人们面对面交互的礼仪之间有许多相似之处。首先,运行在发送端邮件服务器主机上的SMTP客户,发起建立一个到运行在接收端邮件服务器主机上的SMTP服务器端口号25之间的TCP连接。如果接收邮件服务器当前不工作,SMTP客户就等待一段时间后再尝试建立该连接。这个连接建立之后,SMTP客户和服务器先执行一些应用层握手操作。就像人们在转手东西之前往往先自我介绍那样,SMTP客户和服务器也在传送信息之前先自我介绍一下。在这个SMTP握手阶段,SMTP客户向服务器分别指出发信人和收信人的电子邮件地址。彼此自我介绍完毕之后,客户发出邮件消息。SMTP使用传输层 提供的可靠数据传输服务(TCP服务)把该消息无差错地传送到服务器。如果客户还有其它邮件消息需发送到同一个服务器,它就在同一个TCP连接上重复上述过程;否则,它就指示TCP关闭该连接。 假设客户所在主机名为sina.com,服务器所在主机名为csu.edu。前面标以“C:”的ASCII文本行是客户发送到它的TCP套接字中的完整文本行,前面标以“S:”的ASCII文本行是服务器发送到它的TCP套接字中的完整文本行。一个客户和服务器交互的例子如下(以下传输脚本在TCP连接建立之后发生): S: 220 csu.edu C: HELO sina.com S: 250 Hello sina.com, pleased to meet you C: MAIL FROM: S: 250 alice@sina.com ... Sender OK C: RCPT TO: S: 250 bob@csu.edu...Recipient OK C: DATA S: 354 Enter mail, end with "." on a line by its self C: Do you like ketchup? C: How about pickles? C: . S: 250 Message accepted for delivery C: QUIT S: 221 csu.edu closing connection 在这个例子中,客户发送了一个从邮件服务器主机sina.com到csu.edu的邮件消息,信体内容为:“Do you like ketchup? How about pickles?”。客户总共发出了5个命令。其中HELO命令标识发信人自己的身份;MAIL FROM命令表示请求发送邮件,初始化邮件传输;RCPT TO命令标识某电子邮件的接收人;DATA命令表示所有的邮件接收人已标识,并初始化数据传输,以.结束;QUIT命令表示退出邮件发送过程,结束会话。 服务器给每个命令发回应答,其中每个应答都由应答码和一些英语解释(可选)构成。SMTP使用持久连接,如果发送邮件服务器有多个邮件消息需发送到同一个接收邮件服务器,那么所有这些消息可以在同一个TCP连接中发送。对于其中的每一个消息,客户以一个新的“HELO sina.com”命令开始整个消息发送过程,但是QUIT命令要等到所有消息都发送完之后才发出。一旦SMTP把Alice发给Bob的邮件消息从Alice的邮件服务器传送到Bob的邮件服务器,该邮件消息就存放在Bob的邮箱中。 一个典型的电子邮件信头: From: alice@sina.com To: bob@csu.edu Subject: this is a letter 信头之后空一行就是信体。 一个MIME消息: From: alice@sina.com To: bob@csu.edu Subject: picture of mine MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Type: image/jpeg {...base64编码数据... ...base64编码数据...} 表1 Base64编码表 值 编码 值 编码 值 编码 值 编码 值 编码 值 编码 值 编码 值 编码 0 A 8 I 16 Q 24 Y 32 g 40 o 48 w 56 4 1 B 9 J 17 R 25 Z 33 h 41 p 49 x 57 5 2 C 10 K 18 S 26 a 34 i 42 q 50 y 58 6 3 D 11 L 19 T 27 b 35 j 43 r 51 z 59 7 4 E 12 M 20 U 28 c 36 k 44 s 52 0 60 8 5 F 13 N 21 V 29 d 37 l 45 t 53 1 61 9 6 G 14 O 22 W 30 e 38 m 46 u 54 2 62 + 7 H 15 P 23 X 31 f 39 n 47 v 55 3 63 / 邮件消息: From: alice@sina.com To: bob@csu.edu MIME-Version: 1.0 Content-type: multipart/mixed; Boundary=StartOfNextPart --StartOfNextPart Dear bob, Please look at the picture --StartOfNextPart Content-Transfer-Encoding: base64 Content-type: image/jpeg {...base64编码的数据... ...base64编码的数据...} --StartOfNextPart there is some acsii letter here 作为接收者的用户看到的邮件消息大致如下: Received: from sina.com by csu.edu; 18 Oct 2007 09:53:37 GMT From: alice@sina.com To: bob@csu.edu MIME-Version: 1.0 Content-type: multipart/mixed; Boundary=StartOfNextPart --StartOfNextPart Dear bob, Please look at the picture --StartOfNextPart Content-Transfer-Encoding: base64 Content-type: image/jpeg {...base64编码的数据... ...base64编码的数据...} --StartOfNextPart there is some acsii letter here 2实验内容 2.1 实验目的 学习电子邮件系统的工作原理,深入理解SMTP协议,熟悉多媒体邮件格式和Base64编码,掌握简化的SMTP邮件服务器的与实现。 2.2 实验工具 硬件:小型局域网(PC机不少于4台) 软件:windows 2000操作系统、Jbuilder9.0编程环境、Java编程语言 2.3 实验要求 编写简化的SMTP邮件服务器,实现邮件消息在邮件服务器之间的传输;提供用户远程登陆邮件服务器撰写、发送、阅读、回复、转发、删除邮件等功能。 2.4 实验指导 ?熟练掌握实验工具部分所列出的软件工具。 ?仔细阅读电子邮件系统工作原理部分,勾画出实现邮件服务器的各组成部分的总体结构图。图2是一个示例。 Alice邮件服务器Bob邮件服务器 SMTP传输邮件消息待发送邮SMTP用户邮箱服务器端件队列客户端...浏览器基于Web的浏览器基于Web的用户邮箱用户邮箱用户代理用户代理...SMTP待发送邮传输邮件消息SMTP用户邮箱客户端件队列服务器端 图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 buf[4]; int i,j; int k; int l=0; BYTE temp1[4],temp2; BYTE *Buffer=new BYTE[base64length*3/4]; DWORD base64a=(base64length/4)-1; DWORD base64b=0; for(;base64b>> 2]); sb.append(base64EncodeChars[(b1 & 0x3) << 4]); sb.append(" = = "); break; } b2 = data[i++] & 0xff; if (i = = len){ sb.append(base64EncodeChars[b1 >>> 2]); sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]); sb.append(base64EncodeChars[(b2 & 0x0f) << 2]); sb.append("="); break; } b3 = data[i++] & 0xff; sb.append(base64EncodeChars[b1 >>> 2]); sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]); sb.append(base64EncodeChars[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >>> 6)]); sb.append(base64EncodeChars[b3 & 0x3f]); } return sb.toString(); } //解码 public static byte[] decode(String str) throws UnsupportedEncodingException { StringBuffer sb = new StringBuffer(); byte[] data = str.getBytes("US-ASCII"); int len = data.length; int i = 0; int b1, b2, b3, b4; while (i < len) { /* b1 */ do { b1 = base64DecodeChars[data[i++]]; } while (i < len && b1 = = -1); if (b1 = = -1) break; /* b2 */ do { b2 = base64DecodeChars[data[i++]]; } while (i < len && b2 = = -1); if (b2 = = -1) break; sb.append((char)((b1 << 2) | ((b2 & 0x30) >>> 4))); /* b3 */ do { b3 = data[i++]; if (b3 = = 61) return sb.toString().getBytes("ISO-8859-1"); b3 = base64DecodeChars[b3]; } while (i < len && b3 = = -1); if (b3 = = -1) break; sb.append((char)(((b2 & 0x0f) << 4) | ((b3 & 0x3c) >>> 2))); /* b4 */ do { b4 = data[i++]; if (b4 = = 61) return sb.toString().getBytes("ISO-8859-1"); b4 = base64DecodeChars[b4]; } while (i < len && b4 = = -1); if (b4 = = -1) break; sb.append((char)(((b3 & 0x03) << 6) | b4)); } return sb.toString().getBytes("ISO-8859-1"); } }
/
本文档为【简单邮件传输协议SMTP】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索