我们的程序经常会出现这样一个问题
在WinXp下测试是正常的
而到了服务器(Linux操作系统)上就出现这个问题
由于邮件我写的程序的邮件主题是写在配置文件(properties)中的再通过nativeascii把中文邮件主题从本地码(简体中文WindXp是GBK)转换为Unicode编码而Java程序读取properties配置文件内容时是根据操作的编码方式来读取的这样就造成程序的可移植性差
没有指定邮件主题的编码方式
当一段Text或者HTML通过电子邮件传送时发送的内容首先通过一种指定的字符编码转化成字节串然后再把字节串通过一种指定的传输编码(ContentTransferEncoding)进行转化得到另一串字节串比如打开一封电子邮件源代码可以看到类似的内容
ContentType:text/plain;charset=gb
ContentTransferEncoding:base
sbG+qcrQuqOcfyeebGjzW+bwudzAdbQMQNCgKvPKzxqOuqOcnnsaPWNDEDQoNCg==
最常用的ContentTransferEncoding有Base和QuotedPrintable两种在对二进制文件或者中文文本进行转化时Base得到的字节串比QuotedPrintable更短在对英文文本进行转化时QuotedPrintable得到的字节串比Base更短
邮件的标题用了一种更简短的格式来标注字符编码和传输编码比如标题内容为中则在邮件源代码中表示为
//正确的标题格式
Subject:=?GB?B?tA=?=
其中
第一个=?与?中间的部分指定了字符编码在这个例子中指定的是GB
?与?中间的B代表Base如果是Q则代表QuotedPrintable
最后?与?=之间的部分就是经过GB转化成字节串再经过Base转化后的标题内容
如果传输编码改为QuotedPrintable同样如果标题内容为中
//正确的标题格式
Subject:=?GB?Q?=D=D?=
如果阅读邮件时出现乱码一般是因为字符编码或传输编码指定有误或者是没有指定比如有的发邮件组件在发送邮件时标题中
//错误的标题格式
Subject:=?ISO?Q?=D=D?=
这样的表示实际上是明确指明了标题为[xDxD]即ÖÐ而不是中
解决方法
()修改操作系统编码方式为GBK或在服务器上通过nativeascii把邮件主题重新生成Unicode编码并更新配置文件内容
()给邮件主题指定编码方式
sunmiscBASEEncoderenc=newsunmiscBASEEncoder();
msgsetSubject(=?GB?B?+encencode(subjectgetBytes())+?=);
建议带有中文的配置文件尽量不用*properties文件而用XML文件替代