javax.mail解析电子邮件地址标头时出现'['字符
错误我试图消化通过gmail帐户进入的一些邮件,并且收到的一条或多条邮件在发件人的标头中有一个格式化的名称。上述沿javax.mail解析电子邮件地址标头时出现'['字符
[hris [hristerson <[email protected]>
名称线的东西是假的,但示出了我遇到方案中,名称与“[”替代一个或多个“C”的字符。
触发错误
String header = "[hris [hristerson <[email protected]>";
boolean strict = true; // I also tried using a false value
InternetAddress.parse(header, strict);
常表现为错误代码:javax.mail.internet.AddressException: Missing ']'
一些研究,我所做的就是让我觉得用每RFC-2047编码字可能是一个答案。但是,除非我错误地尝试,否则似乎不起作用。另外,其他类似的非法字符在我的测试中不会给我同样的错误,这使我认为这是偶然的,并且是更独特的java库问题。
,我来尝试基本的编码字修复代码为:
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 protected]> 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);
}
调用它像:InternetAddress.parse(encodePrettyEmailHeader(header, "UTF-8", 'Q'), strict);
我希望有不手动涉及一个答案将数据编码为quoted-printable,我相信我应该能够使这个janky的解决方案工作,但是,这将增加更多的开销,因为在数据可以有效显示之前我需要对它进行解码。
有没有人有任何建议让我继续?
编辑:
我升级了我的版本,发生了同样的结果。但是,我意识到,当我混淆地址标题时,我添加了一组额外的引用,超出了从gmail收到的内容。为了简便起见:
这是我如何格式不正确的是: "[hris [hristerson" <[email protected]>
这是正确的格式,对我失败: [hris [hristerson <[email protected]>
编辑2:
为清楚起见,我使用group: 'com.sun.mail', name: 'javax.mail', version: '1.5.5'
,我已升级到group: 'com.sun.mail', name: 'javax.mail', version: '1.6.0'
,但行为没有差异。
我有两个解决方案给你。
1)使用构造:
InternetAddress workingStyle2 = new InternetAddress("[email protected]", "[hris [hristerson","UTF-8");
System.out.println(workingStyle2.getPersonal());
System.out.println(workingStyle2.getAddress());
2)使用严格模式= 假。使用严格模式时请注意不同的API,请致电parseHeader而不是仅解析。
为了更好地支持真实消息中出现的“无效”地址范围,当strict标志为false时,此方法比parse方法执行更少的语法规则,并且在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());
选项2似乎为我做了!包含有问题的字符的标题在使用'strict = false'和'InternetAddress.parseHeader(...)组合成功解析时' –
我不能用你究竟用JavaMail 1.6.0以上的有代码重现该问题。你使用的是什么版本的JavaMail? –
啊!这很有趣,我似乎在使用1.5.5。这可能是值得关注的,看看它是否是版本错误 –
我将我的javamail版本升级到1.6.0,并且即将开始测试。我会回报@BillShannon –