我正在尝试通过Gmail帐户消化一些邮件,并且我收到的一封或多封邮件在发件人的标题中有格式化的名称。
的内容 A = [
{"rcCode":"ABC", "deleted":"1"},
{"rcCode":"DEF", "deleted":"0"},
{"rcCode":"GHI", "deleted":"1"},
{"rcCode":"JKL", "deleted":"0"}
];
B = [
{"cegCode":"DEF"},
{"cegCode":"GHI"}
];
上面的名称是假的,但说明了我遇到的情况,名称是用'['替换一个或多个'C'字符。
触发错误的代码
[hris [hristerson <chrisDoesNotExist@gmail.com>
错误本身表现为:String header = "[hris [hristerson <chrisDoesNotExist@gmail.com>";
boolean strict = true; // I also tried using a false value
InternetAddress.parse(header, strict);
我正在做的一些研究让我觉得按RFC-2047使用编码字可能是一个答案。但除非我错误地尝试,否则它似乎不起作用。另外,其他类似的非法字符在我的测试中不会给我同样的错误,这让我觉得它是偶然的,并且更独特的是java库问题。
我用来尝试基本编码字修复的代码是:
javax.mail.internet.AddressException: Missing ']'
将其称为:public String encodePrettyEmailHeader(String header, String charset, char encoding) {
Map<String, String> illegalChars = new HashMap<>();
illegalChars.put("\\[", "=5B");
illegalChars.put("]", "=5D");
illegalChars.put("\\(", "=28");
illegalChars.put("\\);", "=29");
illegalChars.put("<", "=3C");
illegalChars.put(">", "=3E");
illegalChars.put("@", "=40");
illegalChars.put(",", "=2C");
illegalChars.put(";", "=3B");
illegalChars.put(":", "=3A");
illegalChars.put("\"", "=22");
illegalChars.put("/", "=2F");
illegalChars.put("\\?", "=3F");
illegalChars.put(" ", "=20");
String email = getEmailFromHeader(header).trim(); // regex to get the <email@address.com> from the header
String name = header.substring(0, header.indexOf(email)).trim();
for (Map.Entry<String, String> anEntry : illegalChars.entrySet()) {
name = name.replaceAll(anEntry.getKey(), anEntry.getValue());
}
return String.format("=?%s?%c?%s?= %s", charset, encoding, name, email);
}
我希望有一个答案不涉及手动将数据编码为quoted-printable,我相信我应该能够使这个janky解决方案工作,但是,这将增加更多的开销,因为我需要在数据可以有效显示之前取消编码。
有人对我有什么建议吗?
编辑:
我升级了我的版本并且发生了相同的结果。但是,我意识到当我对地址标头进行模糊处理时,我添加了一组额外的引号,超出了从gmail到达的引用。为简洁起见:
这是我错误格式化的方式:
InternetAddress.parse(encodePrettyEmailHeader(header, "UTF-8", 'Q'), strict);
这是我失败的正确格式:
"[hris [hristerson" <chrisDoesNotExist@gmail.com>
编辑2:
为清楚起见,我正在使用[hris [hristerson <chrisDoesNotExist@gmail.com>
,我已升级到group: 'com.sun.mail', name: 'javax.mail', version: '1.5.5'
,但行为没有区别。
答案 0 :(得分:1)
我有两个解决方案。
1)使用构造函数:
InternetAddress workingStyle2 = new InternetAddress("chrisDoesNotExist@gmail.com", "[hris [hristerson","UTF-8");
System.out.println(workingStyle2.getPersonal());
System.out.println(workingStyle2.getAddress());
2)使用严格模式= false 。使用严格模式时请注意不同的API,请调用parseHeader而不是解析。
为了更好地支持实际消息中看到的“无效”地址范围,当strict标志为false时,此方法强制执行比解析方法更少的语法规则,并在strict标志为true时强制执行更多规则。如果strict标志为false且解析成功分离出一个或多个电子邮件地址,则不会检查地址本身的语法。
boolean strict = false;
InternetAddress[] working = InternetAddress.parseHeader(header, strict);
System.out.println(working[0].getPersonal());
System.out.println(working[0].getAddress());