pop3协议解析及代码实现
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协议解析及代码实现相关推荐
- c语言gga字符串校验和代码,NMEA-0183协议解析(示例代码)
NMEA-0183 NMEA 0183是美国国家海洋电子协会(National Marine Electronics Association )为海用电子设备制定的标准格式.目前业已成了GPS导航设备 ...
- 邮件访问协议!IMAP协议解析
今天我们又来讲讲邮件协议,如果您曾经设置过电子邮件帐户,则可能会询问您要使用哪种电子邮件协议(POP或IMAP),对于POP,我们在这篇文章上有讲解<pop3协议解析及代码实现>.当我们所 ...
- DNS传输协议解析!pcap报文中的域名获取
回想一下,当我们想访问谷歌的时候,通常输入域名(网址):https://www.google.com,其实这就是一个域名. DNS 解析过程涉及将主机名(例如 https://www.google.c ...
- java pop3 接收邮件_JavaMail使用POP3协议接收并解析电子邮件
JavaMail使用POP3协议接收并解析电子邮件 代码片段:public static void main(String[] args) throws Exception { receive(); ...
- TFTP协议解析及C/C++代码实现
TFTP 用于以非常简单的方式传输文件.与其他文件传输协议(如:FTP 或 HTTP)相比,TFTP 更简单,代码量也更小,因此更易于实现. 通常,TFTP 使用 UDP 作为其传输协议.众所周知的 ...
- UDT协议解析及C/C++代码实现
基于 UDP 的协议 (UDT) 是一种高性能数据传输协议.用于广域高速网络上的分布式数据密集型应用程序. UDT 使用 UDP 传输具有自己的可靠性控制和拥塞控制机制的批量数据. 新协议可以以比 T ...
- spring boot 中使用 POP3协议读取并解析邮件
spring boot 中使用 POP3协议读取并解析邮件 1.邮箱授权 QQ邮箱授权,打开 "设置" 切换到 "账户" 找到下图中设置,开启 "PO ...
- MongoDB数据库协议解析及C/C++代码实现
MongoDB 是由 MongoDB Inc 开发的 NoSQL 数据库,它是无模式的.它是使用 c++ 和 javascript 设计和创建的,允许更高的连接性. MongoDB 是一个 NoSQL ...
- Oracle(TNS)协议解析及C/C++代码解析
Oracle客户端和服务器使用TNS作为其数据交换协议. 它提供了一种对用户透明的层, 为不同的工业标准协议提供统一, 通用的接口. 基本上是TNS以这样的方式指定了端口1521上的会话是" ...
- MySQL协议解析及C/C++代码实现
MySQL 常用于许多知名网站,包括 Facebook.Google.Twitter 和 YouTube等等.它于 1995 年首次发布.MySQL 是用 C 和 C++ 编写的. MySQL 适用于 ...
最新文章
- ceph bluestore 源码分析:刷缓存(trim)逻辑
- 零基础学python多久可以工作-零基础学习python,要多久才可以学好并且找到工作?...
- 线性可分 与线性不可分
- AndroidStudio 集成环信的一个坑
- A folder failed to be moved——Android SDK的安装问题解决方案
- 徒手撸一个简单的 IOC
- Python 在字符串中处理html 和xml
- maven导入jar包时冲突的解决
- QT乱码总结2.gbk和ANSI和gb2312的区别
- 编程语言也环保?C语言领跑,Python、Perl垫底
- Unity3d中使用自带动画系统制作下雨效果(二)
- 前端 encodeURI 为什么要编码两次
- 最新关于高德地图定位失败10:定位服务启动、解决办法
- 微信小程序云开发实现一对一聊天
- python实现协同过滤推荐算法完整代码示例
- k8s中各组件和kube apiserver通信时的认证和鉴权
- 北大核心期刊2020_职称期刊论文发表 | 会计如何发表北大核心论文
- 鼠标手--IT人士/电脑使用者、网民的职业病,给网友们提个醒
- YY内置灯笼号挂号工具
- k-means python实现