合肥公司制作网站的,wordpress数据库安装失败,简历在哪里制作免费,vs2005做网站基本介绍
POP3是一种用于从邮件服务器获取电子邮件的协议。它允许邮件客户端连接到邮件服务器#xff0c;检索服务器上存储的邮件#xff0c;并将邮件下载到客户端设备上。POP3的工作原理如下#xff1a;
连接和身份验证#xff1a; 邮件客户端通过TCP/IP连接到邮件服务器…基本介绍
POP3是一种用于从邮件服务器获取电子邮件的协议。它允许邮件客户端连接到邮件服务器检索服务器上存储的邮件并将邮件下载到客户端设备上。POP3的工作原理如下
连接和身份验证 邮件客户端通过TCP/IP连接到邮件服务器的POP3端口通常是110。客户端首先发送USER命令提供用户名然后发送PASS命令提供密码以进行身份验证。查看邮件状态 客户端可以使用STAT命令来查看邮箱中的邮件状态包括邮件数量和总字节数。查看邮件列表 使用LIST命令客户端可以查看每封邮件的索引号和大小。如果提供邮件索引号服务器将返回特定邮件的大小。检索邮件 使用RETR命令客户端可以检索特定邮件的内容包括邮件头和正文。邮件被下载到客户端设备上。删除邮件 使用DELE命令客户端可以标记要删除的邮件。邮件在标记为删除后不会立即从服务器上删除直到客户端执行QUIT命令。退出 使用QUIT命令客户端结束POP3会话并断开连接。在断开连接之前标记为删除的邮件将从服务器上删除。
相关概念
邮件收件箱Mailbox 邮件服务器上存储用户接收到的电子邮件的地方。每个用户都有一个邮箱其中包含他们的电子邮件。命令和响应 POP3协议使用一系列命令和响应进行通信。客户端发送命令例如USERPASSLIST等服务器返回响应例如OK表示成功-ERR表示错误。邮件索引号Message Number 每封邮件在邮箱中都有一个唯一的索引号。客户端可以使用索引号来指定要执行的操作如检索或删除邮件。邮件大小Message Size 邮件的大小以字节为单位。LIST命令返回每封邮件的大小以便客户端可以了解邮件的大小信息。标记为删除 客户端可以使用DELE命令将邮件标记为删除。标记为删除的邮件在QUIT命令之前不会从服务器上真正删除。邮件头和正文 邮件通常由邮件头和正文组成。邮件头包含元数据如发件人、主题和日期。邮件正文包含邮件的实际内容。MIMEMultipurpose 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 deletedOK 表示命令执行成功。message_number 是已标记为删除的邮件的索引号。
如果命令执行失败邮件不存在或索引号无效
-ERR 错误消息-ERR 表示命令执行失败。 错误消息 包含有关失败原因的描述。
NOOP
它不执行任何实际的操作。它的主要目的是告诉邮件服务器客户端仍然活跃正在使用连接以防止连接因长时间不活动而被服务器关闭。
REST
重置或取消标记为删除的邮件以便这些邮件不会被删除。 RSET命令通常用于撤销之前使用DELE命令标记为删除的邮件。
命令格式
RSET命令响应
如果命令执行成功
OKOK 表示命令执行成功。
如果命令执行失败通常是因为RSET命令不支持或出现其他问题
-ERR 错误消息-ERR 表示命令执行失败。错误消息 包含有关失败原因的描述。
UPDATE State
QUIT
告知邮件服务器客户端已经完成了邮件收取或管理任务并请求结束与服务器的连接。
Optional命令
TOP
检索邮件的头部信息和指定行数的邮件正文。 TOP命令允许客户端请求邮件服务器返回特定邮件的头部信息和部分邮件正文以减少数据传输量和加快邮件检索速度。
命令格式
TOP message_number number_of_linesmessage_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命令是POP3Post Office Protocol Version 3协议中的一条命令用于向邮件服务器提供登录用户名。USER命令通常是POP3会话的第一步用于标识客户端要使用的邮箱账户。
PASS
PASS命令是POP3Post Office Protocol Version 3协议中的一条命令用于向邮件服务器提供登录密码以完成身份验证。一般情况下在使用USER命令提供用户名后客户端必须使用PASS命令提供相应的密码以便访问邮箱账户。
APOP
APOPAuthenticated Post Office Protocol是POP3Post Office Protocol Version 3协议的一种认证机制。它是一种用于安全地认证邮件客户端与邮件服务器之间的身份的方法。与普通的POP3用户名和密码认证不同APOP使用一种基于哈希函数的挑战-响应机制来认证客户端的身份。
以下是APOP认证的工作原理
邮件服务器生成一个随机的挑战字符串通常是一个长字符串称为挑战值challenge。邮件服务器将挑战值与密码的哈希值进行拼接并计算拼接后的字符串的MD5哈希值。这个MD5哈希值称为响应值response。邮件服务器将挑战值发送给客户端。客户端收到挑战值后将自己的密码和挑战值拼接并计算拼接后的字符串的MD5哈希值得到自己的响应值。客户端将自己的用户名和响应值发送给邮件服务器。邮件服务器收到客户端的响应后会检查客户端的用户名是否存在并将客户端的响应值与邮件服务器计算的响应值进行比较。如果客户端的响应值与邮件服务器的响应值匹配服务器将认为客户端通过了认证允许客户端访问邮箱。
APOP认证的优点是它通过使用挑战-响应机制使得在网络上传输的密码不会以明文形式传输从而提高了安全性。这种认证机制确保只有知道正确密码的客户端才能通过认证。
请注意APOP认证是一种POP3协议的扩展认证机制因此并不是所有邮件服务器和邮件客户端都支持它。在使用APOP认证之前确保您的邮件服务器和客户端都支持此认证方式。
Go语言解析POP3
解析头部 通过mail.ReadMessage来解析邮件内容 message, err : mail.ReadMessage(strings.NewReader(source))
if err ! nil {log.Error(err)return
}通过解析出来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)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)