最近在做邮箱功能,其中发件时也需要记录下邮箱的昵称,所以代码中的邮箱地址前会有中文昵称,这也导致邮件发送失败
后台显示邮件发送成功,但是却被退回
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: 人不风流枉为人
所以,最后的解决方法,就是将中文昵称转码,测试通过
参考文章:
JAVA基础(13) javaMail发送邮件设置发件人中文昵称