JavaMail的。在Gmail

时间:2018-05-02 10:16:26

标签: javamail imap

我需要帮助解决下一个问题:

我需要使用 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

我已经进行了调查 https://github.com/javaee/javamail/blob/52e04fc107d0b83fa794e6f622f7c76b9e85e395/mail/src/main/java/com/sun/mail/iap/Argument.java#L313

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

1 个答案:

答案 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就成了合法的语法,应该做什么你想。