使用'['字符解析电子邮件地址标头时出现javax.mail错误

时间:2017-10-13 16:54:29

标签: java email javamail

我正在尝试通过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',但行为没有区别。

我也尝试将strict设置为false,但抛出的异常也没有什么不同。Debugger screenshot example

1 个答案:

答案 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());