JavaMail API getSubject(), subject 有多个"=?utf-8?B?~?=",如何解析?

JavaMail API getSubject(), subject has multiple "=?utf-8?B?~?=", how can I parse?

我的邮件主题是

Subject: =?utf-8?B?7IOI66Gc7Jq0IOyEpOusuOyhsOyCrOqwgCDsi5zsnpHrkJjs?=
 =?utf-8?B?l4jsirXri4jri6QhIOydtCDquLDtmowg64aT7LmY7KeAIOuniOyEuOya?=
 =?utf-8?B?lCE=?=

mimeMessage.getSubject() returns 下面:

黑色方块是失败角色。语言是韩语。
以下是正确的主题:

我像下面这样连接原始数据,MimeUtility.decodeText() returns 好的结果。
(删除\r\n,删除内部“=?utf-8?B?”和“?=”)

MimeUtility.decodeText(=?utf-8?B?7IOI66Gc7Jq0IOyEpOusuOyhsOyCrOqwgCDsi5zsnpHrkJjsl4jsirXri4jri6QhIOydtCDquLDtmowg64aT7LmY7KeAIOuniOyEuOyalCE=?=)

结果是:

如何解析多行的主题?

问题是对这段文本进行编码的邮件程序编码不正确。使用哪个邮件程序创建此消息?

16 位韩语 Unicode 字符被转换为 UTF-8 格式的 8 位字节流。然后使用 base64 编码对 8 位字节进行编码。

MIME 规范 (RFC 2047) 要求每个编码的单词包含完整的 个字符:

   Each 'encoded-word' MUST represent an integral number of characters.
   A multi-octet character may not be split across adjacent 'encoded-
   word's.

在您上面的示例中,代表韩语字符之一的字节被拆分为多个编码字。将它们组合成一个编码字,就像您所做的那样,可以正确解码文本。

这是创建消息的邮件程序中的错误,应报告给该邮件程序的所有者。

不幸的是,对于这种损坏的邮件程序,JavaMail 中没有好的解决方法。

我创建了递归解码 5 次的函数。

/*
 * Decodes 5 times encoded text with MimeUtility.decodeText()
 */
private String decode(String encoded) throws UnsupportedEncodingException {
    String result = MimeUtility.decodeText(encoded);
    int counter = 0;
    while (result.contains("=?") && counter < 5) {
        counter++;
        String end = result.substring(result.indexOf("=?"));
        result = result.substring(0, result.indexOf("=?")) + MimeUtility.decodeText(end);
    }
    return result;
}