2010年11月12日星期五

POP3中文翻译译文-RFC1939

网上找不到完整的中文版,于是就自己把RFC文档翻译了一遍,有错误欢迎指正,转载请注明出处!下面正文。
Post Office Protocol - Version 3
1、 简介
对于互联网上较小的节点,维护一个信息传送系统(MTS)是不大现实的。例如,一个工作站没有足够的资源(时间,磁盘空间)使一个SMTP服务器[RFC821]和关联的本地邮件投递系统驻留和连续运行。类似地,把一台个人电脑长时间连接在IP网络上是昂贵的说着不现实的(资源受限的节点称为”连通性”)。
尽管如此,在小节点上收发邮件是非常有用的,所以经常架设一个用户代理(UA)来帮助处理邮件任务。为了解决这个问题,我们在MTS实体上为资源受限的节点提供了邮筒功能。邮局协议-版本3(POP3)允许工作站以一种比较实用的方式来访问服务器邮筒。通常,这意味着POP3协议支持工作站去服务器检索服务器上为本工作站存储的邮件。
POP3未打算提供大量服务器上的邮件操作;一般,邮件被下载后即被删除。一个更为先进和复杂的协议,IMAP4,正在设计中[RFC1730]。
在下文中,客户主机指使用POP3服务的主机,服务器主机指提供POP3服务的主机。


2、 题外话
本文中不详细说明客户主机如何将邮件发送给邮件传送系统,下面是一种方法的简单说明:
当客户主机的用户代理程序要发送邮件时,它会与中继主机建立一条SMTP连接,将邮件全部发给中继主机。这个中继主机可以使客户主机的POP3服务器,但不必须是。中继主机要接受传发到任意地址的邮件,但SMTP服务器并不一定提供此功能。
3、 基本操作
最初,服务器主机启动POP3服务监听TCP 110端口。如果客户主机打算使用该服务,就建立一条到服务器主机的TCP连接。当连接建立完成后,POP3服务会给客户端主机发送一个问候。客户端可以和POP3服务独立地交换命令和应答,指导连接关闭或终止。
POP3命令行由不区分大小写的关键字和一个、多个参数组成。所有的命令都以CRLF结尾。关键字和参数由可打印的ASCII字符组成。关键字和参数由一个空格隔开。关键字有三或四个字符组成。每行参数最多包含40个字符。
POP3应答包含一个状态指示符、关键字和附加信息。所有的应答都以CRLF结尾。包括CRLF字符,应答最大支持到512字符。应答中一般有两个状态符:正的(”+OK”)和负的(”-ERR”)。服务器必须以大写方式放松”+OK”和”-ERR”。
一些命令的应答是多行的。这种情况下,应答按以下方法清晰地说明:发送完第一行和CRLF后,接着下面的的应答每发送一行紧跟一个CRLF,最后用终结符号”.”和CRLF结尾。如果多行应答中的某一行以终结符开始,那么这行是进行了终结符的预先自己填充。因此多行应答根据五个字符”CRLF.CRLF”结束。当检查多行应答时,客户端查看每一行是有以终结符开始。如果是并且终结符后跟随的不是CRLF,则该终结符将被除去。如果终结符后跟的未CRLF,则来自服务器的多行应答结束,并且”.CRLF”这一行不包含在多行应答内。
在一个POP3会话周期内包含了多个状态。当TCP连接打开,POP3服务器发送问候语时,会话进入AUTHORIZATION状态。在这个状态内,客户端必须向POP3服务器认证自己。客户端完成认证后,服务器获取和客户端邮筒相关的资源,进入TRANSACTION状态。在这个状态内,客户端请求的响应是由POP3服务器做出的。当客户端发出QUIT命令,会话进入UPDATE状态。在这个状态内,POP3服务器释放在TRANSACTION状态内获取的所有资源,然后向客户端发送再见消息。TCP连接断开。
服务器必须对未认证、未生效或者有语法错误的命令返回负状态指示符。服务器必须对错误状态发出的命令返回负状态指示符。没有特定的命令来区分一个服务器是否支持附加命令或能否执行一个命令。
POP3服务器可能有非活动地自动退出定时器。一般定时器至少为10分钟长。在定时器时间间隔内收到任何命令都会重新复位自动退出定时器。当定时器到期,会话将不进入UPDATE状态–服务器将不删除任何信息也不给客户端任何回去的情况下关闭TCP连接。
4、 AUTHORIZATION状态
当POP3客户端打开TCP连接后,POP3服务器会发出一行的问候信息。这是一个正相应。例子如下:
S: +OK POP3 server ready
POP3会话当前状态为AUTHORIZATION状态。客户端现在必须向POP3服务器鉴定和认证自己。文中描述了两种可行的认证机制,USER、PASS命令组合和APOP命令。两种认证机制在下文都有描述。附加的认证方式在RFC1734中有描述。没有任何一种认证时被POP3服务器强制使用的,但一个POP3服务器必须至少支持一种认证方式。
当POP3服务器通过客户端提供的任何认证命令认证到合适的邮筒时,POP3服务器将获得这个邮筒的一个读写锁,必要时来防止进入UPDATE状态前邮筒信息被修改或删除。如果这个锁正确的获得,POP3服务器将返回正状态指示符。POP3会话进入TRANSACTION状态,并且没有邮件被标记为删除。如果邮筒因为一些原因(例如,不能正常加锁,不能正常打开邮筒,认证错误,邮筒信息不能被正确解析)不能正确的打开,POP3服务器将返回负状态指示器。(如果锁已经获取但POP3服务器打算响应一个负的状态指示符,POP3服务器必须在发送负状态指示符前解除锁。)在返回一个负状态指示符后,服务器可能会关闭连接。如果服务器没有关闭连接,客户端可以发出一个新的认证命令和重新开始,或者发送QUIT命令。
当POP3打开邮筒后,它将给每封邮件标记一个编号,并以字节为单位标记每一封邮件的大小。邮筒中的第一封邮件的编号为”1″,第二封为”2″,以此类推,所以第n封邮件的编号为”n”。在POP3命令和应答中,所有的邮件编号和邮件大小都是十进制的。
下面是AUTHORIZATION状态中使用的QUIT命令的总结:
QUIT
参数:无
限制:无
正应答:
+OK
示例:
C: QUIT
S: +OK dewey POP3 server signing off
5、 TRANSACTION状态
当客户端向POP3服务器成功认证自己,并且POP3服务器已经锁定打开指定邮筒,这时POP3会话进入TRANSACTION状态。客户端现在可以重复向POP3服务器发送下面的命令。POP3服务器会对每一个命令应答。客户端最后发送QUIT命令后,POP3会话进入UPDATE状态。
下面是在TRANSACTION状态可用的POP3命令:
STAT
参数:无
限制:只能用在TRANSACTION状态
讨论:
POP3服务器响应一个包含邮筒信息的正确应答。这一行称为邮筒的”下拉列表”。
为了简化解析过程,所有的POP3服务器须要使用一种格式的下拉列表。正确响应包含了以下内容:”+OK”、空格、邮筒中邮件个数、空格、整个邮筒大小(字节单位)。本文中没有要求邮筒大小后跟随什么内容。最低限度的实现是只跟随CRLF字符对。更进一步的实现可以包括其它信息。
注解:本文是强烈反对在下拉列表中加入附加信息的。邮筒中其它的可为客户端解析的信息在下面讨论。
注意被标记为删除的邮件是不计算在两个数据内的。
正确响应:+OK nn mm
示例:
C: STAT
S: +OK 2 320
LIST [msg]
参数:可选的邮件标号,不能指定标记为删除的邮件编号。
限制:只能用在TRANSACTION状态
讨论:
如果指定邮件编号参数,并且POP3服务器返回了包含指定邮件信息的正确响应。则这条信息称为”扫描列表”。
如果未指定参数,并且POP3服务器返回的为正确响应,则这条响应为多行的。紧跟在+OK字符后,POP3服务器为邮筒中的每一封邮件生成一条信息。称为邮件的”扫描列表”。如果邮筒中没有邮件,那么POP3服务器返回不包含扫描列表的响应–包含结束符和CRLF的正确响应。
为了简化解析过程,所有的POP3服务器须要使用一种格式的扫描列表。扫描列表包含以下内容:邮件编号、空格、邮件精确大小(字节单位)。计算邮件精确大小的方法在”邮件格式”节说明。本文中没有要求扫描列表内邮件大小后跟随什么内容。最低限度的实现是只跟随CRLF字符对。更进一步的实现可以包括其它信息。
注解:本文是强烈反对在扫描列表中加入附加信息的。邮筒中其它的可为客户端解析的信息在下面讨论。
注意被标记为删除的邮件是不计算在两个数据内的。
正确响应:
+OK scan listing follows
-ERR no such message
示例:
C: LIST
S: +OK 2 messages (320 octets)
S: 1 120
S: 2 200
S: .
C: LIST 2
S: +OK 2 200
C: LIST 3
S: -ERR no such message, only 2 messages in maildrop
RETR msg
参数:必选的邮件标号,不能指定标记为删除的邮件编号。
限制:只能用在TRANSACTION状态
讨论:
如果POP3服务器返回正确响应,那么这个响应必为多行的。紧跟在+OK后,POP3服务器发送指定邮件编号的邮件信息,注意小心处理字节填充的结束符。
正确响应:
+OK message follows
-ERR no such message
示例:
C: RETR 1
S: +OK 120 octets
S: <the POP3 server sends the entire message here>
S: .
DELE msg
参数:必选的邮件标号,不能指定标记为删除的邮件编号。
限制:只能用在TRANSACTION状态
讨论:
POP3服务器将邮件标记为删除。之后任何涉及这个邮件编号的命令POP3服务器都会返回错误。POP3服务器不会马上删除这封邮件,而是到UPDATE再进行删除。
正确响应:
+OK message deleted
-ERR no such message
示例:
C: DELE 1
S: +OK message 1 deleted
C: DELE 2
S: -ERR message 2 already deleted
NOOP
参数:无
限制:只能用在TRANSACTION状态
讨论:POP3仅仅回复一个正确响应,不做其他动作。
正确响应:+OK
示例:
C: NOOP
S: +OK
RSET
参数:无
限制:只能用在TRANSACTION状态
讨论:
如果任何邮件被POP3服务器标记为删除,则这条命令取消其标记。POP3服务然后返回正确响应。
正确回复:
+OK
示例:
C: RSET
S: +OK maildrop has 2 messages (320 octets)
6、 UPDATE状态
当客户端在TRANSACTION状态发送QUIT命令,POP3会话进入UPDATE状态。(注意如果客户端在AUTHORIZATION状态发送QUIT命令,POP3会话会直接终止而不是进入UPDATE状态。)
如果会话因为除客户QUIT命令外的其他原因终止,POP3会话不进入UPDATE状态,并且不删除邮筒中的任何邮件。
QUIT
参数:无
限制:无
讨论:
POP3服务器删除所有被标记为删除的邮件,然后向客户端发送本次操作状态。如果删除时因为资源不足等原因造成错误时,那么POP3服务器不删除邮筒中标记为删除的邮件。服务器绝不会删除任何未标记为删除的邮件。不管删除动作是否成功,服务器都会释放邮筒上的读写锁,并断开TCP连接。
正确应答:
+OK
-ERR some deleted messages not removed
示例:
C: QUIT
S: +OK dewey POP3 server signing off (maildrop empty)
C: QUIT
7、 POP3附件命令
上面讨论的POP3命令,必须被所有的POP3服务器支持。
下面介绍的POP3附加命令可以使POP3客户端更加自由的处理邮件。
注意:本文强烈鼓励附加命令的开发,替代在下拉和扫描列表上的参数扩展。本文的开发哲学是将复杂部分放在POP3客户单而不是POP3服务器。
TOP msg n
参数:邮件标号,不能指定标记为删除的邮件编号;正数行号。
限制:只能用在TRANSACTION状态。
讨论:
如果POP3服务器发出一个正确响应,那么这个响应必是多行的。紧跟在+OK字符之后,服务器发送:邮件的头部、空行(头部和主体之间)、指定行数(前n行)的邮件主体。小心处理字节填充的结束符。
注意如果POP3客户端发送的行数大于邮件主体部分总行数,则POP3服务器发送全部邮件信息。
正确响应:
+OK top of message follows
-ERR no such message
示例:
C: TOP 1 10
S: +OK
S: <the POP3 server sends the headers of the
message, a blank line, and the first 10 lines
of the body of the message>
S: .
C: TOP 100 3
S: -ERR no such message
UIDL [msg]
参数:可选的邮件标号,不能指定标记为删除的邮件编号。
限制:只能用在TRANSACTION状态
讨论:
如果客户端指定参数,则POP3服务器返回包含指定邮件信息的正确响应。此行回复称为邮件的”唯一ID列表”。
如果没有指定参数而POP3服务器返回正确响应,那么这个响应必是多行的。在符号+OK之后,POP3服务器为邮筒中的每封邮件返回一行包含邮件信息的应答。此行回复称为邮件的”唯一ID列表”。
为了简化解析过程,所有的POP3服务器须要使用一种格式的唯一ID列表。唯一ID列表包含以下部分:邮件编号、空格、邮件的唯一ID。唯一ID之后没有任何信息。
邮件的唯一ID是有服务器随意生成的,包含从0×21到0×7E范围内的任意1到70个字符,这个ID在邮筒内对应一封邮件,并且ID在整个会话过程中是不变化的。即使会话没有进入UPDATE状态,唯一ID也是不会变化的。邮筒内如果一个唯一ID存在,是不能被重复使用的。
注意被标记为删除的邮件是不会被列出的。
在邮筒中存储任意分配的唯一ID对服务器实现来说是更可取的,这个规范打算使用邮件的hash来作为唯一的ID。客户端必须能够处理完全相同的两封邮件的唯一ID相同的情况。
正确应答:
+OK unique-id listing follows
-ERR no such message
示例:
C: UIDL
S: +OK
S: 1 whqtswO00WBw418f9t5JxYwZ
S: 2 QhdPYR:00WBw1Ph7×7
S: .
C: UIDL 2
S: +OK 2 QhdPYR:00WBw1Ph7×7
C: UIDL 3
S: -ERR no such message, only 2 messages in maildrop
USER name
参数:对服务器来说,能够唯一标示一个邮筒的字符串。
限制:
只能在AUTHORIZATION状态中的POP3问候和未执行成功的USER、PASS命令后执行。
讨论:
使用USER、PASS命令对进行认证时,客户端必须先发送USER命令。如果POP3服务器返回正确的状态指示符(”+OK”),那么客户端就可以使用PASS发送密码来完成认证,或者也可以发送QUIT命令来结束会话。如果POP3服务器对USER命令返回的是错误状态指示符(”-ERR”),那么客户端可以重新发起一次新的认证,或者QUIT退出。
即使没有相应的邮筒,服务器也可能会返回一个正确响应。如果对应的邮筒存在而服务器返回错误应答,则表明服务器不支持明文认证。
正确应答:
+OK name is a valid mailbox
-ERR never heard of mailbox name
示例:
C: USER frated
S: -ERR sorry, no mailbox for frated here
C: USER mrose
S: +OK mrose is a real hoopy frood
PASS string
参数:服务器邮筒密码
限制:只能用在AUTHORIZATION状态中,USER命令后。
讨论:
当客户端使用PASS命令时,POP3服务器使用USER、PASS命令的参数来判断这个客户端能否获取到正确的邮筒。
由于PASS命令正好只有一个参数,POP3服务器可能把作为分隔符的空格也当做密码的一部分。
正确应答:
+OK maildrop locked and ready
-ERR invalid password
-ERR unable to lock maildrop
示例:
C: USER mrose
S: +OK mrose is a real hoopy frood
C: PASS secret
S: -ERR maildrop already locked
C: USER mrose
S: +OK mrose is a real hoopy frood
C: PASS secret
S: +OK mrose’s maildrop has 2 messages (320 octets)
APOP name digest
参数:标示邮筒的字符串和一个MD5码
限制:
只能用在AUTHORIZATION状态中,POP3问候或一个未成功的USER、PASS命令后。
讨论:
正常情况下,每个POP3会话都是从USER/PASS交互命令开始的。这导致用户密码在网上明文传输。断断续续的使用POP3,可能不会引入太大的风险。然而,很多的POP3客户端都定期的连接到POP3服务器来检查新邮件。而且会话启动的时间间隔近似五分钟。因此密码被捕获的机会就大大增大了。
一个能够提供原始认证和安全重演,并且不将密码在网上明文发送的替代方法成为需要。APOP命令提供了这个功能。
支持APOP命令的POP3服务器会在它的问候语中包含一个时间戳。时间戳的格式与[RFC822]的”msg-id”格式相同,并且POP3每次提供的问候语必须不同。例如,UNIX系统中不同实体的POP3服务器的进程号是不同的,时间戳的格式可能是:
<process-ID.clock@hostname>
其中”process-ID”进程的进程号(十进制),clock是系统时钟(十进制),hostname是运行POP3服务器的主机的域名全称。
POP3客户端注意到时间戳,然后发出APOP命令。参数”name”和USER命令中的参数”name”含义相同。参数”digest”是时间戳(包含角括号)和共享密码组成的字符串的MD5[RFC1321]计算结果。一定要小心阻止非法的密码暴漏,这会使用户的名字被顶替使用。参数”digest”是包含了十六字节小写十六进制字符的字符串。
当POP3服务器收到APOP命令时,他会计算提供的digest参数。如果digest参数正确,则POP3服务器返回正确应答并进入TRANSACTION状态。否则,返回错误应答并停留在AUTHORIZATION状态。
注意共享密码越长,得到它就越困难。同样地,共享密码最好是一个长的字符串(如下面的例子,一般大于8个字符)。
正确响应:
+OK maildrop locked and ready
-ERR permission denied
示例:
S: +OK POP3 server ready <1896.697170952@dbc.mtview.ca.us>
C: APOP mrose c4c9334bac560ecc979e58001b3e22fb
S: +OK maildrop has 1 message (369 octets)
In this example, the shared secret is the string `tan-
staaf’. Hence, the MD5 algorithm is applied to the string
<1896.697170952@dbc.mtview.ca.us>tanstaaf
which produces a digest value of
c4c9334bac560ecc979e58001b3e22fb
译者注:上面提要的共享密码也是需要为每个用户单独指定一个的。参考:http://www.freebsddiary.org/apop.php
8、 缩放和运行注意事项
自一些上面描述的附加特性加入POP3协议后,人们在用户都不想不相干的大规模商业邮局系统中积累了大量的经验。在这些和其他情况下,POP3客户端供应商和用户发现,使用UIDL命令但不使用DELE命令可以提供一个类似IMAP的”半永久邮件仓库”的功能。当然IMAP的其他功能,如探测新到的连接、支持服务器多文件夹都未呈现在POP3中。
当这个方法被更多的临时用户使用时,大量的已读邮件就会没有限制的积累在服务器上。这对服务器来说无疑是一个不受欢迎的行为。当邮筒中积累成百上千的邮件时,情况更为恶化,有限设计的POP3的邮件处理效率成了一个问题。
因此,推荐大规模多用户服务器,尤其用户都是通过POP3来获取邮件的,考虑一下下面的选项:
l 每个用户的邮筒大小做限制
这个方法的缺点是可能使用户邮筒无法收取新的邮件。使用这种方法的站点需要提前告知用户空间的枯竭,可以通过在用户的邮筒中插入一个警告邮件。
l 强制不保留邮件在服务器
服务器可以很简单对于存储空间和是否保留已读或未读的邮件在服务器建立相应的本地策略。例如,服务器会在60天后删除未读邮件,在7天后删除已读邮件。这样删除超出了POP3协议的范围,并也违反协议。
实施删除策略的服务器,必须提前让用户知道这一策略。
客户端不能假设这种策略会自动清除邮件,还是需要使用DELE命令来明确的删除邮件。
需要注意的是,删除政策会让用户觉得很混乱,因为用户设置了将邮件存储在服务器,但是实际服务器并没有这么做。
更为特殊的侧率是邮件只能从服务器下载一次,在下载完成之后即被删除。服务器POP3软件可能是这样执行的:”在用户执行QUIT命令后,删除用户通过RETR命令下载的所有邮件”。当连接异常退出时,并不删除邮件(例如,没有收到客户端的QUIT命令),因为客户端可能没有正确的接受并存储邮件。执行下载即删除侧率的服务器也需要禁用或限制TOP附加命令,因为这个命令可以下载整个邮件。
9、 POP3命令总结
基本POP3命令:
USER name valid in the AUTHORIZATION state
PASS string
QUIT
STAT valid in the TRANSACTION state
LIST [msg]
RETR msg
DELE msg
NOOP
RSET
QUIT
扩展POP3命令:
APOP name digest valid in the AUTHORIZATION state
TOP msg n valid in the TRANSACTION state
UIDL [msg]
POP3 响应:
+OK
-ERR
10、POP3会话示例
S: <wait for connection on TCP port 110>
C: <open connection>
S: +OK POP3 server ready <1896.697170952@dbc.mtview.ca.us>
C: APOP mrose c4c9334bac560ecc979e58001b3e22fb
S: +OK mrose’s maildrop has 2 messages (320 octets)
C: STAT
S: +OK 2 320
C: LIST
S: +OK 2 messages (320 octets)
S: 1 120
S: 2 200
S: .
C: RETR 1
S: +OK 120 octets
S: <the POP3 server sends message 1>
S: .
C: DELE 1
S: +OK message 1 deleted
C: RETR 2
S: +OK 200 octets
S: <the POP3 server sends message 2>
S: .
C: DELE 2
S: +OK message 2 deleted
C: QUIT
S: +OK dewey POP3 server signing off (maildrop empty)
C: <close connection>
S: <wait for next connection>

没有评论:

发表评论