最近一个项目中碰到JAVAMAIL的应用,因为开发环境是在WIN OS中,所以在开发过程中的测试一直都很正常,但当系统提交给测试,放到linux os中时,邮件发送却出现了乱码。下面是在开发过程中(WIN OS)能够正常发送邮件的代码
message.setFrom(new InternetAddress(MimeUtility.encodeText(emailEntity.getFromName()) + " xxx@xx.xx"));
该代码在WIN OS中正常,到LINUX OS中出现了乱码,后修改代码如下:
BASE64Encoder base64Encoder = new BASE64Encoder();
message.setFrom(new InternetAddress("=?gbk?B?" + base64Encoder.encode(emailEntity.getFromName().getBytes("GBK")) + "?= xxx@xx.xx"));
修改后的代码在WIN OS和LINUX OS中测试都能正常显示中文
改动说明:
对“收件人、发件人、主题”进行BASE64编码
下面是一封正常显示中文的邮件的头部(包括发件人、收件人、主题的源代码截图)
可以看出一封邮件正常情况下显示的发件人信息如下
From: =?gbk?B?w/Gwsr01z9U=?= xxx@xx.xx
说明:以 ?= 开始后接编码方式(GBK),再以?号隔开,中间B表示经过BASE64编码,再后面的?后的wc7WvrPJ就是表示对某段中文经过BASE64编码后的字符串,最后再以?=结束),既然无法使用JAVAMAIL提供的工具类来编码汉字(查看JAVAMAIL的源码可以发现其实MimeUtility.encodeText()方法也是在对中文进行BASE64编码),那只好采取手动拼凑的方法对汉字进行BASE64编码,代码如下:
BASE64Encoder base64Encoder = new BASE64Encoder();
message.setFrom(new InternetAddress("=?gbk?B?" + base64Encoder.encode(emailEntity.getFromName().getBytes("GBK")) + "?= xxx@xx.xx"));
base64Encoder.encode(emailEntity.getFromName().getBytes("GBK")) 这里采用
emailEntity.getFromName().getBytes("GBK");在未指定GBK时仍出现乱码,这里的原因可能是因为数据库使用的是GBK的编码,因为emailEntity中fromeName字段是从数据库中读取出来的,就这样乱码问题终于解决...
提供一条查看数据库编码方式的SQL:(至少ORACLE适用)
select userenv('language') from dual;