您现在的位置是:网站首页 > 代码编程 > JAVA开发JAVA开发

【原】javax mail发送邮件设置发件人中文名称,解决中文乱码问题

不忘初心 不忘初心 2019-08-11 围观() 评论() 点赞() JAVA开发

简介:使用java mail发送邮件,如何为发件人设置中文名称?java发送邮件时,发件人中文名字乱码该如何解决?Java使用javax.mail发送邮件,解决收件人、发件人名字乱码问题。

之前写了java发送邮件的教程,但是最近在使用的时候,发现了一点儿美中不足,发送邮件的时候,没有指定名字的功能,对方收到邮件时,在邮箱中看到的直接是发送者的邮件地址,虽然问题不大,但是有时候涉及到系统发送的场景时,应该以品牌名作为发送者名字,比如“积微成著”。

查阅了一下资料,发现问题其实很简单,只需要在发送者邮箱之前加上名字就行了(如:剑圣 <jiansheng@qq.com>),好了,不多哔哔,直接上代码了。

public static void sendTextEmail(String receiver, String subject, String content) {
    try {
        // 得到会话对象
        Session session = Session.getInstance(properties());
        // 获取邮件对象
        Message message = new MimeMessage(session);
        // 设置发件人邮箱地址(尖括号前面需要一个空格)
        message.setFrom(new InternetAddress("剑圣 <" + sender + ">"));

        ...
        
    } catch (Exception e) {
        log.error("发送QQ邮件失败:{}", ExceptionUtils.getStackTrace(e));
    }
}

上述代码的写法是没有问题的,但是涉及到了中文就会有乱码,进而就会导致邮箱地址解析失败:

2019-08-10 23:21:45.177 ERROR 14340 --- [      Thread-25] com.wolffy.reader.util.QQMailUtil        : 发送QQ邮件失败:javax.mail.AuthenticationFailedException: 535 Error: ÇëʹÓÃÊÚȨÂëµÇ¼¡£ÏêÇéÇë¿´: http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256

	at com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:965)
	at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:876)
	at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:780)
	at javax.mail.Service.connect(Service.java:366)
	at javax.mail.Service.connect(Service.java:246)
	at javax.mail.Service.connect(Service.java:267)
	at com.wolffy.reader.util.QQMailUtil.sendRichEmail(QQMailUtil.java:126)
	at com.wolffy.reader.controller.ApplyController.notifyAdministrator(ApplyController.java:104)
	at com.wolffy.reader.controller.ApplyController.lambda$insert$0(ApplyController.java:75)
	at java.lang.Thread.run(Thread.java:748)

错误很清晰,就是乱码导致解析错误乱,进而鉴权失败,不过所幸官方已经提供了encode的api来帮我们处理这个问题。

乱码解决方法一:

message.setFrom(new InternetAddress(MimeUtility.encodeText("空悠悠") + " <" + sender + ">"));

利用MimeUtility.encodeText(),将中文先转码,然后再拼接上后面的邮箱地址,这样就可以了。

乱码解决方法二:

利用InternetAddress的构造函数,它除了提供单个参数的构造方法,还有几个可指定参数编码的构造方法。

/**
 * Construct an InternetAddress given the address and personal name.
 * The address is assumed to be a syntactically valid RFC822 address.
 *
 * @param address	the address in RFC822 format
 * @param personal	the personal name
 * @param charset	the MIME charset for the name
 * @exception	UnsupportedEncodingException if the personal name
 *			can't be encoded in the given charset
 */
public InternetAddress(String address, String personal, String charset)
			throws UnsupportedEncodingException {
this.address = address;
setPersonal(personal, charset);
}

第一个参数就不多说了,后面两个分别是用户名字和编码,非常的简洁:

message.setFrom(new InternetAddress(sender, "剑圣", "UTF-8"));

java发邮件

看完文章,有任何疑问,请加入群聊一起交流!!!

很赞哦! ()

文章评论

  • 请先说点什么
    人参与,条评论

请使用电脑浏览器访问本页面,使用手机浏览器访问本页面会导致下载文件异常!!!

雨落无影

关注上方公众号,回复关键字【下载】获取下载码

用完即删,每次下载需重新获取下载码

若出现下载不了的情况,请及时联系站长进行解决

站点信息

  • 网站程序:spring + freemarker
  • 主题模板:《今夕何夕》
  • 文章统计:篇文章
  • 标签管理标签云
  • 微信公众号:扫描二维码,关注我们