«BAD Could not parse command» возвращается, если имя почтового ящика содержит не английские символы - PullRequest
0 голосов
/ 25 сентября 2018

Я использую компоненты Chilkat.IMAP для получения писем с серверов IMAP.Если имя почтового ящика содержит неанглийские символы, возвращается «BAD Could not parse command»:

----IMAP REQUEST----
aaai LIST "[Gmail]/" "%"
----IMAP RESPONSE----
* LIST (\All \HasNoChildren) "/" "[Gmail]/All Mail"
* LIST (\HasChildren \Trash) "/" "[Gmail]/Bin"
* LIST (\Drafts \HasNoChildren) "/" "[Gmail]/Drafts"
* LIST (\HasNoChildren \Important) "/" "[Gmail]/Important"
* LIST (\HasNoChildren \Sent) "/" "[Gmail]/Sent Mail"
* LIST (\HasNoChildren \Junk) "/" "[Gmail]/Spam"
* LIST (\HasNoChildren) "/" "[Gmail]/&BB8EMAQ,BDoEMA-"
aaai OK Success

----IMAP REQUEST----
aaaj LIST "[Gmail]/All Mail/" "%"
----IMAP RESPONSE----
aaaj OK Success

----IMAP REQUEST----
aaap LIST "[Gmail]/Папка/" "%"
----IMAP RESPONSE----
aaap BAD Could not parse command

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Возможно, вы используете очень старую версию Chilkat.Попробуйте последнюю версию, она должна работать нормально.Если нет, пожалуйста, дайте нам знать ..

0 голосов
/ 26 сентября 2018

IMAP по умолчанию не отправляет 8-битные символы, а оригинальный протокол определяет почтовые ящики с неанглийскими символами ASCII для кодирования UTF-7 (с некоторыми изменениями).Это &BB8EMAQ,BDoEMA-, который вы видите.

Вы можете добавить кодировку / декодирование UTF-7 в свое приложение или, если ваш сервер достаточно новый, в режиме ENABLE UTF-8.Примечание: включение UTF-8 может получить Unicode в тех местах, которые вы не ожидаете.Gmail поддерживает это расширение.

> a LIST "" *
< ...
< * LIST (\HasChildren) "/" "&AOk-cole"

> b ENABLE UTF8=ACCEPT
< ...
< * LIST (\HasChildren) "/" "école"

Вот как ломается строка UTF-7:

[Gmail]/&BB8EMAQ,BDoEMA-

& и - переход в режим декодирования и выход из него, так что это выглядит как

"[Gmail]/" + mUTF7decode("BB8EMAQ,BDoEMA")

А вот Python 3 один лайнер, который декодирует это.С добавлением "===" для соответствия требованиям дополнения base64 и altchars, указывающим последние два символа кодировки base64:

>>> import base64;  base64.b64decode("BB8EMAQ,BDoEMA===", altchars="+,").decode("utf-16be")
'Папка'
...