C# Imap search command with special characters like á,é
我正在尝试在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"
答案 0 :(得分:3)
对于搜索字词,您使用的是所谓的文字。必须以八位字节指定文字的长度。在你的例子中并非如此。以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进行测试。