pop3协议

 POP3邮件服务器通过侦听TCP端口110提供POP3服务。客户端软件读取邮件之前,需要事先与服务器建立TCP连接。连接成功后,POP3服务器会向该客户端发送确认消息。然后客户端根据服务器回送的信息决定下一步的操作。
 客户端每次向POP3服务器发送命令后,都要等待服务器响应,并处理接收的信息,然后再接着发送下一个命令,如此往复多次,一直持续到连接终止。这个过程经历了三个状态:授权(AUTHORIZATION)状态、操作(TRANSACTION)状态和更新(UPDATE)状态。

POP3服务器回送的响应信息由一个状态码和一个可能跟有附加信息的命令组成。所有响应也以回车换行结束(发送命令也是)。状态码有两种:“确定”(“+OK”)和“失败”(“-ERR”)。对于客户端发送的每一条命令,服务器都会回送状态码。因此在客户端程序中,可以通过服务器回送的状态码对应的字符,即判断第一个字符是“+”号还是“-”号来确定服务器是否正确响应客户端发送的命令。

1. 授权状态
客户端首先与POP3服务器建立TCP连接,服务器接收后发送一个单行的确认信息。例如“+OK POP3 server ready”,此时POP3会话就进入了授权状态。在授权状态,客户需要向服务器发送用户名和密码进行确认。
假设用C表示客户端(Client),S表示服务器端(Server),下面是客户端接收邮件前需要与服务器传输的信息。
1) 发送用户名。
    语法形式:USER <用户名>
    功能:将客户的用户名发送到服务器。
    服务器返回:+OK正确的用户名;-ERR错误的用户名。
    示例:C:USER myname@126.com
          S:+OK welcome on this server.
    上述两行代码的含义为:客户端发送“USER myname@126.com”,服务器端回送信息“+OK welcome on this server.”。
2) 用户名确认成功后,需要输入密码。
    语法形式:PASS <密码>
    功能:将客户的密码发送给服务器。
    服务器返回:+OK正确的用户名;-OK错误的用户名。
    示例:C:PASS ***** 
          S:+OK myname logged in at 19:04
授权成功后,进入操作状态。
2. 操作状态
客户端向服务器成功确认了自己的身份后,POP3会话将进入操作状态,客户就可以执行POP3命令进行相应的操作。对于每个命令,服务器都会返回应答信息。下面是在操作状态中使用的命令。
(1) STAT命令
    语法形式:STAT
    功能:从服务器中获取邮件总数和总字节数。
    服务器返回:邮件总数和总字节数。
    示例:C:STAT
          S:+OK 2 320
(2) LIST命令
    语法形式:LIST
    功能:从服务中获得邮件列表和大小。
    服务器返回:列出邮件列表和大小。
    示例:C:LIST(LIST命令针对pop3邮箱会首先返回+ok 邮件总数 邮件总大小,但对于pop邮箱则只返回+ok状态字符,因此最好还是通过STAT来判断邮件总数)
          S:+OK 2 messages (320 octets)
          S:1  120
          S:2  200
          S: .
(3) RETR命令
    语法形式:RETR  <邮件的序号> 
    功能:从服务器中获得一个邮件。
    服务器返回:+OK成功;-ERR错误。
    示例:C:    RETR 1
          S:+OK 120 octets
          S:<服务器发送信件1内容>
          S: .
    注意,这里的“.”是单独发送的。
 (4) DELE命令
    语法形式:DELE <邮件的序号> 
    功能:服务器将邮件标记为删除,当执行QUIT命令时才真正删除。(可以通过RSET 命令进行撤消删除 )
    服务器返回:+OK成功;-ERR错误。
    示例:C:DELE 1
          S:+OK 1 Deleted
    当客户发送QUIT命令时,会话进入更新状态。
3. 更新状态
    当客户在操作状态下发送QUIT命令后,会话进入更新状态。
    QUIT命令
    语法形式:QUIT 
    功能:关闭与服务器的连接。
    服务器返回:+OK;-ERR。
    示例:C:QUIT
          S:+OK
    然后服务器自动断开与该客户端的TCP连接。
邮件的未读和已读

uidl命令 格式:uidl [n] 参数n可选,n为邮件编号uidl命令,与list同,不过显示邮件的信息比list更详细,更具体  

通过此命令来返回对应邮件的唯一号,然后在本地判断是否已读或未读。

针对上面的命令,写了一个没有进行pop3解码的接收邮件的客户端,源代码如下:/Files/fujinliang/ReceiveMailExample.rar

接下来将会对pop3解码相关东西进行深入学习 

原文地址:https://www.cnblogs.com/fujinliang/p/2570764.html