我需要帮助解决下一个问题:
我需要使用 Gmail 上的非ascii字符进行搜索(西里尔字母(例如俄语或乌克兰语< / em>的))。当我使用标准IMAP SEARCH命令时,我收到错误:
A12 SEARCH CHARSET UTF-8 SUBJECT "текст" ALL
A12 BAD Could not parse command
在Java中,它看起来像
Message[] foundMessages = imapFolder.search(new SubjectTerm("текст"));
我在IMAP search for non-ascii characters找到了一些帮助。使用openssl s_client -crlf -connect imap.gmail.com:993
我已通过终端连接到我的邮箱,并且我已收到下一个结果:
A12 SEARCH CHARSET UTF-8 X-GM-RAW {10}
+ go ahead
текст
* SEARCH 226
A13 OK SEARCH completed (Success)
主要问题 - 如何在Java中实现它?
更新
我已经对JavaMail源代码做了一些研究。我找到了下一行
// if server supports UTF-8, enable it for client use
// note that this is safe to enable even if mail.mime.allowutf8=false
if (p.hasCapability("UTF8=ACCEPT") || p.hasCapability("UTF8=ONLY"))
p.enable("UTF8=ACCEPT");
}
从gmail服务器我们收到下一个功能
A1 LOGIN test@gmail.com password
* CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN
X-GM-EXT-1 UIDPLUS COMPRESS=DEFLATE ENABLE MOVE CONDSTORE ESEARCH
UTF8=ACCEPT LIST-EXTENDED LIST-STATUS
LITERAL-SPECIAL-USE APPENDLIMIT=35651584
因此,JavaMail会自动将mail.mime.allowutf8
设置为true
。但在这种情况下,JavaMail使用下一个命令进行搜索
C6 SEARCH CHARSET UTF-8 X-GM-RAW "текст" ALL
我收到错误
C6 BAD Could not parse command
Argument.nastring(byte[] bytes, Protocol protocol, boolean doQuote)
boolean utf8 = protocol.supportsUtf8(); - &GT; 对于Gmail,这是真的。这就是JavaMail没有使用文字的原因。
byte b;
for (int i = 0; i < len; i++) {
b = bytes[i];
if (b == '\0' || b == '\r' || b == '\n' ||
(!utf8 && ((b & 0xff) > 0177))) {
// NUL, CR or LF means the bytes need to be sent as literals
literal(bytes, protocol);
return;
}
if (b == '*' || b == '%' || b == '(' || b == ')' || b == '{' ||
b == '"' || b == '\\' ||
((b & 0xff) <= ' ') || ((b & 0xff) > 0177)) {
quote = true;
if (b == '"' || b == '\\') // need to escape these characters
escape = true;
}
}
我已经测试了其他没有UTF8=ACCEPT
的电子邮件提供商。一切正常。
K11 SEARCH CHARSET UTF-8 SUBJECT {10}
+ continue
текст ALL
* SEARCH 1194
K11 OK SEARCH completed
答案 0 :(得分:1)
从快速浏览一下,如果您使用javamail 1.6.1,它应该是Just Work。您可能希望/需要将mail.mime.allowutf8
属性设置为true。
更详细地说:1.6增加了对unicode电子邮件地址的支持,例如jøran@blåbærsyltetøy.gulbrandsen.priv.no,这种副作用几乎无处不在地定期使用UTF8。当你连接到gmail时,javamail 1.6应该发送一个登录命令,然后自动发送一行a04 enable utf8=accept
并且一旦gmail发出utf8 = accept,a12 search subject "текст" all
就成了合法的语法,应该做什么你想。