2012-04-12 4 views
1

C# Imap search command with special characters like á,éIMAP Suchbefehl mit UTF-8-Zeichensatz in C#

Ich versuche, die Logik in dem obigen Beitrag in C# erwähnt zu implementieren Nicht-Ascii-basierter Suche in gmail zu erreichen. erfolgreich zu imap.gmail.com ich mit dem Server die folgenden Transaktion habe Nach der Anmeldung:

(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)" 

jedoch die E-Mail durch die Antwort des Servers bezeichnet ist völlig irrelevant für den Suchbegriff I zur Verfügung gestellt. Dies passiert nur, wenn Sie nicht-ASCII-Zeichen in den Schlüsselwörtern verwenden und ich glaube, dass etwas mit der Codierung nicht stimmt.

Ich habe auch versucht mit Encoding.Ascii aber dann bekomme ich Suchergebnisse, die noch mehr vom Ziel abweichen.

Was ist der richtige Weg ist, um die Zeichenfolge zu senden wörtliche: "αβγδ\r\n"

Antwort

3

Für den Suchbegriff ein, verwenden Sie einen sogenannten wörtlichen. Die Länge des Literals muss in Oktetts angegeben werden. Dies ist in Ihrem Beispiel nicht der Fall. Die in UTF-8 codierte Zeichenfolge "αβγδ" besteht aus mehr als vier Oktetten.

Also, sollten Sie den Suchbegriff vor dem Senden der Länge an den Server verschlüsseln.

Ich weiß nicht viel über C#. Ich mache ein Beispiel mit 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 .*$') 

Mit diesem Code, der Suchbefehl gibt die UIDs der E-Mails mit dem Text "Grüße":

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' 

Wenn ich die Länge in Zeichen (len(search_term)) anstelle der codierten Länge in Bytes (len(encoded_search_term)), meldet der IMAP-Server einen Fehler:

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' 

Hinweis, ich habe Gmail nicht für meine Tests verwenden.

+0

ich korrigiert stehen. Ich werde das testen, sobald ich etwas Zeit habe. Wenn ich richtig verstehe, sind die zwei Dinge, die ich falsch gemacht habe, dass # 1 Ich habe nicht die Umwandlung des Suchbegriffs in Bytes in UTF8 durchgeführt (anstelle von Encoding.Default) und # 2 sollte ich die Anzahl der decodierten Bytes wo {4} gerade jetzt ist Nochmals vielen Dank im Voraus und fühlen sich frei, mich zu korrigieren, wenn ich Ihre Antwort bin falsch interpretiert. – xDisruptor

+0

SEARCH_TERM = 'Grüße' encoded_search_term = search_term.encode ('UTF-8') length = Str (len (encoded_search_term)). Kodieren ('ASCII') Dieser Teil trully leuchtet. Ich hätte es nie alleine herausfinden können. Danke eine Milliarde m8. Ich wünschte, ich hätte genug Punkte, um dich zu überreden. Wie ich schon sagte, werde ich das testen, sobald ich etwas Zeit habe. Prost. – xDisruptor