IMAP协议备注

【参考资料】
【1】https://tools.ietf.org/html/rfc3501

一 基本概念
  1. IMAP(Internet Mail Access Protocal) Internet 邮件访问协议,RFC3501定义,用于邮件客户端(如outlook等)从邮件服务器获取、下载邮件信息。
  2. IMAP基于TCP协议,默认监听143端口。
  3. IMAP采用命令、响应的交互,使用多行文本的形式,以CRLF换行;这点基本与POP3相同。

二 邮件属性
邮件标识

在IMAP中,邮件以两种方式来唯一标识:

  1. 唯一标识符: 分配给每个的32位UID,与UID验证值一起组成一个64位的唯一标识符,该标识符在会话中不允许改变。UID将会随着邮件的收取不断递增,客户端可以基于此判断是否存在新邮件,类似时间戳。
  2. 邮件序列号: 邮件在邮箱中的相对位置,从1开始,当出现邮件删除时,该序号会重排。
邮件标记

每个邮件可以增加一个字符串,包括多个以\开头的标签字符串来标记邮件的某些属性,如下:

标签 作用
/Seen 邮件已读
/Answered 邮件已经回复
/Flagged 紧急或特别关注
/Deleted 删除状态
/Draft 草稿状态
/Recent 新到达

三 状态流程

当IMAP客户端和服务端建立连接,则处于如下四个状态之一:

状态 作用
未认证状态 要求客户端提供一个认证证书,每次新连接除非已经“预认证”,否则则处于该状态
认证状态 完成认证,可以选择邮箱
选中状态 已经选择一个邮箱并登陆
注销状态 客户端登出

在这里插入图片描述


四 主要客户端命令

注意: 客户端发每条命令,前面要带一个字母数字组成的标签,类似“A01”

任何状态

4.1 CAPABILITY
参数: 无
功能: 请求服务器支持的功能列表
例子:

C: abcd CAPABILITY
S: * CAPABILITY IMAP4rev1 STARTTLS AUTH=GSSAPI LOGINDISABLED
S: abcd OK CAPABILITY completed

4.2 NOOP
参数: 无
功能: 请求返回一个空消息
例子:

C: a002 NOOP
S: a002 OK NOOP completed

4.3 LOGOUT
参数: 无
功能: 客户端登出
例子:

C: A023 LOGOUT
S: * BYE IMAP4rev1 Server logging out
S: A023 OK LOGOUT completed
注:此时服务端、客户端断开连接。

未认证状态

4.4 STARTTLS
参数: 无
功能: 触发一个TLS会话
例子:

C: a001 CAPABILITY
S: * CAPABILITY IMAP4rev1 STARTTLS LOGINDISABLED
S: a001 OK CAPABILITY completed
C: a002 STARTTLS
S: a002 OK Begin TLS negotiation now
注: 此时双方开始协商构建TLS会话,之后的数据将在TLS层上交互

一旦“TLS”开始,客户端必须丢弃关于服务器功能的缓存信息,且应当重新发出CAPABILITY命令。这对保护免受修改功能列表指向STARTTLS的中间者攻击是有必要的
C: a003 CAPABILITY
S: * CAPABILITY IMAP4rev1 AUTH=PLAIN
S: a003 OK CAPABILITY completed
C: a004 LOGIN joe password
S: a004 OK LOGIN completed

4.5 AUTHENTICATE
参数: 认证机制名称
功能: 进行认证操作,该操作完成则进入“认证状态”
例子: 略

4.6 LOGIN
参数: 用户名、密码
功能: 登录,登录完成后进入“认证状态”
例子: 见 4.4 CAPABILITY 例子

认证状态

4.7 SELECT
参数: 邮箱名称
功能: 选择某个邮件,从而可以访问其中的邮件
例子:

C: A142 SELECT INBOX
S: * 172 EXISTS
S: * 1 RECENT
S: * OK [UNSEEN 12] Message 12 is first unseen
S: * OK [UIDVALIDITY 3867529045] UID valid
S: * OK [UIDNEXT 4392] Predicted next UID
S: * FLAGS (/Answered /Flagged /Deleted /Seen /Draft)
S: * OK [PERMANENTFLAGS (/Deleted /Seen /*)] Limited
S: A142 OK [READ-WRITE] SELECT completed

备注: next UID被客户端用来推测是否收到新邮件。

4.8 EXAMINE
参数: 邮箱名称
功能: 检查邮箱,基本同SELECT
例子: 略

4.9 CREATE
参数: 邮箱名
功能: 创建一个邮箱
例子:

C: A003 CREATE owatagusiam/
S: A003 OK CREATE completed

4.10 DELETE
参数: 邮箱名
功能: 删除一个邮箱
例子:

C: A683 DELETE blurdybloop
S: A683 OK DELETE completed
C: A684 DELETE foo
S: A684 NO Name “foo” has inferior hierarchical names

4.11 RENAME
参数: 当前邮箱名 新的邮箱名
功能: 重命名一个邮箱
例子:

C: Z433 RENAME INBOX old-mail
S: Z433 OK RENAME completed

4.11 SUBSCRIBE(UNSUBSCRIBE)
参数: 邮箱名
功能: 将邮箱加入(取消加入)活动或订阅邮箱列表
例子:

C: A002 SUBSCRIBE #news.comp.mail.mime
S: A002 OK SUBSCRIBE completed

4.12 LIST
参数: 第一个参数是 前缀,第二个参数是 带通配符的邮箱名
功能: 给出符合条件的邮箱名
例子:

C: A202 LIST ~/Mail/ %
S: * LIST (\Noselect) “/” ~/Mail/foo
S: * LIST () “/” ~/Mail/meetings
S: A202 OK LIST completed

4.13 LSUB
参数: 第一个参数是 前缀,第二个参数是 带通配符的邮箱名
功能: 给出符合条件的订阅邮件名
例子:

C: A002 LSUB “#news.” “comp.mail.*”
S: * LSUB () “.” #news.comp.mail.mime
S: * LSUB () “.” #news.comp.mail.misc
S: A002 OK LSUB completed

4.14 APPEND
参数: 邮箱名,邮件数据等
功能: 上载一个邮件到某个邮箱内,包括这个新邮件的属性、日期等
例子:

C: A003 APPEND saved-messages (\Seen) {310}
S: + Ready for literal data
C: Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST)
C: From: Fred Foobar [email protected]
C: Subject: afternoon meeting
C: To: [email protected]
C: Message-Id: [email protected]
C: MIME-Version: 1.0
C: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII
C: Hello Joe, do you think we can meet at 3:30 tomorrow?
C:
S: A003 OK APPEND completed

选中状态

4.15 CHECK
参数: 无
功能: 设置检查点,用以保证邮箱数据的一致性
例子:

C: FXXZ CHECK
S: FXXZ OK CHECK Completed

4.16 CLOSE
参数: 无
功能: 关闭会话,回到”认证状态“
例子:

C: A341 CLOSE
S: A341 OK CLOSE completed

4.17 EXPUNGE
参数: 无
功能: 永久删除全部带“删除”标记位的邮件
例子:

C: A202 EXPUNGE
S: A202 OK EXPUNGE completed

4.17 SEARCH
参数: 根据协议定义的关键词,包括状态、时间、抄送人等等,此处不做罗列
功能: 检索符合要求的邮件,返回邮件号
例子:

C: A282 SEARCH FLAGGED SINCE 1-Feb-1994 NOT FROM “Smith”
S: * SEARCH 2 84 882
S: A282 OK SEARCH completed
C: A283 SEARCH TEXT “string not in mailbox”
S: * SEARCH
S: A283 OK SEARCH completed
C: A284 SEARCH CHARSET UTF-8 TEXT {6}
C: XXXXXX
S: * SEARCH 43
S: A284 OK SEARCH completed

4.18 FETCH
参数: 包含两个参数,一个是邮件序号列表,一个是邮件内容的包含范围,如全部、文本含头部、日期、主题,甚至多少字节范围的内容等等,此处不做罗列
功能: 根据参数要求返回具体邮件的文本信息
例子:

C: A654 FETCH 2:4 (FLAGS BODY[HEADER.FIELDS (DATE FROM)])
S: * 2 FETCH …
S: * 3 FETCH …
S: * 4 FETCH …
S: A654 OK FETCH completed
备注: rfc文档此处省略的就是具体的返回内容

4.19 STORE
参数: 待修改的邮件列表,修改命令、修改的属性
功能: 修改指定邮件的属性
例子:

注:下例中给邮件增加了删除属性
C: A003 STORE 2:4 +FLAGS (\Deleted)
S: * 2 FETCH (FLAGS (\Deleted \Seen))
S: * 3 FETCH (FLAGS (\Deleted))
S: * 4 FETCH (FLAGS (\Deleted \Flagged \Seen))
S: A003 OK STORE completed

猜你喜欢

转载自blog.csdn.net/Fredric_2014/article/details/84497341
今日推荐