对于搜索词,您使用的是所谓的literal。文字的长度必须以八位字节指定。在您的示例中并非如此。UTF-8 编码的字符串“αβγδ”由四个以上的八位字节组成。
因此,您应该在将长度发送到服务器之前对搜索词进行编码。
我对 C# 了解不多。我用 Python 做一个例子:
search_term = 'Grüße'
encoded_search_term = search_term.encode('UTF-8')
length = str(len(encoded_search_term)).encode('ascii')
send(b'. UID SEARCH CHARSET UTF-8 TEXT {' + length + b'}\r\n')
read_until(br'^\+ .*$')
send(encoded_search_term + b'\r\n')
read_until(br'^\. OK .*$')
使用此代码,搜索命令会返回带有文本“Grüße”的电子邮件的 UID:
C: b'. UID SEARCH CHARSET UTF-8 TEXT {7}\r\n'
S: b'+ Ready for literal data\r\n'
C: b'Gr\xc3\xbc\xc3\x9fe\r\n'
S: b'* SEARCH 1 3 4\r\n'
S: b'. OK UID SEARCH completed\r\n'
如果我使用字符 ( len(search_term)
) 中的长度而不是八位字节 ( ) 中的编码长度len(encoded_search_term)
,IMAP 服务器会报告错误:
C: b'. UID SEARCH CHARSET UTF-8 TEXT {5}\r\n'
S: b'+ Ready for literal data\r\n'
C: b'Gr\xc3\xbc\xc3\x9fe\r\n'
S: b'. BAD expected end of data instead of "\\237e"\r\n'
请注意,我没有使用 Gmail 进行测试。