1、POP(Post Office Protocol):邮局协议。使用TCP的110端口。目前主要使用POP3。
1)简介
下图是POP的接口模型。在最高层,POP作为客户机和服务器之间的通信协议实现。它把邮件从一个地方移至另一个地方,使用基于文本的命令/应答对话机制(命令不区分大小写),并使用CRLF作为行的结束。缺省时,命令/应答序列是同步的,但POP提供了一个流水线扩展,放松了一次发送一个命令的要求。
信件通过SMTP最终投递到POP服务器,在客户机取出信件前,它们一直存储在远程信箱(一般是POP服务器上的一个标准邮件夹)中。POP客户机可以连接到服务器,取出信件,并删除它们。这就避免了使用PC作为服务器(因为PC可能不总是连接到网络),而且不需要在服务器上有一个MUA阅读电子邮件。
POP接口模型不提供发送邮件的方法(大多数PC没有全功能MTA,这要求它们的MUA把信件转交给有全功能MTA的机器。大多数MUA只是简单地包括足以把信件转交给一个SMTP中继服务器的代码)。原因很多(和IMAP一样),如:各个电子邮件协议由IETF的不同工作组处理,允许这些协议的模块化开发,对其他协议有最少的依赖。
2)会话状态:POP会话有三种状态,每个状态代表会话生命期中的特定阶段。
一个会话以authorization(验证)状态开始。在这个阶段,除了验证命令和quit外,其他命令都是非法的。
一旦客户机验证通过,服务器锁定信箱。这个锁是为了防止多个POP连接、IMAP连接或MUA从POP服务器更改信箱,但此时新的信件可以加入信箱(当前POP连接访问不到新信件)。信箱上锁后,服务器发出成功应答,会话改变成transaction(事务)状态。
会话保持在transaction状态,直到发出quit命令或会话异常终止。如果发出quit命令,状态改变成update(更新),服务器删除标记为删除的所有信件;如果会话异常终止(如客户端/服务器进程异常终止或自动注销定时器到时),服务器就不进入update状态,即使有等待的删除邮件。因为用户没有主动结束会话,所以没有办法确定是否重设(rset)了会话并取消任何等待的删除。不管会话是否正确终止,信箱上的锁都将被释放。
3)标准命令
POP应答的成功和失败分别使用“+OK”和“-ERR”指示。
可使用telnet与POP服务器交互,如telnet 0 110连接到本机的POP服务器(安装:apt-get install mailutils)。服务器收到到达的连接时,发出一行连接问候,指示服务器已经准备好会话。
## 服务器的连接问候。<>中依次是POP服务器进程的ID、服务器的当前时间戳以及主机名 +OK POP3 Ready <23360.1439647607@hanerfan>
(1)user命令:指定想要访问的信箱。信箱名可以是用户名(如安装mailutils后,本机上的用户名和相应的密码就可以分别用作user和pass的参数),或是与特定用户无关的特殊信箱。
注意,这里不管指定的信箱是否存在,服务器都会返回“+OK”,因为拒绝不合法信箱名的服务器会为可能的攻击者提供一个方便的方法以尝试合法的名字。只有在之后输入pass命令后,服务器才给出验证的结果。
(2)pass命令:用于为user命令指定的信箱提供密码以作验证。在分开命令和参数的初始空格后的任何空格被解释为密码的一部分。
服务器如果不能获得对信箱的独占访问锁,它将应答一个错误,且会话保持在authorization状态。
由下图可知,pass提供的密码在网络上以明文传输。
(3)apop命令:user和pass命令的一个替换。用法:apop mailbox md5-digest-string。略。
(4)quit命令:终止会话,并从服务器断开客户机。
(5)noop命令:空操作。防止一个自动注销定时器到时,或测试客户机是否仍连接到服务器。仅在transaction状态中是合法的。
(6)stat命令:请求信箱的大小信息(不包括标记为删除的信件)。仅在transaction状态中合法。
服务器的应答含有信箱中信件的数目和信箱的大小(字节数)。
一些服务器以内部格式存储信件,以实现性能的优化和所需存储空间的减少。而且,它们报告的大小也可能是基于内部存储格式的。
(7)list命令:请求信箱中某个特定信件或所有信件(不包括标记为删除的信件)的大小信息。仅在transaction状态中合法。
服务器的应答中含有message-number(1, 2, 3...)和对应信件的大小(字节数)。
(8)retr命令:取出某个信件(不能是标记为删除的信件)。仅在transaction状态中合法。
服务器的应答以只有一个句点的行作为结束。另外,正文中以"."开头的行都会额外添加一个"."(防止单个句点引起客户机提前结束信件的读取)。
(9)top命令:取出某个信件(不能是标记为删除的信件)的信头和指定的行数。仅在transaction状态中合法。
行数指定为0时,即只取出信头和空行分隔行。
(10)dele命令:标记指定的信件为删除信件。这些信件只有在发出quit命令后才被删除。仅在transaction状态中合法。
(11)rset命令:复位POP会话。被标记为删除的信件将取消标记,quit时不删除它们。不影响会话的状态。仅在transaction状态中合法。
(12)uidl命令:输出指定信件或所有信件(不包括标记为删除的信件)的唯一标识符。仅在transaction状态中合法。
在不同的POP会话之间,同一个信件的标识符是相同的。
4)示例。在命令行上使用POP访问163邮箱:
dig -t A pop.163.com。以下是部分输出:
;; QUESTION SECTION: ;pop.163.com. IN A ;; ANSWER SECTION: pop.163.com. 85859 IN CNAME pop3.163.idns.yeah.net. pop3.163.idns.yeah.net. 672 IN A 220.181.12.101
获取到IP后,再使用命令telnet 220.181.12.101 110连接到POP服务器。可以看到其后台使用的是coremail的系统:
Trying 220.181.12.101... Connected to 220.181.12.101. Escape character is '^]'. +OK Welcome to coremail Mail Pop3 Server (163coms[726cd87d72d896a1ac393507346040fas])
当然,这里只是作为一个测试的例子,因为使用user和pass验证是不安全的,而apop需要事先和服务器约定一个共享密钥,也不太现实。
参考资料:
《Internet Email协议开发指南》
不断学习中。。。