最近在做邮箱功能,其中发件时也需要记录下邮箱的昵称,所以代码中的邮箱地址前会有中文昵称,这也导致邮件发送失败
后台显示邮件发送成功,但是却被退回

Mail delivery failed: returning message to sender

其中,收件地址是这样写的:中文昵称<111111@qq.com> ;
List<String> tos = new ArrayList<>();
tos.add("人不风流枉为人<11111111@qq.com>");
if (ValidateUtils.isNotEmpty(tos)) {
InternetAddress[] toAddress = new InternetAddress[tos.size()];
for (int i = 0; i < tos.size(); i++) {
toAddress[i] = new InternetAddress(tos.get(i));
}
msg.addRecipients(Message.RecipientType.TO, toAddress);
}
将邮件中文名称去掉,或者改为英文名称,则可以正常发送。
如果还是想要带有中文名称(其实大可不必,因为我的后端接口需要用到这个名称保存在数据库中,所以只能这样),那需要用到 MimeUtility 的转码方法:
先做个测试,方便理解
String name = "人不风流枉为人";
String en = MimeUtility.encodeText(name);
System.out.println("encodeText: "+en);
//结果 encodeText: =?UTF-8?B?5Lq65LiN6aOO5rWB5p6J5Li65Lq6?=
String dn = MimeUtility.decodeText(en);
System.out.println("decodeText: "+dn);
//结果 decodeText: 人不风流枉为人
所以,最后的解决方法,就是将中文昵称转码,测试通过
参考文章:
在实现邮箱功能时,遇到使用JavaMail发送包含中文昵称的邮件失败问题。邮件虽然显示发送成功,但实际被退回。解决办法是使用MimeUtility进行转码,将中文昵称转码后,邮件可以正常发送。测试验证了该方法的有效性。
765

被折叠的 条评论
为什么被折叠?



