由于邮件我写的程序的邮件主题是写在配置文件(. properties)中的,而Java程序读取properties配置文件内容时,是根据操作的编码方式来读取的,这样就造成程序的可移植性差。
带有中文的配置文件,尽量不用*. properties文件,标题的乱码问题就可以通过添加
String subject = MimeUtility.encodeText(email_title,"gb2312", "B");
来解决:
如果你的标题并不是写在properties里,可用以下方式解决;
发送邮件方法中添加了如下代码:
Properties props = new Properties(); props.put("mail.smtp.host", email_host);//设置发送邮件的邮件服务器的属性mail props.put("mail.smtp.auth", "true");//需要经过授权,也就是有户名和密码的校验,这样才能通过验证 //有了这句便可以在发送邮件的过程中在console处显示过程信息,供调试使 Session session = Session.getDefaultInstance(props);//用刚刚设置好的props对象构建一个session session.setDebug(true);便可以从控制台看到邮件实际发送中的编码等信息
控制台输出类似如下信息:
Subject: =?gb2312?B?1LTX1FNvbmFytcSy+sa31srBv82zvMbI1bGo?=
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="----=_Part_0_1487500813.1433397688098"
------=_Part_0_1487500813.1433397688098
Content-Type: text/html;charset=gb2312
Content-Transfer-Encoding: quoted-printable
。。。。。。
最常用的 Content-Transfer-Encoding 有 Base64 和 Quoted-Printable 两种。在对二进制文件或者中文文本进行转化时,Base64 得到的“字节串”比 Quoted-Printable 更短。在对英文文本进行转化时,Quoted-Printable 得到的“字节串”比 Base64 更短
便可尝试代码中添加
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
msg.setSubject("=?GB2312?B?"+enc.encode(subject.getBytes())+"?=");
String subject = MimeUtility.encodeText(email_title,"gb2312", "B");来解决编码问题;