2017-10-13 62 views
2

错误我试图消化通过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',但行为没有差异。

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

+1

我不能用你究竟用JavaMail 1.6.0以上的有代码重现该问题。你使用的是什么版本的JavaMail? –

+0

啊!这很有趣,我似乎在使用1.5.5。这可能是值得关注的,看看它是否是版本错误 –

+0

我将我的javamail版本升级到1.6.0,并且即将开始测试。我会回报@BillShannon –

回答

1

我有两个解决方案给你。

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()); 
+0

选项2似乎为我做了!包含有问题的字符的标题在使用'strict = false'和'InternetAddress.parseHeader(...)组合成功解析时' –

相关问题