Skip to content

拉取多封邮件 ​

* OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE LITERAL+ AUTH=PLAIN AUTH=LOGIN] Dovecot (Debian) ready.

1 authenticate PLAIN

+ 

AGJvYgAwMDAwMDAwMA==

1 OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SNIPPET=FUZZY PREVIEW=FUZZY PREVIEW STATUS=SIZE SAVEDATE LITERAL+ NOTIFY SPECIAL-USE] Logged in

2 ID ("name" "Thunderbird" "version" "139.0.2")

* ID ("name" "Dovecot")
2 OK ID completed (0.001 + 0.000 secs).

3 select "INBOX"

* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
* 6 EXISTS
* 2 RECENT
* OK [UNSEEN 5] First unseen.
* OK [UIDVALIDITY 1750701677] UIDs valid
* OK [UIDNEXT 7] Predicted next UID
3 OK [READ-WRITE] Select completed (0.001 + 0.000 secs).

4 UID fetch 1:* (FLAGS)

* 1 FETCH (UID 1 FLAGS (\Seen))
* 2 FETCH (UID 2 FLAGS (\Seen))
* 3 FETCH (UID 3 FLAGS (\Seen))
* 4 FETCH (UID 4 FLAGS (\Seen))
* 5 FETCH (UID 5 FLAGS (\Recent))
* 6 FETCH (UID 6 FLAGS (\Recent))
4 OK Fetch completed (0.001 + 0.000 secs).

5 UID fetch 1:6 (UID RFC822.SIZE FLAGS BODY.PEEK[HEADER.FIELDS (From To Cc Bcc Subject Date Message-ID Priority X-Priority References Newsgroups In-Reply-To Content-Type Reply-To)])

* 1 FETCH (UID 1 RFC822.SIZE 635 FLAGS (\Seen) BODY[HEADER.FIELDS (FROM TO CC BCC SUBJECT DATE MESSAGE-ID PRIORITY X-PRIORITY REFERENCES NEWSGROUPS IN-REPLY-TO CONTENT-TYPE REPLY-TO)] {237}
Message-ID: <b9dd8020-9613-4713-809e-fc8a135bdafa@localdomain>
Date: Mon, 23 Jun 2025 08:53:40 -1000
To: bob@localdomain
From: alice <alice@localdomain>
Subject: How are you
Content-Type: text/plain; charset=UTF-8; format=flowed

)
* 2 FETCH (UID 2 RFC822.SIZE 621 FLAGS (\Seen) BODY[HEADER.FIELDS (FROM TO CC BCC SUBJECT DATE MESSAGE-ID PRIORITY X-PRIORITY REFERENCES NEWSGROUPS IN-REPLY-TO CONTENT-TYPE REPLY-TO)] {230}
Message-ID: <157dc58f-fa68-4420-a6ee-5df03682db72@localdomain>
Date: Mon, 23 Jun 2025 09:06:36 -1000
To: bob@localdomain
From: alice <alice@localdomain>
Subject: Work
Content-Type: text/plain; charset=UTF-8; format=flowed

)
* 3 FETCH (UID 3 RFC822.SIZE 622 FLAGS (\Seen) BODY[HEADER.FIELDS (FROM TO CC BCC SUBJECT DATE MESSAGE-ID PRIORITY X-PRIORITY REFERENCES NEWSGROUPS IN-REPLY-TO CONTENT-TYPE REPLY-TO)] {231}
Message-ID: <398fcbcf-a178-46c4-ab42-c4b0b05b12ef@localdomain>
Date: Sun, 29 Jun 2025 11:03:45 -1000
To: bob@localdomain
From: alice <alice@localdomain>
Subject: test1
Content-Type: text/plain; charset=UTF-8; format=flowed

)
* 4 FETCH (UID 4 RFC822.SIZE 622 FLAGS (\Seen) BODY[HEADER.FIELDS (FROM TO CC BCC SUBJECT DATE MESSAGE-ID PRIORITY X-PRIORITY REFERENCES NEWSGROUPS IN-REPLY-TO CONTENT-TYPE REPLY-TO)] {230}
Message-ID: <e245f2ad-5332-4101-bc62-3f2f2ba720a7@localdomain>
Date: Sun, 29 Jun 2025 11:05:12 -1000
To: bob@localdomain
From: alice <alice@localdomain>
Subject: test
Content-Type: text/plain; charset=UTF-8; format=flowed

)
* 5 FETCH (UID 5 RFC822.SIZE 623 FLAGS (\Recent) BODY[HEADER.FIELDS (FROM TO CC BCC SUBJECT DATE MESSAGE-ID PRIORITY X-PRIORITY REFERENCES NEWSGROUPS IN-REPLY-TO CONTENT-TYPE REPLY-TO)] {231}
Message-ID: <f1b113f7-5799-42dd-9e47-cd06dc096bbc@localdomain>
Date: Sun, 29 Jun 2025 11:13:20 -1000
To: bob@localdomain
From: alice <alice@localdomain>
Subject: test3
Content-Type: text/plain; charset=UTF-8; format=flowed

)
* 6 FETCH (UID 6 RFC822.SIZE 625 FLAGS (\Recent) BODY[HEADER.FIELDS (FROM TO CC BCC SUBJECT DATE MESSAGE-ID PRIORITY X-PRIORITY REFERENCES NEWSGROUPS IN-REPLY-TO CONTENT-TYPE REPLY-TO)] {232}
Message-ID: <f4e5d794-83df-4903-9853-bacd8d9ebe10@localdomain>
Date: Sun, 29 Jun 2025 11:13:44 -1000
To: bob@localdomain
From: alice <alice@localdomain>
Subject: test 4
Content-Type: text/plain; charset=UTF-8; format=flowed

)
5 OK Fetch completed (0.001 + 0.000 secs).

6 UID fetch 1,2:6 (UID RFC822.SIZE BODY.PEEK[])

* 1 FETCH (UID 1 RFC822.SIZE 635 BODY[] {635}
Return-Path: <alice@localdomain>
X-Original-To: bob@localdomain
Delivered-To: bob@localdomain
Received: from [192.168.3.8] (unknown [192.168.3.8])
	by mail.localdomain (Postfix) with ESMTPA id 38A7C6C5451
	for <bob@localdomain>; Mon, 23 Jun 2025 08:54:09 -1000 (HST)
Message-ID: <b9dd8020-9613-4713-809e-fc8a135bdafa@localdomain>
Date: Mon, 23 Jun 2025 08:53:40 -1000
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
Content-Language: en-US
To: bob@localdomain
From: alice <alice@localdomain>
Subject: How are you
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

How are you

)
* 2 FETCH (UID 2 RFC822.SIZE 621 BODY[] {621}
Return-Path: <alice@localdomain>
X-Original-To: bob@localdomain
Delivered-To: bob@localdomain
Received: from [192.168.3.8] (unknown [192.168.3.8])
	by mail.localdomain (Postfix) with ESMTPA id 41C156C5451
	for <bob@localdomain>; Mon, 23 Jun 2025 09:07:05 -1000 (HST)
Message-ID: <157dc58f-fa68-4420-a6ee-5df03682db72@localdomain>
Date: Mon, 23 Jun 2025 09:06:36 -1000
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
Content-Language: en-US
To: bob@localdomain
From: alice <alice@localdomain>
Subject: Work
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

work

)
* 3 FETCH (UID 3 RFC822.SIZE 622 BODY[] {622}
Return-Path: <alice@localdomain>
X-Original-To: bob@localdomain
Delivered-To: bob@localdomain
Received: from [192.168.3.8] (unknown [192.168.3.8])
	by mail.localdomain (Postfix) with ESMTPA id 4AE736C5445
	for <bob@localdomain>; Sun, 29 Jun 2025 11:04:13 -1000 (HST)
Message-ID: <398fcbcf-a178-46c4-ab42-c4b0b05b12ef@localdomain>
Date: Sun, 29 Jun 2025 11:03:45 -1000
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
Content-Language: en-US
To: bob@localdomain
From: alice <alice@localdomain>
Subject: test1
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

test

)
* 4 FETCH (UID 4 RFC822.SIZE 622 BODY[] {622}
Return-Path: <alice@localdomain>
X-Original-To: bob@localdomain
Delivered-To: bob@localdomain
Received: from [192.168.3.8] (unknown [192.168.3.8])
	by mail.localdomain (Postfix) with ESMTPA id 7FE216C5445
	for <bob@localdomain>; Sun, 29 Jun 2025 11:05:40 -1000 (HST)
Message-ID: <e245f2ad-5332-4101-bc62-3f2f2ba720a7@localdomain>
Date: Sun, 29 Jun 2025 11:05:12 -1000
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
Content-Language: en-US
To: bob@localdomain
From: alice <alice@localdomain>
Subject: test
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

test2

)
* 5 FETCH (UID 5 RFC822.SIZE 623 BODY[] {623}
Return-Path: <alice@localdomain>
X-Original-To: bob@localdomain
Delivered-To: bob@localdomain
Received: from [192.168.3.8] (unknown [192.168.3.8])
	by mail.localdomain (Postfix) with ESMTPA id 4E7F06C5445
	for <bob@localdomain>; Sun, 29 Jun 2025 11:13:48 -1000 (HST)
Message-ID: <f1b113f7-5799-42dd-9e47-cd06dc096bbc@localdomain>
Date: Sun, 29 Jun 2025 11:13:20 -1000
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
Content-Language: en-US
To: bob@localdomain
From: alice <alice@localdomain>
Subject: test3
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

test3

)
* 6 FETCH (UID 6 RFC822.SIZE 625 BODY[] {625}
Return-Path: <alice@localdomain>
X-Original-To: bob@localdomain
Delivered-To: bob@localdomain
Received: from [192.168.3.8] (unknown [192.168.3.8])
	by mail.localdomain (Postfix) with ESMTPA id E698A6C5445
	for <bob@localdomain>; Sun, 29 Jun 2025 11:14:11 -1000 (HST)
Message-ID: <f4e5d794-83df-4903-9853-bacd8d9ebe10@localdomain>
Date: Sun, 29 Jun 2025 11:13:44 -1000
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
Content-Language: en-US
To: bob@localdomain
From: alice <alice@localdomain>
Subject: test 4
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

test 4

)
6 OK Fetch completed (0.001 + 0.000 secs).

7 UID fetch 5 (UID BODY.PEEK[HEADER.FIELDS (Content-Type Content-Transfer-Encoding)] BODY.PEEK[TEXT]<0.2048>)

* 5 FETCH (UID 5 BODY[HEADER.FIELDS (CONTENT-TYPE CONTENT-TRANSFER-ENCODING)] {91}
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

 BODY[TEXT]<0> {9}
test3

)
7 OK Fetch completed (0.001 + 0.000 secs).

8 IDLE

+ idling

DONE

8 OK Idle completed (12.173 + 12.173 + 12.172 secs).

9 noop

9 OK NOOP completed (0.001 + 0.000 secs).

10 UID fetch 7:* (FLAGS)

* 6 FETCH (UID 6 FLAGS (\Recent))
10 OK Fetch completed (0.001 + 0.000 secs).

11 IDLE

+ idling

DONE

11 OK Idle completed (4.955 + 4.955 + 4.954 secs).

12 uid store 5 +Flags (\Seen)

* 5 FETCH (UID 5 FLAGS (\Seen \Recent))
12 OK Store completed (0.001 + 0.000 secs).

13 uid store 6 +Flags (\Seen)

* 6 FETCH (UID 6 FLAGS (\Seen \Recent))
13 OK Store completed (0.001 + 0.000 secs).

14 IDLE

+ idling

Recent标签是在什么时候清除的 ​

根据 RFC 3501(IMAP4rev1)中对 \Recent 标志的定义,它并不是在第一次 SELECT 之后立即清除的,而是一个“会话级”新邮件标记,其清除时机如下:

  1. 同一会话内的 SELECT/EXAMINE 不会清除它 当在同一个连接(session)里再次对同一信箱执行 SELECT 或 EXAMINE 命令,服务器不会把已经标记为 \Recent 的消息去掉这个标志——因为它还未结束这个会话。

  2. CLOSE 命令或 LOGOUT 时才真正清除

    • 如果客户端发送 CLOSE 命令(或断开连接/LOGOUT),服务器就会“关闭”这个信箱视图,随后再重新打开(新的会话)时,先前的 \Recent 就失效了。
    • 换言之,当会话结束或者信箱被显式关闭时,所有剩余的 \Recent 标志都会被清理。
  3. 跨会话选信箱也会重置 如果在另一个客户端(或同一客户端的新连接)第一次 SELECT 该信箱,服务器同样会将所有旧的 \Recent 标记去掉,只在该新会话里,对自上次打开后新到达的邮件继续打上 \Recent。

总结:看到的“SELECT 之后没有清除”是符合规范的——FETCH、STORE、再次 SELECT 都不会影响 \Recent。只有发 CLOSE(或断开/LOGOUT),然后新会话里重新 SELECT,才会将先前的 \Recent 全部清掉。

在 IMAP 里,无论是客户端发 CLOSE 还是在 LOGOUT 前服务器隐式执行的 “close selected mailbox” 操作,都会清除当前被选中的邮箱(即最新一次 SELECT/EXAMINE 的那个)的 \Recent 标志。

所以——

  • 如果的客户端最后一次执行的是 SELECT server_error,那么退出(LOGOUT)时就会清除 server_error 邮箱上的 \Recent。
  • 即便之前在同一会话里选过 INBOX,只要后来又选了 server_error,就只会清理后者的 \Recent。

要想在退出时清除 INBOX 的 \Recent,需要在 LOGOUT 前执行

imap
CLOSE

或者再次

imap
SELECT "INBOX"

这样 LOGOUT 隐式的关闭操作才会作用到 INBOX。

UNSEEN ​

3 select "INBOX"

* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
* 6 EXISTS
* 2 RECENT
* OK [UNSEEN 5] First unseen.
* OK [UIDVALIDITY 1750701677] UIDs valid
* OK [UIDNEXT 7] Predicted next UID
3 OK [READ-WRITE] Select completed (0.001 + 0.000 secs).

4 UID fetch 1:* (FLAGS)

* 1 FETCH (UID 1 FLAGS (\Seen))
* 2 FETCH (UID 2 FLAGS (\Seen))
* 3 FETCH (UID 3 FLAGS (\Seen))
* 4 FETCH (UID 4 FLAGS (\Seen))
* 5 FETCH (UID 5 FLAGS (\Recent))
* 6 FETCH (UID 6 FLAGS (\Recent))
4 OK Fetch completed (0.001 + 0.000 secs).

一共6封邮件,4封seen 2封Recent,为什么UNSEEN 是5 在 IMAP 协议中,[UNSEEN <n>] 并不是返回“未读邮件的总数”,而是返回“第一个未读(\Seen 标志未被设置)邮件的序号”。

在这次交互里:

  • 邮件总数是 6 封(* 6 EXISTS)

  • 序号 1–4 都带有 \Seen,所以已经读过

  • 序号 5 和 6 是 \Recent,尚未被标记为 \Seen

  • 那么“第一个未读的”就是序号 5,所以服务器返回:

    OK [UNSEEN 5] First unseen.

    表示序号 5 是第一个未读邮件

  1. Fetch Header 这里的232包括了报文长度
* 6 FETCH (UID 6 RFC822.SIZE 625 FLAGS (\Recent) BODY[HEADER.FIELDS (FROM TO CC BCC SUBJECT DATE MESSAGE-ID PRIORITY X-PRIORITY REFERENCES NEWSGROUPS IN-REPLY-TO CONTENT-TYPE REPLY-TO)] {232}
Message-ID: <f4e5d794-83df-4903-9853-bacd8d9ebe10@localdomain>
Date: Sun, 29 Jun 2025 11:13:44 -1000
To: bob@localdomain
From: alice <alice@localdomain>
Subject: test 4
Content-Type: text/plain; charset=UTF-8; format=flowed

)

MIT Licensed