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

検索語には、いわゆるリテラルを使用しています。リテラルの長さはオクテットで指定する必要があります。あなたの例ではそうではありません。UTF-8 でエンコードされた文字列「αβγδ」は、4 オクテット以上で構成されています。

そのため、長さをサーバーに送信する前に、検索語をエンコードする必要があります。

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 に答える