POP3邮件接收协议命令使用详解

时间:2022-12-06 19:03:36

第1章 POP3概述

POP3全称为Post Office Protocol version3,即邮局协议第3版。它被用户代理用来邮件服务器取得邮件。POP3采用的也是C/S通信模型,对应的RFC文档为RFC1939。该协议非常简单,所以我们只重点介绍其通信过程,而相关的一些概念和术语请参考RFC文档或另外一篇文章《SMTP协议分析》

第2章.POP3详解

2.1通信过程

用户从邮件服务器上接收邮件的典型通信过程如下。

1)       用户运行用户代理(如Foxmail, OutlookExpress)。

2)       用户代理(以下简称客户端)与邮件服务器(以下简称服务器端)的110端口建立TCP连接

3)       客户端向服务器端发出各种命令,来请求各种服务(如查询邮箱信息,下载某封邮件等)。

4)       服务端解析用户的命令,做出相应动作并返回给客户端一个响应。

5)       3)和4)交替进行,直到接收完所有邮件转到步骤6),或两者的连接被意外中断而直接退出。

6)       用户代理解析从服务器端获得的邮件,以适当地形式(如可读)的形式呈现给用户。

其中2)3)和4)用POP3协议通信。可以看出命令和响应是POP3通信的重点,我们将予以重点讲述。

2.2命令和响应

2.2.1.格式

POP3的命令不多,它的一般形式是:COMMAND  [Parameter]<CRLF>。其中COMMAND是ASCII形式的命令名,Parameter是相应的命令参数,<CRLF>回车换行(0DH, 0AH)

服务器响应是由一个单独的命令行组成,或多个命令行组成,响应第一行“+OK”或“-ERR”开头,然后再加上一些ASCII文本。+OK”和“-ERR”分别指出相应的操作状态是成功的还是失败的

2.2.2.三个状态

POP3协议中有三种状态,认正状态,处理状态,和更新状态。命令的执行可以改变协议的状态,而对于具体的某命令,它只能在具体的某状态下使用,这些请参看表1RFC193

客户机与服务器刚与服务器建立连接时,它的状态为认证状态;一旦客户机提供了自己身份并被成功地确认,即由认可状态转入处理状态;在完成相应的操作后客户机发出QUIT命令(具体说明见后续内容),则进入更新状态,更新之后又重返认可状态;当然在认可状态下执行QUIT命令,可释放连接。状态间的转移如图 1所示。

---建立连接---|认可|--认证成功--|处理|--执行QUIT--|更新
                 |_______ -QUIT
结束_________________|


  

       认可状态

       处理状态

       更新状态

       建立连接

       执行QUIT

       QUIT完毕

       执行QUIT,释放连接

       认证成功


2.2.3.一个例子

命令和响应的格式是语法,各命令和响应的意思则是语义,各命令和各响应在时间上的关系则是同步。我们还是通过以个简单的POP3通信过程来说明协议的这三个要素。

Ctelnetpop3.126.com 110   /* 以telnet方式连接126邮件服务器 */

S+OKWelcome to coremail Mail Pop3 Server(126coms[3adb99eb4207ae5256632eecb8f8b4855])/* +OK,代表命令成功,其后的信息则随服务器的不同而不同*/

CUSERbripengandre /*采用明文认证*/

S+OKcore mail

CPASSPop3world /*发送邮箱密码*/

S+OK654 message(s) [30930370 byte(s)] /*认证成功,转入处理状态 */

CLIST1 /*显示第一封邮件的信息 */

S+OK1 5184 ./*第一封邮件的大小为5184字节 */

CUIDL1 /*返回第一封邮件的唯一标识符 */

S+OK1 1tbisBsHaEX9byI9EQAAsd /*数字1后的长字符串就是第一封邮件的唯一标志符 */

CRETR1 /*下载第一封邮件 */

S+OK5184 octets /*第一封邮件的大小为5184字节 */

SReceive…  /* 第一封邮件的具体内容 */

S:…

CQUIT/*转入更新状态,接着再转入认证状态 */

S+OK

C: QUIT /* 退出连接 */

S+OKcore mail /*成功地退出了连接*/

对于上述的过程,补充如下几点内容。

1)       C:”开头的行(不包括"C")是客户端的输入,而以“S:”开头的行(不包括"S")则是服务器的输出。

2)       上述的命令并不一定会一次性成功,服务器会返回错误响应(以“-ERR”开头),客户端应该按照协议规定的时序,来输入后续的命令(或重复执行失败的命令,或重置会话,或退出会话等等)。

3)       上述过程是示意性的,实际过程可能与其有较大不同。例如,实际过程中可能使用加密认证(MD5摘要认证)。

4)       RETR下载下来的邮件可能会难以看懂,这是因为其可能使用了quoted-printable编码或base64编码,我们可用Foxmail等用户代理软件来解码它。

注意:命令与参数之间是空格分隔的。包括服务器返回的邮件信息中,邮件正文内容与其它信息也是用空格分隔的。当编写邮件程序时,就是利用空格符来判断哪是邮件内容,哪是邮件发送信息(如接收日期、发送地址等等,这些信息又是通过“:”来分隔的)。


另一种举例:

使用 telnet 连接本地pop服务器收信 
 例如:安装邮件服务器 IP 是 127.0.0.1(蓝色字体内容由客户端输入,红色字体内容是服务返回的,黑色为说明内容)   
telnet 127.0.0.1 110(使用 telnet 命令连接服务器 110 端口 )

  Trying 127.0.0.1… (正在连接服务器 110 端口)

Connected to 127.0.0.1( 连接服务器 110 端口成功)

  +OK Mail Server POP3 ready 
user username(输入用户名, username 为具体的用户名)

  +OK(执行命令成功 )
pass password (输入用户密码,password 为具体的密码)

  +OK 2 messages(密码认证通过)  (-ERR authorization failed --密码认证失败)

stat (邮箱状态 )
  +OK 2 6415 (2 为该信箱总邮件数,6415 为总字节数)

list (列出每封邮件的字节数 )
   +OK ( 执行命令成功,开始显示,左边为邮件的序号,右边为该邮件的大小 )
   1 537 (第 1 封邮件,大小为 537 字节)

   2 5878 ( 第 2 封邮件,大小为 5878 字节 )
top 1 (接收第 1 封邮件 )
       +OK (接收成功, 返回第 1 封邮件头 )

Return-Path: <allen.zhong@email-cm.com> 

Delivered-To: allen.zhong@email-cm.com 

Received: (server invoked for smtp delivery); Mon, 25 Oct 2004 14:24:27 +0800  

From: allen.zhong@email-cm.com

To: allen.zhong@email-cm.com 

Date: Mon, 25 Oct 2004 14:24:27 +0800

Subject: test mail  

(这个点是邮件结束标志)

retr 1 (接收第 1 封邮件 )

+OK (接收成功, 返回第 1 封邮件全部内容)

Return-Path: <allen.zhong@email-cm.com>  (退信地址,回复地址)

Delivered-To: allen.zhong@email-cm.com   [dɪ'lɪvəd]发送地址

Received: (server invoked for smtp delivery); Mon, 25 Oct 2004 14:24:27 +0800  

From: allen.zhong@email-cm.com  

To: allen.zhong@email-cm.com 

Date: Mon, 25 Oct 2004 14:24:27 +0800  

Subject: test mail   

  Hi, test2 (邮件正文前有一空格与前述信息分隔!)

     This is a test mail, you don’t reply it.  

. (这个点是邮件结束标志)

dele 1(删除第 1 封邮件)

  +OK(删除成功 )
dele 2 (删除第 2 封邮件)

  +OK(删除成功)  

quit (结束会话 )
   +OK (执行命令成功)


2.2.4.常用命令和响应

SMTP命令不区分大小写,但参数区分大小写,有关这方面的详细说明请参考RFC1939。常用的命令如表 1所示。

命令

参数

使用在何种状态中

描述

USER

Username

认证

此命令与下面的pass命令若成功,将导致状态转换

PASS

Password

认证

此命令若成功,状态转化为更新

APOP

Name,Digest

认证

DigestMD5消息摘要

STAT

None

处理

请求服务器发回关于邮箱的统计资料,如邮件总数和总字节数

UIDL

[Msg#](邮件号,下同)

处理

返回邮件的唯一标识符,POP3会话的每个标识符都将是唯一的

LIST

[Msg#]

处理

返回邮件的唯一标识符,POP3会话的每个标识符都将是唯一的

RETR

[Msg#]

处理

返回由参数标识的邮件的全部文本

DELE

[Msg#]

处理

服务器将由参数标识的邮件标记为删除,由QUIT命令执行

TOP

[Msg#]

处理

服务器将返回由参数标识的邮件的邮件头+n行内容,n必须是正整数

NOOP

None

处理

服务器返回一个肯定的响应,用于测试连接是否成功

QUIT

None

处理、认证

1)       如果服务器处于“处理”状态,么将进入“更新”状态以删除任何标记为删除的邮件,并重返“认证”状态。

2)       如果服务器处于“认证”状态,则结束会话,退出连接

1 POP3的常用命令

至于响应则如2.2.1所述,由“+OK”或“-ERR”开头,后跟一些可读的说明和一些其它参数(对RETR,这个参数就是邮件的内容)。更详细的说明请参考RFC1939

第3章.POP3 VS IMAP

POP3相对于因特网报文存取协议IMAPInternetMessage Access Protocol)的最大的不足是:它只是一个脱机协议,客户与服务器的交互性不是特别好。例如不能直接在邮箱中创建文件夹,不太好选择性地下载邮件的某部分(虽然TOP命令部分地实现了这个功能,但交互性不是很好)等。然而,它也有自己的优势,那就是协议简单,容易实现,成本低,这是POP3用得很广泛而IMAP几近淘汰的最重要的原因。

第4章 实现方案

ID

Protocol

Captured contents

user name

password

sender

receiver

subject

contents

attachments

5

POP3

 

2 POP3分析要求

2给出了协议分析要求。容易看出,获取各个字段是比较容易的。我们可以抓取客户端与服务器端的交互信息,然后根据各命令字或响应字来提取出我们想要的字段。例如,要获取user name,对于明文验证,我们只需检测到客户端的发送信息中出现USER这个时候,然后提取出USER命令后的参数即可。需要说明的是,虽然客户端与服务端交互的信息可能经过了编码或加密,但我们仍能够通过解码或解密来获得所需要的信息。