POP3(邮局协议3)是用于接收电子邮件的标准协议的最新版本。POP3是一种客户端/服务器 协议,是TCP/IP协议族中的一员,由RFC1939 定义。

默认情况下,POP3协议可在两个端口上运行:

  • 端口110 –这是默认的POP3非加密端口;
  • 端口995 –如果要安全地使用POP3连接,则需要使用此端口。

POP3命令

电子邮件客户端用来从POP3服务器检索邮件的命令是一系列文本命令,邮件服务器具有单行响应。此处使用的命令和示例由RFC 1939邮局协议–版本3定义。

其中,我们熟知POP3连接中最常用的命令如下:

USER
PASS
STAT
LIST
RETR
QUIT

我们使用wiresharl抓包:

其中<用户名>和<密码>是您邮箱的用户名和密码。这些作为纯文本传递到邮件服务器,并且不进行任何加密。wiresharl抓包如下:

对于POP3客户端发送的每一条命令,POP3服务器都将回应一些响应信息。响应信息由一行或多行文本信息组成,其中的第一行始终以“+OK”或“-ERR”开头。wiresharl抓包如下:


命令失败,wiresharl抓包如下: :

在此状态值之后,通常会显示更多信息(+ OK表示您的命令成功,而-ERR则命令失败),以指示错误原因或命令成功的结果。

static bool response_is_continuation(const char *data)
{if (strncmp(data, "+OK", strlen("+OK")) == 0)return false;if (strncmp(data, "-ERR", strlen("-ERR")) == 0)return false;return true;
}

POP3命令示例

使用USER 、PASS 命令登录

要打开与POP3服务器的连接,请在Windows或UNIX系统上打开命令行或控制台,然后输入以下命令:

telnet 110

例如,当本地输入命令”telnet pop.163.com 110”
其中,是要连接的POP3邮件服务器的名称或ip地址。建立连接后,您将看到类似于以下内容的服务器响应:

这表明服务器已准备就绪,正在等待您的用户名和密码。发送这些详细信息之前,您无法对服务器执行任何操作。

在本地分别输入命令USER+邮箱,服务器先返回一个ACK确认包,然后再返回一个POP3报文,本地收到后也返回一个ACK确认包给服务器。

接着本地输入命令PASS+密码,服务器认证成功后,开始进入处理阶段。注意,密码是采用明文传输的,在报文上是可以看到的 。

在终端上输入:

USER myusername
PASS mysecretpassword

成功登录后,您可以通过告诉服务器成功(+ OK)来查看服务器的响应

使用STAT命令显示消息数

STAT命令显示当前在邮箱中的邮件数和大小(以字节为单位),如以下示例所示:

STAT
+OK 7 163638

wiresharl抓包如下:

首次登录时,可能已经显示了邮件数量,但是此行为会因所使用的邮件服务器软件而异。STAT命令可靠地提供此信息。

LIST命令显示消息摘要

LIST命令用于列出邮箱中的邮件信息,当本地输入命令LIST时,服务器直接用POP3报文进行响应。

与STAT一样,您也可以使用LIST来获取消息摘要,其中每个消息编号均以字节旁边的大小显示。在下面的示例中显示:

LIST
+OK
1 10515
2 10523
3 3928
.

wiresharl抓包分析:

与所有POP3命令一样,状态响应仅占一行。由于此特定命令在初始状态行之后返回数据行,因此使用一个句点,然后用回车和换行符指示数据结束。

使用RETR命令检索消息

RETR命令用于获取某封邮件的内容,使用RETR命令后跟一个消息号来检索特定消息。使用wiresharl抓包分析:

服务器以+ OK响应以指示成功,并在第一行上显示消息的大小(以字节为单位)。

使用QUIT结束POP3对话

完成POP3会话后,只需使用POP3 QUIT命令注销即可


pop3协议解析及实现

int main(int argc, char* argv[])
{char errbuf[1024];pcap_t *desc = 0;char *filename = argv[1];if (argc != 2){printf("usage: ./dissect_syslog [pcap file]\n");return -1;}return 0;
}

编译运行:

总结

通过上面的解析,发送方(客户端)和接收方(服务器)间创建连接之后,接下来是一个合法的POP3会话。主要使用USER ,PASS ,STAT,LIST,RETR,QUIT等。如果对POP3通信过程不了解,请参考官方RFC文档。

参考:https://tools.ietf.org/html/rfc1939

欢迎关注微信公众号【程序猿编码】,需要完整POP3源码和报文的添加本人微信号(17865354792)

pop3协议解析及代码实现相关推荐

  1. c语言gga字符串校验和代码,NMEA-0183协议解析(示例代码)

    NMEA-0183 NMEA 0183是美国国家海洋电子协会(National Marine Electronics Association )为海用电子设备制定的标准格式.目前业已成了GPS导航设备 ...

  2. 邮件访问协议!IMAP协议解析

    今天我们又来讲讲邮件协议,如果您曾经设置过电子邮件帐户,则可能会询问您要使用哪种电子邮件协议(POP或IMAP),对于POP,我们在这篇文章上有讲解<pop3协议解析及代码实现>.当我们所 ...

  3. DNS传输协议解析!pcap报文中的域名获取

    回想一下,当我们想访问谷歌的时候,通常输入域名(网址):https://www.google.com,其实这就是一个域名. DNS 解析过程涉及将主机名(例如 https://www.google.c ...

  4. java pop3 接收邮件_JavaMail使用POP3协议接收并解析电子邮件

    JavaMail使用POP3协议接收并解析电子邮件 代码片段:public static void main(String[] args) throws Exception { receive(); ...

  5. TFTP协议解析及C/C++代码实现

    TFTP 用于以非常简单的方式传输文件.与其他文件传输协议(如:FTP 或 HTTP)相比,TFTP 更简单,代码量也更小,因此更易于实现. 通常,TFTP 使用 UDP 作为其传输协议.众所周知的 ...

  6. UDT协议解析及C/C++代码实现

    基于 UDP 的协议 (UDT) 是一种高性能数据传输协议.用于广域高速网络上的分布式数据密集型应用程序. UDT 使用 UDP 传输具有自己的可靠性控制和拥塞控制机制的批量数据. 新协议可以以比 T ...

  7. spring boot 中使用 POP3协议读取并解析邮件

    spring boot 中使用 POP3协议读取并解析邮件 1.邮箱授权 QQ邮箱授权,打开 "设置" 切换到 "账户" 找到下图中设置,开启 "PO ...

  8. MongoDB数据库协议解析及C/C++代码实现

    MongoDB 是由 MongoDB Inc 开发的 NoSQL 数据库,它是无模式的.它是使用 c++ 和 javascript 设计和创建的,允许更高的连接性. MongoDB 是一个 NoSQL ...

  9. Oracle(TNS)协议解析及C/C++代码解析

    Oracle客户端和服务器使用TNS作为其数据交换协议. 它提供了一种对用户透明的层, 为不同的工业标准协议提供统一, 通用的接口. 基本上是TNS以这样的方式指定了端口1521上的会话是" ...

  10. MySQL协议解析及C/C++代码实现

    MySQL 常用于许多知名网站,包括 Facebook.Google.Twitter 和 YouTube等等.它于 1995 年首次发布.MySQL 是用 C 和 C++ 编写的. MySQL 适用于 ...

最新文章

  1. ceph bluestore 源码分析:刷缓存(trim)逻辑
  2. 零基础学python多久可以工作-零基础学习python,要多久才可以学好并且找到工作?...
  3. 线性可分 与线性不可分
  4. AndroidStudio 集成环信的一个坑
  5. A folder failed to be moved——Android SDK的安装问题解决方案
  6. 徒手撸一个简单的 IOC
  7. Python 在字符串中处理html 和xml
  8. maven导入jar包时冲突的解决
  9. QT乱码总结2.gbk和ANSI和gb2312的区别
  10. 编程语言也环保?C语言领跑,Python、Perl垫底
  11. Unity3d中使用自带动画系统制作下雨效果(二)
  12. 前端 encodeURI 为什么要编码两次
  13. 最新关于高德地图定位失败10:定位服务启动、解决办法
  14. 微信小程序云开发实现一对一聊天
  15. python实现协同过滤推荐算法完整代码示例
  16. k8s中各组件和kube apiserver通信时的认证和鉴权
  17. 北大核心期刊2020_职称期刊论文发表 | 会计如何发表北大核心论文
  18. 鼠标手--IT人士/电脑使用者、网民的职业病,给网友们提个醒
  19. YY内置灯笼号挂号工具
  20. k-means python实现

热门文章

  1. Linux获取外网IP
  2. Excel不用知道sumifs函数也可以多条件求和
  3. QT使用PaddleOCR和百度OCR进行文字识别
  4. 恢复Redis被误删的数据
  5. 京东-黑客马拉松大赛复盘
  6. 南北互联网创业者的差异
  7. 为什么项目经理比程序员工资高?
  8. Unity XCode 拨号和一键加群
  9. 照相机和眼睛成像的基本原理
  10. Kinect图像成像原理