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;
}
我的邮件主题是
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;
}