Skip to content

IMAP 手动测试脚本 ​

前提条件 ​

  • IMAP 服务器已启动,监听 127.0.0.1:143。(如端口不同,请将下面所有示例中的端口相应替换。)
  • 已有用户 user1@tio.com,密码为 00000000。
  • 本示例同时提供 telnet 和 curl 两种测试方式。

一、Telnet 交互测试 ​

  1. 启动 Telnet 会话

    bash
    telnet 127.0.0.1 143

    成功连接后,应立即看到类似:

    * OK tio-mail-wing IMAP4rev1 server ready
  2. CAPABILITY

    C: A001 CAPABILITY
    S: * CAPABILITY IMAP4rev1 AUTH=LOGIN IDLE UIDPLUS ID LITERAL+
    S: A001 OK CAPABILITY completed.
  3. 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.
  4. ID(客户端标识交换)

    C: A003 ID ("name" "Telnet Client" "version" "1.0")
    S: * ID ("name" "tio-mail-wing")
    S: A003 OK ID completed.
  5. LIST(列出所有邮箱)

    C: A004 LIST "" "*"
    S: * LIST (\HasNoChildren) "/" INBOX
    S: A004 OK LIST completed.
  6. LIST 特定文件夹(检查 Trash 是否存在)

    C: A005 LIST "" "Trash"
    S: * LIST (\HasNoChildren) "/" INBOX    ← 如果未实现 Trash,则只返回 INBOX
    S: A005 OK LIST completed.
  7. CREATE(创建 Trash)

    C: A006 CREATE "Trash"
    S: A006 OK CREATE completed.
  8. 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 等数值由您后台数据决定,上例仅作演示。

  9. 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.
  10. 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.
  11. 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.
  12. 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
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
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.

MIT Licensed