JavaMail乱码问题

最近一个项目中碰到JAVAMAIL的应用,因为开发环境是在WIN OS中,所以在开发过程中的测试一直都很正常,但当系统提交给测试,放到linux os中时,邮件发送却出现了乱码。下面是在开发过程中(WIN OS)能够正常发送邮件的代码

message.setFrom(new InternetAddress(MimeUtility.encodeText(emailEntity.getFromName()) + " [email protected]"));

该代码在WIN OS中正常,到LINUX OS中出现了乱码,后修改代码如下:

BASE64Encoder base64Encoder = new BASE64Encoder();
  message.setFrom(new InternetAddress("=?gbk?B?" + base64Encoder.encode(emailEntity.getFromName().getBytes("GBK")) + "?= [email protected]"));

修改后的代码在WIN OS和LINUX OS中测试都能正常显示中文

 

 

 

改动说明:

对“收件人、发件人、主题”进行BASE64编码

下面是一封正常显示中文的邮件的头部(包括发件人、收件人、主题的源代码截图)

 

 

 

可以看出一封邮件正常情况下显示的发件人信息如下

From: =?gbk?B?w/Gwsr01z9U=?= [email protected]

说明:以 ?= 开始后接编码方式(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")) + "?= [email protected]"));

 

base64Encoder.encode(emailEntity.getFromName().getBytes("GBK")) 这里采用

emailEntity.getFromName().getBytes("GBK");在未指定GBK时仍出现乱码,这里的原因可能是因为数据库使用的是GBK的编码,因为emailEntity中fromeName字段是从数据库中读取出来的,就这样乱码问题终于解决...

 

 

提供一条查看数据库编码方式的SQL(至少ORACLE适用)

select userenv('language') from dual;

你可能感兴趣的:(oracle,linux,数据库,OS,测试,javamail)