1. 什么是IMAP协议

IMAP协议(Internet Message Access Protocol)是一种用于电子邮件检索和管理的标准应用层协议,允许用户在其本地电子邮件客户端程序与远程邮件服务器之间进行交互式的邮件访问。IMAP协议起源于1986年,在后续的发展中经历了多次修订,目前普遍使用的是IMAP4rev1(RFC 3501)。

2. IMAP核心功能特性

相比POP3协议,IMAP协议要复杂很多,简单介绍其功能特性如下。

  • 邮件存储与同步:

IMAP协议允许邮件保留在服务器上,而不是像POP3那样默认情况下将邮件下载到本地后可能从服务器移除。这样用户可以从任何地方通过网络连接访问其完整的邮件存储库,实现多设备间的邮件同步。

  • 在线访问:

用户可以直接在邮件服务器上浏览、搜索、阅读、移动、删除邮件,所有的操作都会实时反映在服务器端,使得其他已连接的客户端也能立刻看到更新的结果。

  • 多文件夹支持:

IMAP提供了强大的文件夹管理功能,允许用户在服务器上创建、删除、重命名文件夹,并将邮件移动至不同的文件夹内,便于邮件分类和归档。

  • 部分下载与缓存机制:

支持仅下载邮件的部分内容,比如邮件头信息,用户可以选择性地下载邮件正文和附件,大大减少了网络流量消耗,尤其适用于低带宽环境或存储空间有限的设备。

  • 状态保留:

IMAP能记住每个邮件的读取状态(已读或未读)、标志(如星标或标签)以及其他元数据,确保无论何时何地登录,用户的邮件状态都能保持一致。

  • 并发访问能力:

同一账户允许多个客户端同时连接并进行操作,各客户端的操作互不影响。

  • 安全传输:

为了保证通信安全,现代IMAP通常采用TLS/SSL加密技术,即IMAPS,通过端口993提供安全连接服务。

  • 扩展性:

IMAP协议具有良好的扩展性,可通过扩展命令支持更多功能,例如搜索语法的增强(如RFC 3501和RFC 6203)、身份验证机制(如CRAM-MD5, DIGEST-MD5, LOGIN等)以及国际化字符集支持等。

3. 与SMTP协议的配合

与POP3协议类似,IMAP协议通常与SMTP(Simple Mail Transfer Protocol)配合使用,SMTP负责邮件的发送,而IMAP则处理邮件接收。用户在客户端撰写邮件并通过SMTP发送出去,之后通过IMAP接收并在线处理。

4. IMAP协议工作方式

Foxmail客户端IMAP相关配置

客户端应用程序通过TCP/IP协议连接到邮件服务器,通常在默认的TCP端口号143上(对于非加密连接)或993上(对于SSL/TLS加密连接)。连接建立后,客户端通过一系列命令和响应与服务器交互,执行登录验证、列出邮件、下载邮件内容、移动邮件、标记邮件、删除邮件等操作。当用户通过IMAP协议访问邮件时,通常经历以下步骤:

✅ 连接:

客户端与服务器建立TCP连接,并可能通过STARTTLS升级到加密连接。

✅ 认证:

客户端向服务器提交用户名和密码进行认证。

✅ 选择邮件箱:

客户端指定要访问的邮件箱(如收件箱或自定义文件夹)。

✅ 命令交互:

客户端发出一系列命令来执行各种操作,如获取邮件列表、检索邮件详情、更新邮件状态等。

✅ 断开连接:

完成操作后,客户端可选择断开连接,但邮件仍保留在服务器上。

4. IMAP协议常见指令

IMAP协议包含了一系列指令(温馨提示:指令太多,建议仅作了解),用于客户端与邮件服务器之间的交互。以下是一些IMAP协议中的基本和常见的指令,以及它们的作用:

4.1 CAPABILITY:

客户端请求服务器支持的IMAP命令及扩展列表。

4.2 LOGIN 或 AUTHENTICATE:

用于用户认证,向服务器提供用户名和密码以登录账户。

4.3 SELECT 或 EXAMINE:

选择或打开一个邮件箱(也称为邮箱或文件夹)。SELECT命令会使邮件箱状态发生改变(例如,标记邮件为已读),而EXAMINE则为只读方式打开。

4.4 CREATE:

创建一个新的邮件箱。

4.5 DELETE:

删除一个邮件箱。

4.6 RENAME:

重命名现有的邮件箱。

4.7 SUBSCRIBE 和 UNSUBSCRIBE:

分别订阅或取消订阅一个邮件箱,影响哪些邮件箱会被视为“已订阅”的列表。

4.8 LIST:

列出服务器上的邮件箱信息。

4.9 STATUS:

获取邮件箱的状态信息,例如邮件数量、未读邮件数等。

4.10 APPEND:

将新邮件添加到指定邮件箱。

4.11 FETCH:

请求邮件的具体属性或内容。这是一个复杂的命令,可以用来获取邮件的各种信息片段,如邮件头、特定部分的正文、附件信息等。

4.12 STORE:

修改邮件的某些属性,例如设置邮件为已读、删除邮件、添加或修改标签等。

4.13 SEARCH:

根据指定条件搜索邮件箱中的邮件。

4.14 COPY:

将邮件复制到另一个邮件箱。

4.15 CHECK:

强制服务器立即检查并返回任何未报告的邮件状态变化。

4.16 EXPUNGE:

删除已经标记为删除的邮件。

4.17 NOOP:

空操作命令,用于保持连接活跃或测试服务器响应。

4.18 LOGOUT:

结束当前的IMAP会话,注销用户并关闭连接。以上只是IMAP协议中一部分常用的命令,根据具体需求和服务器支持的功能,还有其他更复杂的扩展命令。在实际使用中,客户端应用程序会根据这些命令构建与邮件服务器的交互逻辑,以实现邮件的读取、管理等功能。

5. 指令演示

[root@VM-4-12-centos ~]# telnet 0 143
Trying 0.0.0.0...
Connected to 0.
Escape character is '^]'.
* OK Coremail System IMap Server Ready
# 通过LOGIN命令登录。a01表示命令编号,每个命令编号不要重复;后面跟着的是账号和密码。如果想做相关测试,只需要复制相关命令。
a01 LOGIN t1@mailabc.cn yiWFnAPfFweU9vPT
a01 OK LOGIN completed
# 列出可用命令
a02 CAPABILITY
* CAPABILITY IMAP4rev1 XLIST SPECIAL-USE ID LITERAL+ STARTTLS APPENDLIMIT=20971520 UIDPLUS
a02 OK CAPABILITY completed

# 列出文件夹列表,相关参数可以查阅其他资料
a03 LIST "" "*"
* LIST () "/" "INBOX"
* LIST (\Drafts) "/" "Drafts"
* LIST (\Sent) "/" "Sent Items"
* LIST (\Trash) "/" "Trash"
* LIST (\Junk) "/" "Junk E-mail"
* LIST () "/" "Virus Items"
a03 OK LIST Completed

# 选择一个邮件箱(文件夹),参数对应LIST命令输出的文件夹信息
a04 SELECT "INBOX"
* 7 EXISTS
* 0 RECENT
* OK [UIDVALIDITY 1] UIDs valid
* FLAGS (\Answered \Seen \Deleted \Draft \Flagged)
* OK [PERMANENTFLAGS (\Answered \Seen \Deleted \Draft \Flagged)] Limited
a04 OK [READ-WRITE] SELECT completed

# 通过FETCH命令获取编号1-2的UID信息,后续对邮件的操作基本上都是根据UID来进行,可以理解这是每封邮件唯一识别号
a05 FETCH 1:2 (UID) 
* 1 FETCH (UID 1681789653)
* 2 FETCH (UID 1681789654)
a05 OK Fetch completed

# 通过UID FETCH命令获取特定邮件的FLAGS标志,如未读、已读
a06 UID FETCH 1681789653 FLAGS
* 1 FETCH (UID 1681789653 FLAGS (\Seen))
a06 OK Fetch completed

# 通过UID FETCH指令获取某封邮件的全部摘要信息
a07 UID FETCH 1681789653 ALL
* 1 FETCH (UID 1681789653 INTERNALDATE "18-Apr-2023 11:47:33 +0800" FLAGS (\Seen) ENVELOPE ("Tue, 18 Apr 2023 11:47:33 +0800 (GMT+08:00)" "=?UTF-8?B?5qyi6L+O5L2/55SoQ29yZW1haWznlLXlrZDpgq7ku7bns7vnu58vV2VsY29tZSB0byB0aGUgQ29yZW1haWwgZS1tYWlsIHN5c3RlbQ==?=" ((NIL NIL "postmaster" "mailabc.cn")) ((NIL NIL "postmaster" "mailabc.cn")) ((NIL NIL "postmaster" "mailabc.cn")) ((NIL NIL "t1" "mailabc.cn")) NIL NIL NIL "<792468312.0.1681789653872@VM-4-12-centos>") RFC822.SIZE 7766)
a07 OK Fetch completed

# 通过UID FETCH指令获取某封邮件的BODY正文原文信息
a08 UID FETCH 1681789653 BODY[TEXT]
* 1 FETCH (UID 1681789653 BODY[TEXT] {7251}
=91;">
<div id="3D"head"" style="3D"background-color:" #0079b3;"="">
...
# 正常来说,这里会输出一大段信息,这里做了省略

a08 OK Fetch completed

# 创建名为test1的文件夹
a09 CREATE test1
a09 OK mailbox created
# 删除名为test1的文件夹
a10 DELETE test1
a10 OK mailbox deleted

# 通过STATUS获取收件箱的状态信息
a11 STATUS "INBOX" (MESSAGES RECENT UNSEEN UIDNEXT UIDVALIDITY)
* STATUS "INBOX" (MESSAGES 7 RECENT 0 UIDVALIDITY 1 UNSEEN 0)
a11 OK STATUS completed

温馨提示:上述演示内容基于Coremail邮件系统,不同厂商的系统IMAP协议的支持程度有所不同。由于命令较多、参数复杂,有兴趣的同学可以查阅相关资料了解更详细的信息。

参考来源:IMAP协议介绍及常见指令演示|MailABC邮件知识百科

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐