首页   >   代码编程   >   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"));

QQ群Ⅰ: 686430774 (已满)

QQ群Ⅱ: 718410762 (已满)

QQ群Ⅲ: 638620451 (已满)

QQ群Ⅳ: 474195684 (已满)

QQ群Ⅴ: 463034360

如果文章有帮到你,可以考虑请博主喝杯咖啡!

分享到:

欢迎分享本文,转载请注明出处!

作者:不忘初心

发布时间:2019-08-11

永久地址:https://www.jiweichengzhu.com/article/c7400831ccc54c768011c5fe337b65a0

评论