如果邮箱名称包含非英文符号,则返回"BAD Could not parse command"

"BAD Could not parse command" is returned if mailbox name contains non-English symbols

我正在使用 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

IMAP 默认不发送 8 位字符,并且原始协议将具有非英语 ASCII 字符的邮箱定义为 UTF-7 编码(有一些修改)。这就是您看到的 &BB8EMAQ,BDoEMA-

您可以将 UTF-7 encoding/decoding 添加到您的应用程序,或者,如果您的服务器足够新,则可以添加 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 one liner 可以对其进行解码。添加“===”以满足base64 padding要求,altchars指定base64编码的最后两个字符:

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

您可能使用的是非常旧的 Chilkat 版本。试试最新版本,应该没问题。如果没有,请告诉我们..