1

C# Imap 搜索命令,带有 á,é 等特殊字符

我正在尝试在 C# 中实现上述帖子中提到的逻辑,以在 gmail 中实现基于非 ascii 的搜索。成功登录 imap.gmail.com 后,我与服务器进行了以下交易:

(C -> S) Encoding.Default.GetBytes("A4 UID SEARCH CHARSET UTF-8 TEXT {4}\r\n");
(C <- S) "+ go ahead\r\n"
(C -> S) Encoding.Default.GetBytes("αβγδ\r\n");
(C <- S) "* SEARCH 72\r\nA2 OK SEARCH completed (Success)"

但是,服务器响应表示的电子邮件与我提供的搜索词完全无关。这只发生在关键字中使用非 ascii 字符时,我相信我的编码有问题。

我也尝试过使用Encoding.Ascii,但后来我得到的搜索结果更加偏离目标。

发送字符串文字的正确方法是什么:"αβγδ\r\n"

4

1 回答 1

4

对于搜索词,您使用的是所谓的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 进行测试。

于 2012-04-12T20:25:47.037 回答