POP3协议详解

基本介绍

POP3是一种用于从邮件服务器获取电子邮件的协议。它允许邮件客户端连接到邮件服务器,检索服务器上存储的邮件,并将邮件下载到客户端设备上。POP3的工作原理如下:

  1. 连接和身份验证: 邮件客户端通过TCP/IP连接到邮件服务器的POP3端口(通常是110)。客户端首先发送USER​命令提供用户名,然后发送PASS​命令提供密码以进行身份验证。
  2. 查看邮件状态: 客户端可以使用STAT​命令来查看邮箱中的邮件状态,包括邮件数量和总字节数。
  3. 查看邮件列表: 使用LIST​命令,客户端可以查看每封邮件的索引号和大小。如果提供邮件索引号,服务器将返回特定邮件的大小。
  4. 检索邮件: 使用RETR​命令,客户端可以检索特定邮件的内容,包括邮件头和正文。邮件被下载到客户端设备上。
  5. 删除邮件: 使用DELE​命令,客户端可以标记要删除的邮件。邮件在标记为删除后不会立即从服务器上删除,直到客户端执行QUIT​命令。
  6. 退出: 使用QUIT​命令,客户端结束POP3会话并断开连接。在断开连接之前,标记为删除的邮件将从服务器上删除。

相关概念

  • 邮件收件箱(Mailbox): 邮件服务器上存储用户接收到的电子邮件的地方。每个用户都有一个邮箱,其中包含他们的电子邮件。
  • 命令和响应: POP3协议使用一系列命令和响应进行通信。客户端发送命令(例如,USER​​,PASS​​,LIST​​等),服务器返回响应(例如,+OK​​表示成功,-ERR​​表示错误)。
  • 邮件索引号(Message Number): 每封邮件在邮箱中都有一个唯一的索引号。客户端可以使用索引号来指定要执行的操作,如检索或删除邮件。
  • 邮件大小(Message Size): 邮件的大小以字节为单位。LIST​​命令返回每封邮件的大小,以便客户端可以了解邮件的大小信息。
  • 标记为删除: 客户端可以使用DELE​​命令将邮件标记为删除。标记为删除的邮件在QUIT​​命令之前不会从服务器上真正删除。
  • 邮件头和正文: 邮件通常由邮件头和正文组成。邮件头包含元数据,如发件人、主题和日期。邮件正文包含邮件的实际内容。
  • MIME(Multipurpose Internet Mail Extensions): MIME是一种电子邮件标准,用于描述邮件内容的类型和格式,包括文本、HTML、图像和附件等。
  • 连接池(Connection Pool): 一些POP3客户端使用连接池来管理与邮件服务器的连接,以提高性能和效率。

POP3命令与响应

Transaction State

一旦客户机成功地向 POP3服务器标识了自己并且 POP3服务器已经锁定并打开了相应的邮件包, POP3会话现在处于 TRANSACTION 状态. 重复发出以下任何 POP3命令命令,POP3服务器发出响应 发出 QUIT 命令,POP3会话进入 UPDATE 状态。

STAT命令

  • STAT​:查询邮箱中邮件的统计信息,包括邮件数量和总字节数。

命令格式:

STAT

服务器应该响应一个包含两个值的响应:邮件数量和邮箱中所有邮件的总字节数。响应的格式如下:

+OK <邮件数量> <总字节数>

LIST命令

获取邮件服务器返回每封邮件的详细信息,包括邮件的索引号和大小。

命令格式:

LIST [<message_number>]
  • <message_number>​ 是可选的参数,用于指定要列出的特定邮件的索引号。如果省略了此参数,则会列出所有邮件的信息。

服务器会以以下格式响应LIST​命令:

如果未指定<message_number>​(列出所有邮件):

+OK <邮件总数> messages (<邮件总大小> octets)
<邮件1的索引号> <邮件1的大小>
<邮件2的索引号> <邮件2的大小>
...
<邮件n的索引号> <邮件n的大小>
.
  • +OK​ 表示命令执行成功。
  • <邮件总数>​ 是邮箱中邮件的数量。
  • <邮件总大小>​ 是所有邮件的总大小(以字节为单位)。
  • 每行中的 <邮件i的索引号>​ 表示第i封邮件的索引号。
  • 每行中的 <邮件i的大小>​ 表示第i封邮件的大小(以字节为单位)。

如果指定了<message_number>​(列出特定邮件):

+OK <邮件索引号> <邮件大小>
  • +OK​ 表示命令执行成功。
  • <邮件索引号>​ 是指定邮件的索引号。
  • <邮件大小>​ 是指定邮件的大小(以字节为单位)。

RETR

检索特定邮件的内容,其中邮件的索引号由客户端指定。RETR命令可用于下载邮件的正文和标头。

命令格式:

RETR <message_number>

服务器会以以下格式响应RETR​命令:

如果命令执行成功:

+OK
<邮件内容>
.
  • +OK​ 表示命令执行成功。
  • <邮件内容>​ 包含了邮件的完整内容,包括邮件头和正文。通常,邮件内容以文本格式返回。
  • 最后一行的.​(句号)表示邮件内容的结束。

如果命令执行失败(邮件不存在或索引号无效):

-ERR <错误消息>
  • -ERR​ 表示命令执行失败。
  • <错误消息>​ 包含有关失败原因的描述。

DELE

标记特定邮件以删除它们,但不会立即从服务器上删除它们。删除操作只有在客户端执行QUIT​命令时才会生效。

命令格式:

DELE <message_number>

**服务器响应: **

如果命令执行成功(邮件被成功标记为删除):

+OK Message <message_number> deleted
  • +OK​ 表示命令执行成功。
  • <message_number>​ 是已标记为删除的邮件的索引号。

如果命令执行失败(邮件不存在或索引号无效):

-ERR <错误消息>
  • -ERR​ 表示命令执行失败。

    • <错误消息>​ 包含有关失败原因的描述。

NOOP

它不执行任何实际的操作。它的主要目的是告诉邮件服务器,客户端仍然活跃,正在使用连接,以防止连接因长时间不活动而被服务器关闭。

REST

重置或取消标记为删除的邮件,以便这些邮件不会被删除。
RSET命令通常用于撤销之前使用DELE命令标记为删除的邮件。

命令格式:

RSET

命令响应:

如果命令执行成功:

+OK
  • +OK​ 表示命令执行成功。

如果命令执行失败(通常是因为RSET​命令不支持或出现其他问题):

-ERR <错误消息>
  • -ERR​ 表示命令执行失败。
  • <错误消息>​ 包含有关失败原因的描述。

UPDATE State

QUIT

告知邮件服务器客户端已经完成了邮件收取或管理任务,并请求结束与服务器的连接。

Optional命令

TOP

检索邮件的头部信息和指定行数的邮件正文。
TOP​命令允许客户端请求邮件服务器返回特定邮件的头部信息和部分邮件正文,以减少数据传输量和加快邮件检索速度。

命令格式:

TOP <message_number> <number_of_lines>
  • <message_number>​ 是要检索的邮件的索引号。客户端必须提供一个有效的索引号,以指示要检索的邮件。
  • <number_of_lines>​ 是要返回的邮件正文的行数。客户端可以指定要检索多少行邮件正文,通常用于查看邮件的摘要信息。

响应:

+OK
<邮件头部信息>
<邮件正文的前n行>
.
  • +OK​ 表示命令执行成功。
  • <邮件头部信息>​ 包含了邮件的头部信息,如发件人、主题、日期等。
  • <邮件正文的前n行>​ 包含了指定行数的邮件正文。
  • 最后一行的.​(句号)表示邮件内容的结束。

UIDL

检索每封邮件的唯一标识符(UID)。每封邮件都分配了一个唯一的UID,通常用于客户端在与服务器交互时标识邮件,而不仅仅依赖于邮件的序号。

命令格式:

UIDL [message_number]

响应

+OK
<message_number> <UID>
  • +OK​ 表示命令执行成功。
  • <message_number>​ 是邮件的索引号。
  • <UID>​ 是邮件的唯一标识符(UID)。

USER

USER​命令是POP3(Post Office Protocol Version 3)协议中的一条命令,用于向邮件服务器提供登录用户名。USER​命令通常是POP3会话的第一步,用于标识客户端要使用的邮箱账户。

PASS

PASS​命令是POP3(Post Office Protocol Version 3)协议中的一条命令,用于向邮件服务器提供登录密码以完成身份验证。一般情况下,在使用USER​命令提供用户名后,客户端必须使用PASS​命令提供相应的密码,以便访问邮箱账户。

APOP

APOP​(Authenticated Post Office Protocol)是POP3(Post Office Protocol Version 3)协议的一种认证机制。它是一种用于安全地认证邮件客户端与邮件服务器之间的身份的方法。与普通的POP3用户名和密码认证不同,APOP​使用一种基于哈希函数的挑战-响应机制来认证客户端的身份。

以下是APOP​认证的工作原理:

  1. 邮件服务器生成一个随机的挑战字符串,通常是一个长字符串,称为挑战值(challenge)。
  2. 邮件服务器将挑战值与密码的哈希值进行拼接,并计算拼接后的字符串的MD5哈希值。这个MD5哈希值称为响应值(response)。
  3. 邮件服务器将挑战值发送给客户端。
  4. 客户端收到挑战值后,将自己的密码和挑战值拼接,并计算拼接后的字符串的MD5哈希值,得到自己的响应值。
  5. 客户端将自己的用户名和响应值发送给邮件服务器。
  6. 邮件服务器收到客户端的响应后,会检查客户端的用户名是否存在,并将客户端的响应值与邮件服务器计算的响应值进行比较。
  7. 如果客户端的响应值与邮件服务器的响应值匹配,服务器将认为客户端通过了认证,允许客户端访问邮箱。

APOP​认证的优点是它通过使用挑战-响应机制,使得在网络上传输的密码不会以明文形式传输,从而提高了安全性。这种认证机制确保只有知道正确密码的客户端才能通过认证。

请注意,APOP​认证是一种POP3协议的扩展认证机制,因此并不是所有邮件服务器和邮件客户端都支持它。在使用APOP​认证之前,确保您的邮件服务器和客户端都支持此认证方式。

Go语言解析POP3

解析头部

  1. 通过mail.ReadMessage来解析邮件内容

    message, err := mail.ReadMessage(strings.NewReader(source))
    if err != nil {log.Error(err)return
    }
    
  2. 通过解析出来message内部的Header结构可以获取指定key的信息
    常见key有: From​、To​、Subject​、Date​、Content-Type​、Content-Transfer-Encoding

    from := message.Header.Get("From")
    to := message.Header.Get("To")
    subject := message.Header.Get("Subject")
    date := message.Header.Get("Date")
    message.Header.Get("Content-Type")
    message.Header.Get("Content-Transfer-Encoding")
    
  3. Header实际是个map, 所以可以通过for循环的方式遍历

    for k, v := range message.Header {blog.Info("key: ", k, "  value:", v)
    }
    

解析body

通常body会带有多行, 并且最后带有.结束符, 所以我们需要将这些过滤掉

	str := strings.ReplaceAll(string(body), "\r\n", "")str = strings.ReplaceAll(str, ".", "")

具体需要使用解析算法需要注根据Content-Transfer-Encoding来判断,比较常用的两种邮件编码方式为BASE64和Quoted-printable。后来的扩展 SMTP协议允许直接在邮件中传递二进制数据,而不用对它们进行邮件编码,人们将这种没有进行邮件编码的二进制数据的邮件内容称为8bit编码,为了与此 相区别,人们将没有进行邮件编码的纯ASCII码字符的邮件称为7bit编码。MIME消息体的邮件编码方式通过MIME消息头中的Content- Transfer- Encoding头字段指定,每种邮件编码方式的介绍如下:

  • 7Bit: 指消息体内容全部是没有经过编码的ASCII字符。
  • 8Bit: 指消息体内容是没有经过编码的原始数据,且其中包含有非ASCII字符的数据。现在的邮件服务器基本上都支持8Bit编码,使用支持8Bit编码的邮件服务器可以简化邮件的处理过程。
  • BASE64: Base64是将二进制数据转换成可打印的ASCII字符的一种最常见的编码方式,它的基本原理是将一组连续的字节数据按6个bit位进行分组,然后对每组数据用一个ASCII字符来表示。
  • Quoted-printable: 一种将二进制数据转换成可打印的ASCII字符的编码方式,它对ASCII字符不进行转换,只对非ASCII字符的数据进行编码转 化。

指消息体内容全部是没有经过编码的ASCII字符。

使用base64解析示例:

	decodedBody, err := base64.StdEncoding.DecodeString(str)if err != nil {log.Fatal("Error decoding Base64:", err)}log.Info(string(decodedBody))

参考资料

inbucket smtp,pop3,restful服务

pop3协议分析

docker使用Inbucket搭建邮件服务器用于接受邮件

rfc1939

Multipurpose Internet Mail Extensions(RFC2045)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/240669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB Mobile - 使用预训练网络对手机拍摄的图像进行分类

系列文章目录 前言 此示例说明如何使用深度学习对移动设备摄像头采集的图像进行分类。 在您的移动设备上安装和设置 MATLAB Mobile™。然后&#xff0c;从 MATLAB Mobile 的“设置”登录 MathWorks Cloud。 在您的设备上启动 MATLAB Mobile。 一、在您的设备上安装 MATLAB M…

qt项目-《图像标注软件》源码阅读笔记-Command类绘图及其子类

目录 1. Command 概览 2. Command2D 1. Command 概览 功能&#xff1a;命令栈基类&#xff0c;用来实现撤销和重做功能。 其子类Command2D和Command3D都是实现父类方法&#xff0c;除了构造函数没有自己的独有方法。 字段&#xff1a; redoCommands&#xff1a;存储re…

【Python百宝箱】模型透明化:机器学习解释性方法深度解读

深入解析机器学习模型&#xff1a;解释性方法全景 前言 在机器学习领域&#xff0c;复杂的模型往往被视为“黑盒”&#xff0c;使得模型的预测结果难以理解。然而&#xff0c;随着对模型可解释性的需求不断增长&#xff0c;解释性方法应运而生&#xff0c;为我们提供了一扇了…

SpringBoot3-数据访问

文章目录 整合SSM场景1. 创建SSM整合项目配置数据源3. 配置MyBatis4. CRUD编写5. 自动配置原理6. 快速定位生效的配置7. 扩展&#xff1a;整合其他数据源1. Druid 数据源 附录&#xff1a;示例数据库 整合SSM场景 SpringBoot 整合 Spring、SpringMVC、MyBatis 进行数据访问场景…

Django 安装

Django 安装 在安装 Django 前&#xff0c;系统需要已经安装了 Python 的开发环境。 如果你还没有安装 Python&#xff0c;请先从 Python 官网 https://www.python.org/ 下载并安装最新版本的 Python。 Django 安装也很简单使包管理工具 pip在终端中就可以了&#xff1a; p…

变量覆盖漏洞 [BJDCTF2020]Mark loves cat 1

打开题目 我们拿dirsearch扫描一下看看 扫描得到 看见有git字眼&#xff0c;那我们就访问 用githack去扒一下源代码看看 可以看到确实有flag.php结合index.php存在 但是当我去翻源代码的时候却没有翻到 去网上找到了这道题目的源代码 <?phpinclude flag.php;$yds &qu…

JWT是什么?它有什么用?

1. 什么是 JWT&#xff1f; JWT是 JSON Web Token 的缩写&#xff0c;通过数字签名的方式&#xff0c;以 JSON 对象为载体&#xff0c;在不同的服务器终端之间安全传输的信息。 2. JWT 有什么用&#xff1f; JWT 最常见的场景就是授权认证&#xff0c;一旦用户登录&#xff…

系列八、VMWare无法启动CentOS7问题排查 解决

一、VMWare无法启动CentOS7 1.1、问题描述 今天在测试代码的时候&#xff0c;需要用到Linux&#xff0c;然后就打开VMWare进行启动&#xff0c;但是启动的时候发现无法启动起来&#xff0c;报了一个如下的错误&#xff1a; 出现了问题那就要解决问题&#xff0c;然后想起来前几…

Koordinator 支持 K8s 与 YARN 混部,小红书在离线混部实践分享

作者&#xff1a;索增增&#xff08;小红书&#xff09;、宋泽辉&#xff08;小红书&#xff09;、张佐玮&#xff08;阿里云&#xff09; 背景介绍 Koordinator 是一个开源项目&#xff0c;基于阿里巴巴在容器调度领域多年累积的经验孵化诞生&#xff0c;目前已经支持了 K8s…

【数据结构】线段树算法总结(单点修改)

知识概览 用作单点修改的线段树有4个操作&#xff1a; pushup&#xff1a;由子节点的信息计算父节点的信息build&#xff1a;初始化一棵树modify&#xff1a;修改一个区间query&#xff1a;查询一个区间 线段树用一维数组来存储&#xff1a; 编号是x的节点&#xff0c;它的父节…

Redis vs Memcached 哪一个更适合你的应用程序?

介绍 Redis和Memcached都是流行的内存缓存解决方案。它们都可以提高应用程序的性能&#xff0c;但它们之间有一些重要的区别。在本文中&#xff0c;我们将比较Redis和Memcached&#xff0c;并讨论哪一个更适合你的应用程序。 Redis Redis是一个开源的内存数据结构存储系统。…

hive中array相关函数总结

目录 hive官方函数解释示例实战 hive官方函数解释 hive官网函数大全地址&#xff1a; hive官网函数大全地址 Return TypeNameDescriptionarrayarray(value1, value2, …)Creates an array with the given elements.booleanarray_contains(Array, value)Returns TRUE if the a…

【MySQL工具】pt-online-schema-change源码分析

通过阅读源码 更加深入了解原理&#xff0c;以及如何进行全量数据同步&#xff0c;如何使用触发器来同步变更期间的原表的数据更改。(&#xff3e;&#xff0d;&#xff3e;)V 目录 源码分析 Get configuration information. Connect to MySQL. Create --plugin. Setup la…

使用 ElementUI 组件构建无边框 Window 桌面应用(WinForm/WPF)

生活不可能像你想象得那么好,但也不会像你想象得那么糟。 我觉得人的脆弱和坚强都超乎自己的想象。 有时,我可能脆弱得一句话就泪流满面;有时,也发现自己咬着牙走了很长的路。 ——莫泊桑 《一生》 一、技术栈 Vite + Vue3 + TS + ElementUI(plus) + .NET Framework 4.7.2…

166. 数独(DFS之剪枝与优化:位运算优化,优化搜索顺序,.可行性剪枝)

166. 数独 - AcWing题库 数独 是一种传统益智游戏&#xff0c;你需要把一个99 的数独补充完整&#xff0c;使得数独中每行、每列、每个 33 的九宫格内数字 1∼9 均恰好出现一次。 请编写一个程序填写数独。 输入格式 输入包含多组测试用例。 每个测试用例占一行&#xff0…

[管理者与领导者-129]:很多人对高情商的误解,工程师要扩展自己的情商吗?工程师如何扩展自己的情商?

目录 前言&#xff1a; 一、什么是高情商&#xff1f; 1.1 什么是高情商 1.2 情商的五大能力 1.3 高情商的层次 1.4 对高情商的误解? 二、工程师需要发展自己的高情商吗&#xff1f; 三、工程师如何扩展自己的情商&#xff1f; 四、什么样的“高情商”的管理者令人讨…

ZZ014城市轨道交通运营与维护赛题第7套

ZZ014城市轨道交通运营与维护赛题第7套 模块1赛题 模块序号 模块1 对应赛项编号 ZZ014 模块名称 城市轨道交通运营服务 子任务数量 12 竞赛时间 60分钟 任务描述 行车组织作业、票务设备故障处置以及突发事件应急处理 职业要素 R基本专业素养 R专业实践技能 R协…

.a库介绍和编译案例

.a库的介绍 库的名字一般是libxxxx.a,利用静态函数库编译成的文件比较大&#xff0c;是因为在链接阶段&#xff0c;会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件&#xff0c;对应的链接方式为静态链接。静态库的代码在编译时链接到应用程序中&#xff0c;因…

基于Mybatis-Plus进行查询封装

基于Mybatis-Plus进行查询封装 package com.test.common.orm.builder;import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.cache.Cache; import org.apache.ibatis.cache.impl.PerpetualCach…

前端 JS 安全对抗原理与实践

作者&#xff1a;vivo 互联网安全团队- Luo Bingsong 前端代码都是公开的&#xff0c;为了提高代码的破解成本、保证JS代码里的一些重要逻辑不被居心叵测的人利用&#xff0c;需要使用一些加密和混淆的防护手段。 一、概念解析 1.1 什么是接口加密 如今这个时代&#xff0c;…