我需要通过java发送邮件,其中InternetAddress的Personal(发件人名称)可以是任意UTF8字符串。由于我的电子邮件地址字符串可能包含个人信息,因此我仅使用InternetAddress(String)构造函数来构建适当的InternetAddress:

InternetAddress sender = new InternetAddress( "s\u00E8nder <[email protected]>" );
sender.setPersonal( sender.getPersonal(), Charsets.UTF_8.name() );


根据我的理解(测试似乎支持此功能),基本的InternetAddress构造函数不执行任何Personal编码,因此我在另一个步骤中执行此操作,该步骤按照MIME对Personal进行编码。

我的问题是该过程在某些情况下是否会失败,javadoc说如果解码失败,.getPersonal()可能会返回原始数据。但这真的会发生吗?
而且,如果它失败了,将会引起任何麻烦,正如javadoc告诉setPersonal那样,仅当它包含非ASCII时才进行编码,但是rawdata不会这样做,对吗?

最佳答案

您使用的构造函数假定地址字符串已经正确编码,就像从电子邮件标题中读取地址字符串一样。您应该分别维护电子邮件地址和个人名称字段,并使用将它们作为单独参数的构造函数。如果您没有个人名称,则可以传递null。

您可以使用toUnicodeString方法获取使用的格式的字符串,但是无法解析这样的字符串。

09-27 05:15