邮件协议

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

下面着重讲一下IMAP协议以及fetch指令,因为fetch指令时imap协议的核心功能,所以在此先着重讲解这个,后续回继续讲解别的。

1 IMAP协议数据帧格式

IMAP协议采用对称的收发帧序列号作为一对儿收发数据帧的标识,从而防止接收数据混乱。每个会话的帧序列号都是按照升序增长。帧序列号由字母数字组成,客户端生产的每个命令的帧序列号都不同。

Send:A001(帧序列号) + 具体指令

Recv:A001(帧序列号) + 响应内容

Send:A002(帧序列号) + 具体指令

Recv:A002(帧序列号) + 响应内容

…………………

…………………

Send:A00N(帧序列号) + 具体指令

Recv:A00N(帧序列号) + 响应内容

2. 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指令),具体格式参照下面。

格式:(从实际数据分析得出,协议里面暂时未找到)

1.读取单个邮件序列号,下面的含义就是要读取邮件序列号为n。

>>Fetch n 参数2

1.按顺序读取多个邮件序列号,下面的含义是要读取的邮件序列号为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] <>:返回邮件的中的某一指定部分,返回的部分用section来

表示,section部分包含的信息通常是代表某一部分的一个数字(邮件块号)或者是下面的某一个部分:HEADER HEADER.FIELDS HEADER.FIELDS.NOT MIME and TEXT。如果section部分是空的话,那就代表返回全部的信息,包括头信息。

Partial表示获取section指定的块的一段你想要的字符串,不是必要参数,格式为

Index表示起始位置,size表示要读取的大小,如果size大于section选中的部分,那么就返回section选中部分的全部字符串。

BODY[HEADER]返回完整的文件头信息。

BODY[HEADER.FIELDS ()]:在小括号里面可以指定返回的特定字段。

BODY[HEADER.FIELDS.NOT ()]:在小括号里面可以指定不需要返回的特定字段。

BODY[MIME]:返回邮件的[MIME-IMB]的头信息,在正常情况下跟BODY[HEADER]没

有区别。

BODY[TEXT]:返回整个邮件体,这里的邮件体并不包括邮件头。

BODY.PEEK[

]<>

BODY[

]的一个替代形式,它不会隐式设置邮件的 \SEEN(已读) 标记。在缺省设置时,宏BODY[
]<>会设置邮件的\SEEN标志。如果你想在不设置\SEEN标志的情况下阅读邮件的部分信息,那么可以将该宏替代BODY .PEEK[section],后者完成同前者一样的功能但不会设置该邮件的\SEEN标志。

2.2 fetch 响应

FETCH响应返回客户端的一个邮件的相关数据。这些数据是名称项及其值的数据对儿,这些数据对儿分别被放在一个圆括号中(fetch回来的所有数据都在这对儿括号内,所以fetch 回来数据的最后一个字符肯定是‘)’)。意思就是在你发送fetch指令时,响应内容和参数2是一一对应的,具体格式可以参照2.3例子。

如果发送时参数2是格式 ( a b c d )

那么响应的格式就是( a value-a b value-b c value-c d value-d)

注意:a/b/c/d之间用“空格”隔开,响应中也是一样。

注意:

目前从实际数据中得出一个结论,fetch指令中,如果存在BODY系列的请求,那么在fetch响应中,会附带BODY返回邮件内容的长度大小,由一对大括号包括“{size}”位置在响应中BODY名称和值中间,由空格间隔。参照下面示例,具体示例参照2.3.

Fetch (BODY[xxxxx] {size} value)

由此得出一个结论,要想确认fetch响应是否结束,一个是根据右括号’)’来识别fetch数据内容的尾部,另一个要注意fetch的结束响应(OK fetch)。

相关文档
最新文档