下面是针对您提供的 IMAP 手动测试脚本及 curl
示例的完整、结构化润色文档,保留了所有命令、期望响应和说明,未修改任何示例内容。
IMAP 手动测试脚本
前提条件
- IMAP 服务器已启动,监听
127.0.0.1:143
。(如端口不同,请将下面所有示例中的端口相应替换。) - 已有用户
user1@tio.com
,密码为00000000
。 - 本示例同时提供
telnet
和curl
两种测试方式。
一、Telnet 交互测试
启动 Telnet 会话
telnet 127.0.0.1 143
成功连接后,应立即看到类似:
* OK tio-mail-wing IMAP4rev1 server ready
CAPABILITY
C: A001 CAPABILITY S: * CAPABILITY IMAP4rev1 AUTH=LOGIN IDLE UIDPLUS ID LITERAL+ S: A001 OK CAPABILITY completed.
AUTHENTICATE LOGIN(多步 Base64)
C: A002 AUTHENTICATE LOGIN S: + VXNlcm5hbWU6 ← “Username:” 的 Base64 C: dXNlcjFAdGlvLmNvbQ== ← user1@tio.com(Base64) S: + UGFzc3dvcmQ6 ← “Password:” 的 Base64 C: MDAwMDAwMDA= ← 00000000(Base64) S: A002 OK AUTHENTICATE completed.
ID(客户端标识交换)
C: A003 ID ("name" "Telnet Client" "version" "1.0") S: * ID ("name" "tio-mail-wing") S: A003 OK ID completed.
LIST(列出所有邮箱)
C: A004 LIST "" "*" S: * LIST (\HasNoChildren) "/" INBOX S: A004 OK LIST completed.
LIST 特定文件夹(检查 Trash 是否存在)
C: A005 LIST "" "Trash" S: * LIST (\HasNoChildren) "/" INBOX ← 如果未实现 Trash,则只返回 INBOX S: A005 OK LIST completed.
CREATE(创建 Trash)
C: A006 CREATE "Trash" S: A006 OK CREATE completed.
SELECT(选择 INBOX)
C: A007 SELECT "Inbox" S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) S: * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted. S: * 2 EXISTS S: * 1 RECENT S: * OK [UIDVALIDITY 2] UIDs valid. S: * OK [UIDNEXT 100101] Predicted next UID. S: A007 OK [READ-WRITE] SELECT completed.
说明:
EXISTS
、RECENT
、UIDVALIDITY
、UIDNEXT
等数值由您后台数据决定,上例仅作演示。UID FETCH FLAGS(读取所有邮件的标志)
C: A008 UID FETCH 1:* (FLAGS) S: * 1 FETCH (UID 1 FLAGS (\Recent)) S: * 2 FETCH (UID 2 FLAGS (\Recent)) S: A008 OK FETCH completed.
UID FETCH 头部字段
C: A009 UID FETCH 2 (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)]) S: * 1 FETCH (UID 2 RFC822.SIZE 345 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} S: Message-ID: <…> S: Date: Mon, 23 Jun 2025 09:06:36 -1000 S: To: bob@localdomain S: From: alice <alice@localdomain> S: Subject: Work S: Content-Type: text/plain; charset=UTF-8; format=flowed S: ) S: A009 OK FETCH completed.
UID FETCH 全文 BODY[]
C: A010 UID FETCH 2 (UID RFC822.SIZE BODY[]) S: * 1 FETCH (UID 2 RFC822.SIZE 3451 BODY[] {621} S: Return-Path: <alice@localdomain> S: X-Original-To: bob@localdomain S: Delivered-To: bob@localdomain S: Received: from … S: … S: work S: ) S: A010 OK FETCH completed.
LOGOUT(登出并断开)
C: A011 LOGOUT S: * BYE tio-mail-wing IMAP server signing off S: A011 OK LOGOUT
服务器随后关闭连接。
二、curl 示例测试
1.SELECT INBOX
curl -v \
--url "imap://192.168.3.8/INBOX" \
--user "user1@tio.com:00000000" \
--request 'select "INBOX"'
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
* 1 EXISTS
* 0 RECENT
* OK [UIDVALIDITY 3] UIDs valid.
* OK [UIDNEXT 100101] Predicted next UID.
2.UID FETCH FLAGS
curl -v \
--url "imap://192.168.3.8/INBOX" \
--user "user1@tio.com:00000000" \
--request 'UID fetch 1:* (FLAGS)'
* Trying 192.168.3.8:143...
* Connected to 192.168.3.8 (192.168.3.8) port 143 (#0)
< * OK tio-mail-wing IMAP4rev1 server ready
> A001 CAPABILITY
< * CAPABILITY IMAP4rev1 AUTH=LOGIN IDLE UIDPLUS ID LITERAL+
< A001 OK CAPABILITY
> A002 AUTHENTICATE LOGIN
< + VXNlcm5hbWU6
> dXNlcjFAdGlvLmNvbQ==
< + UGFzc3dvcmQ6
> MDAwMDAwMDA=
< A002 OK AUTHENTICATE completed.
> A003 SELECT INBOX
< * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
< * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
< * 1 EXISTS
< * 0 RECENT
< * OK [UIDVALIDITY 3] UIDs valid.
< * OK [UIDNEXT 100101] Predicted next UID.
< A003 OK [READ-WRITE] SELECT completed.
> A004 UID fetch 1:* (FLAGS)
< * 1 FETCH (UID 2 FLAGS ())
* 1 FETCH (UID 2 FLAGS ())
< A004 OK FETCH completed.
* Connection #0 to host 192.168.3.8 left intact
UID FETCH 1:* (FLAGS)
服务器会对序列号 1 到 * 范围内的每一封邮件,分别返回一条未标记的 FETCH 响应,最后才返回带标签的 OK 应答。
* 1 FETCH (UID 1 FLAGS (\Seen))
* 2 FETCH (UID 2 FLAGS (\Seen))
* 3 FETCH (UID 3 FLAGS (\Seen))
* 4 FETCH (UID 4 FLAGS ())
* 5 FETCH (UID 5 FLAGS ())
< A004 OK FETCH completed.
3. UID FETCH 头部字段
curl -v \
--url "imap://192.168.3.8/INBOX" \
--user "user1@tio.com:00000000" \
--request 'UID FETCH 2 (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)])'
response
* Connected to 192.168.3.8 (192.168.3.8) port 143 (#0)
< * OK tio-mail-wing IMAP4rev1 server ready
> A001 CAPABILITY
< * CAPABILITY IMAP4rev1 AUTH=LOGIN IDLE UIDPLUS ID LITERAL+
< A001 OK CAPABILITY
> A002 AUTHENTICATE LOGIN
< + VXNlcm5hbWU6
> dXNlcjFAdGlvLmNvbQ==
< + UGFzc3dvcmQ6
> MDAwMDAwMDA=
< A002 OK AUTHENTICATE completed.
> A003 SELECT INBOX
< * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
< * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
< * 1 EXISTS
< * 0 RECENT
< * OK [UIDVALIDITY 3] UIDs valid.
< * OK [UIDNEXT 100101] Predicted next UID.
< A003 OK [READ-WRITE] SELECT completed.
> A004 UID FETCH 2 (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 2 RFC822.SIZE 345 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}
* 1 FETCH (UID 2 RFC822.SIZE 345 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
< {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
<
< )
< A004 OK FETCH completed
4.UID FETCH 全文 BODY[]
curl -v \
--url "imap://192.168.3.8/INBOX" \
--user "user1@tio.com:00000000" \
--request 'UID fetch 2 (UID RFC822.SIZE BODY[])'
response
< * OK tio-mail-wing IMAP4rev1 server ready
> A001 CAPABILITY
< * CAPABILITY IMAP4rev1 AUTH=LOGIN IDLE UIDPLUS ID LITERAL+
< A001 OK CAPABILITY
> A002 AUTHENTICATE LOGIN
< + VXNlcm5hbWU6
> dXNlcjFAdGlvLmNvbQ==
< + UGFzc3dvcmQ6
> MDAwMDAwMDA=
< A002 OK AUTHENTICATE completed.
> A003 SELECT INBOX
< * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
< * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
< * 1 EXISTS
< * 0 RECENT
< * OK [UIDVALIDITY 3] UIDs valid.
< * OK [UIDNEXT 100101] Predicted next UID.
< A003 OK [READ-WRITE] SELECT completed.
> A004 UID fetch 2 (UID RFC822.SIZE BODY[])
< * 1 FETCH (UID 2 RFC822.SIZE 3451 BODY[] {621}
* 1 FETCH (UID 2 RFC822.SIZE 3451 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
<
< )
< A004 OK FETCH completed.