下面着重讲一下 IMAP 协议以及 fetch 指令, 因为 fetch 指令时 imap 协议的核心功能, 所以在此先着重讲解这个, 后续回继续讲解别的.
1 IMAP 协议数据帧格式
IMAP 协议采用对称的收发帧序列号作为一对儿收发数据帧的标识, 从而防止接收数据混乱. 每个会话的帧序列号都是按照升序增长. 帧序列号由字母 数字组成, 客户端生产的每个命令的帧序列号都不同.
Send:A001(帧序列号) + 具体指令
Recv:A001(帧序列号) + 响应内容
Send:A002(帧序列号) + 具体指令
Recv:A002(帧序列号) + 响应内容
- .....................
- .....................
Send:A00N(帧序列号) + 具体指令
Recv:A00N(帧序列号) + 响应内容
Fetch 指令分析
Fetch 指令用于读取邮件的文本内容信息, 且仅用于显示的目的.
2.1 fetch 发送指令
格式: FETCH <sequence set> <message data item names or macro>
结果: OK-fetch 完成
NO-fetch 错误: 不能获取该数据
BAD - 未知命令, 或者无效参数
参数 1:sequence set
要读取的邮件序列集. 就是你想读取的邮件序列号的一个集合, 如果 UID 命令使用了 fetch 参数, 那么该值就是邮件的 UID 号而不是序列号(具体参考 UID 指令), 具体格式参照下面.
格式:(从实际数据分析得出, 协议里面暂时未找到)
a) 读取单个邮件序列号, 下面的含义就是要读取邮件序列号为 n.
Fetch n 参数 2
b) 按顺序读取多个邮件序列号, 下面的含义是要读取的邮件序列号为 n 到 n+x, 中间用符号':'来隔开.
fetch n:n+x 参数 2
参数 2:message data item names or macro
邮件数据项名称或者宏, 这些都是 fetch 指令中定义好的一些表示符号, 如果要读取多个数据项, 就用一对儿括号包括要读取的项, 每项之间用 "空格" 隔开, 如 "(ALL BODY FAST )" 具体数据项名称参照下面:
ALL: 只返回按照一定格式的邮件摘要, 包括邮件标志, RFC822.SIZE, 自身的时间和信
封信息. IMAP 客户机能够将标准邮件解析成这些信息并显示出来.
BODY: 只返回邮件体文本格式和大小的摘要信息. IMAP 客户机可以识别这些细节, 并向
用户显示详细的关于邮件的信息. 其实是一些非扩展的 BODYSTRUCTURE 的信
息.
FAST: 只返回邮件的一些摘要, 包括邮件标志, RFC822.SIZE, 和自身的时间.
FULL: 同样的还是一些摘要信息, 包括邮件标志, RFC822.SIZE, 自身的时间和
BODYSTRUCTURE 的信息.
BODYSTRUCTUR: 是邮件的 [MIME-IMB] 的体结构. 这是服务器通过解析[RFC-2822]
头中的 [MIME-IMB] 各字段和 [MIME-IMB] 头信息得出来 的. 包括的内容有: 邮
件正文的类型, 字符集, 编码方式等和各附件的类型, 字符集, 编码方式, 文件名
称等等.
ENVELOPE: 信息的信封结构. 是服务器通过解析 [RFC-2822] 头中的 [MIME-IMB] 各字段
得出来的, 默认各字段都是需要的. 主要包括: 自身的时间, 附件数, 收件人, 发
件人等.
FLAGS: 此邮件的标志.
INTERNALDATE: 邮件的实际日期.
RFC822.SIZE: 邮件的 [RFC-2822] 大小
RFC822.HEADER: 在功能上等同于 BODY.PEEK[HEADER],
RFC822: 功能上等同于 BODY[].
RFC822.TEXT: 功能上等同于 BODY[TEXT]
UID: 返回邮件的 UID 号, UID 号是唯一标识邮件的一个号码.
BODY[section] <<partial>>: 返回邮件的中的某一指定部分, 返回的部分用 section 来
表示, section 部分包含的信息通常是代表某一部分的一个数字 (邮件块号) 或者是下面的某一个部分: HEADER, HEADER.FIELDS, HEADER.FIELDS.NOT, MIME, and TEXT. 如果 section 部分是空的话, 那就代表返回全部的信息, 包括头信息.
Partial 表示获取 section 指定的块的一段你想要的字符串, 不是必要参数, 格式为 < index.size>,
Index 表示起始位置, size 表示要读取的大小, 如果 size 大于 section 选中的部分, 那么就返回 section 选中部分的全部字符串.
BODY[HEADER]返回完整的文件头信息.
BODY[HEADER.FIELDS ()]: 在小括号里面可以指定返回的特定字段.
BODY[HEADER.FIELDS.NOT ()]: 在小括号里面可以指定不需要返回的特定字段.
BODY[MIME]: 返回邮件的 [MIME-IMB] 的头信息, 在正常情况下跟 BODY[HEADER]没
有区别.
- C: 100 FETCH 3:5 BODY[header.fields (Date From Subject)]
- / 冒号表示间隔的一个范围: 请求邮件从 3 到 5 之间所有邮件的 Date: 字段, From: 字段和 Subject: 字段的信息 /
- S: 3 FETCH (BODY[HEADER.FIELDS ("DATE" "FROM" "SUBJECT")] {
- 112
- }
- DATE: Tue, 14 Sep 1999 10:09:50 -500
- From: [email protected]
- Subject: This is the first test message
- )
- S: 4 FETCH (BODY[HEADER.FIELDS ("DATE" "FROM" "SUBJECT")] {
- 113
- }
- DATE: Tue, 14 Sep 1999 10:10:04 -500
- From: [email protected]
- Subject: This is the second test message
- )
- S: 5 FETCH (BODY[HEADER.FIELDS ("DATE" "FROM" "SUBJECT")] {
- 112
- }
- DATE: Tue, 14 Sep 1999 10:20:26 -500
- From: [email protected]
- Subject: This is the first test message
- S: A100 OK FETCH completed
- C: A101 FETCH BODY[TEXT]
- S: This is the fourth test message for IMAP
- S: A101 OK FETCH completed
- HEADER ([RFC-2822] header of the message)
- TEXT ([RFC-2822] text body of the message) MULTIPART/MIXED
- 1 TEXT/PLAIN
- 2 APPLICATION/OCTET-STREAM
- 3 MESSAGE/RFC822
- 3.HEADER ([RFC-2822] header of the message)
- TEXT ([RFC-2822] text body of the message) MULTIPART/MIXED
- 3.1 TEXT/PLAIN
- 3.2 APPLICATION/OCTET-STREAM
- 4 MULTIPART/MIXED
- 4.1 IMAGE/GIF
- 4.1. MIME ([MIME-IMB] header for the IMAGE/GIF)
- 4.2 MESSAGE/RFC822
- 4.2. HEADER ([RFC-2822] header of the message)
- 4.2. TEXT ([RFC-2822] text body of the message) MULTIPART/MIXED
- 4.2.1 TEXT/PLAIN
- 4.2.2 MULTIPART/ALTERNATIVE
- 4.2.2.1 TEXT/PLAIN
- 4.2.2.2 TEXT/RICHTEXT
来源: http://www.bubuko.com/infodetail-3010918.html