拉取多封邮件
* 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 之后立即清除的,而是一个“会话级”新邮件标记,其清除时机如下:
同一会话内的 SELECT/EXAMINE 不会清除它 当你在同一个连接(session)里再次对同一信箱执行 SELECT 或 EXAMINE 命令,服务器不会把已经标记为
\Recent
的消息去掉这个标志——因为它还未结束这个会话。CLOSE 命令或 LOGOUT 时才真正清除
- 如果客户端发送
CLOSE
命令(或断开连接/LOGOUT),服务器就会“关闭”这个信箱视图,随后再重新打开(新的会话)时,先前的\Recent
就失效了。 - 换言之,当会话结束或者信箱被显式关闭时,所有剩余的
\Recent
标志都会被清理。
- 如果客户端发送
跨会话选信箱也会重置 如果你在另一个客户端(或同一客户端的新连接)第一次 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
前执行
CLOSE
或者再次
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 是第一个未读邮件
- 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
)