命令分几个阶段
POP3 会话分三阶段:认证阶段用用户名口令类命令,事务阶段用统计、列举、取回、预览与标记删除类命令,更新阶段在退出时才提交删除(RFC 1939 §5)。理解阶段划分就能明白,为什么标记删除后直接断线并不会真的删除。
会话序号与唯一标识
会话内的消息序号是临时的,会随删除与新邮件到达而变化;唯一标识命令给出的值才是跨会话识别同一封信的依据。需要去重或断点续传时,先取唯一标识再决定操作哪一封。
基本信息
| 认证阶段 | 用户名与口令命令,另有带时间戳摘要的认证方式 |
|---|---|
| 事务阶段 | 统计、列举、取回、预览头部与若干行正文、标记删除、撤销标记 |
| 更新阶段 | 退出时才真正提交删除 |
| 唯一标识 | 由唯一标识命令提供,跨会话稳定 |
典型使用场景
- 手写脚本抓取邮件时的命令顺序参考
- 排查「删除后又出现」的现象
- 排查同账号第二个客户端登录失败
- 对比预览与完整取回的行为差异
取回与删除的组合
取回与删除的组合
RETR 1
+OK 320 octets
(邮件内容)
.
DELE 1
+OK message 1 deleted
RSET
+OK
QUIT命令速查
| 命令 | 说明 | 备注 |
|---|---|---|
| USER 与 PASS | 用户名与口令 | 认证两连 |
| 带摘要的认证 | 使用时间戳的摘要方式 | 需要服务端支持 |
| 统计 | 信箱封数与总字节 | 只读操作 |
| 列举 | 列出消息与大小 | 不带参数则列全部 |
| 唯一标识 | 消息的唯一标识 | 跨会话识别同一封 |
| 取回 | 取回指定邮件全文 | 客户端决定是否保留 |
| 预览 | 取头部与若干行正文 | 预览用,不全量下载 |
| 标记删除 | 标记删除,退出时才生效 | 退出前可撤销 |
| 撤销标记 | 撤销本会话的全部删除标记 | 会话级 |
| 探活 | 探测连接是否可用 | 保活用 |
| 退出 | 结束会话并提交删除 | 更新阶段 |
标记删除只是打标记:真正删除发生在退出时的更新阶段;断线而没有正常退出时,标记会自动失效。
只看了预览命令就以为邮件已下载:预览只取头部与若干行正文,完整内容需要取回命令或客户端正式收信。
同一账号的信箱在会话期间被独占:第二个客户端登录会直接失败,这种失败常被误判成口令错误。