← RFC Reference

RFC 9051: IMAP4rev2

Standards Track Mail Access Protocols Published March 2026
ELI5: Nếu [POP3](1939) là kiểm tra hộp thư và mang thư về nhà, IMAP giống như có một tủ lưu trữ cá nhân tại bưu điện. Bạn có thể mở ngăn kéo (thư mục), đọc thư mà không cần lấy chúng ra, dán nhãn màu lên chúng (cờ), tìm kiếm mọi thứ, và truy cập cùng một tủ từ điện thoại, máy tính xách tay hoặc máy tính bảng của bạn — tất cả đều thấy cùng một trạng thái. Tin nhắn vẫn ở trên máy chủ; các thiết bị của bạn chỉ xem chúng.

Tại Sao Điều Này Tồn Tại

IMAP4rev1 (RFC 3501, xuất bản năm 2003) là nền tảng của email đa thiết bị trong gần hai thập kỷ. Nhưng nó tích lũy hàng chục RFC mở rộng, những trường hợp biên rõ ràng, và các tính năng mà mọi máy chủ thực tế đều triển khai khác nhau. RFC 9051 — IMAP4rev2 — là một bản sửa đổi sạch sẽ:

Nếu bạn đang xây dựng ứng dụng email mới hoặc tích hợp, hãy nhắm đến IMAP4rev2. Nếu máy chủ chỉ hỗ trợ IMAP4rev1, bộ lệnh gần như giống hệt — chỉ cần thương lượng các tiện ích mở rộng từng cái một.

Cách Thức Hoạt Động

Kết Nối và Xác Thực

IMAP sử dụng cổng 143 (STARTTLS) hoặc cổng 993 (TLS ngầm, được khuyến cáo). Sau khi kết nối, ứng dụng khách xác thực:

-- Kết nối đến cổng 993 (IMAPS) --
* OK [CAPABILITY IMAP4rev2 AUTH=PLAIN] server ready
a1 LOGIN alice@example.com s3cretP@ss
a1 OK [CAPABILITY IMAP4rev2 MOVE CONDSTORE] Logged in

Mỗi lệnh của ứng dụng khách được đặt tiền tố với một thẻ (như a1). Máy chủ trả lời với cùng một thẻ, cho phép các lệnh được đưa vào hàng đợi. Các phản hồi không được gắn thẻ (có tiền tố *) mang dữ liệu như số lượng tin nhắn và danh sách khả năng.

Chọn Hộp Thư

a2 SELECT INBOX
* 42 EXISTS                            ← 42 tin nhắn trong INBOX
* OK [UIDVALIDITY 1609459200]         ← kỷ nguyên UID; nếu thay đổi, re-sync
* OK [UIDNEXT 1053]                   ← UID tiếp theo sẽ được gán
* OK [HIGHESTMODSEQ 7834]             ← để đồng bộ hóa tăng dần (CONDSTORE)
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
a2 OK [READ-WRITE] SELECT completed

Tìm Nạp Tin Nhắn

-- Tìm nạp envelope và cờ cho tin nhắn 1:5 --
a3 FETCH 1:5 (FLAGS ENVELOPE)
* 1 FETCH (FLAGS (\Seen) ENVELOPE ("Wed, 12 Mar 2025 ..." ...))
* 2 FETCH (FLAGS () ENVELOPE (...))
...
a3 OK FETCH completed

-- Tìm nạp phần thân đầy đủ của tin nhắn UID 1050 --
a4 UID FETCH 1050 (BODY[])
* 41 FETCH (UID 1050 BODY[] {4523}
(tin nhắn RFC 5322 đầy đủ...)
)
a4 OK UID FETCH completed

Tìm Kiếm Phía Máy Chủ

a5 SEARCH UNSEEN FROM "bob@example.com" SINCE 1-Mar-2025
* SEARCH 38 41 42
a5 OK SEARCH completed

Các Chi Tiết Kỹ Thuật Chính

UID và Số Thứ Tự

Mỗi tin nhắn có hai mã định danh: một số thứ tự (vị trí của nó trong hộp thư, thay đổi khi tin nhắn bị xóa) và một UID (một số được gán vĩnh viễn chỉ tăng). Các ứng dụng khách mạnh mẽ luôn sử dụng UID thông qua UID FETCH, UID SEARCH, v.v. Giá trị UIDVALIDITY cho ứng dụng khách biết liệu các UID được lưu trong bộ nhớ cache của nó có còn hợp lệ hay không; nếu nó thay đổi, ứng dụng khách phải re-sync từ đầu.

Cờ

IMAP4rev2 định nghĩa các cờ hệ thống này:

Cờ Ý Nghĩa
\Seen Tin nhắn đã được đọc
\Answered Tin nhắn đã được trả lời
\Flagged Được đánh dấu là quan trọng / được gắn dấu sao
\Deleted Được đánh dấu để xóa (xóa trên EXPUNGE)
\Draft Tin nhắn là một bản nháp

Cờ \Recent từ IMAP4rev1 được loại bỏ trong rev2. Máy chủ cũng có thể hỗ trợ các từ khóa tùy chỉnh (ví dụ: $Forwarded, $Junk).

CONDSTORE và QRESYNC

CONDSTORE gán giá trị MODSEQ cho mỗi thay đổi cờ. Ứng dụng khách biết MODSEQ cuối cùng mà nó thấy có thể hỏi: "cái gì đã thay đổi kể từ MODSEQ 7834?" và chỉ nhận được các delta. QRESYNC (Quick Resynchronization) mở rộng điều này để xử lý các tin nhắn bị xóa một cách hiệu quả. Cùng nhau, chúng làm cho IMAP khả thi trên các mạng di động nơi re-sync đầy đủ quá đắt.

Lệnh MOVE

Trong IMAP4rev1, di chuyển tin nhắn yêu cầu COPY + STORE \Deleted + EXPUNGE — ba lệnh có điều kiện chạy. IMAP4rev2 bao gồm MOVE như một hoạt động nguyên tử asynchronous:

a6 UID MOVE 1050 "Archive"
* OK [COPYUID 1609459200 1050 287]
* 41 EXPUNGE
a6 OK MOVE completed

Những Sai Lầm Phổ Biến

Tác Động Đến Khả Năng Gửi

Related RFCs