JavaMail 之 杜绝邮件乱码
2008-02-23 10:08:50来源:互联网 阅读 ()
我面对着一份邮件原文发出以上的感慨,客户抱怨该邮件收到的时候在系统中正文显示是乱码。这是一份典型的不合规范的邮件: Content-Type : text/plain ,没有说明 charset,而接下来的正文直接就是未进行任何编码的中文文字。不过 Subject 却是符合规范的(=?gb2312?B?xxxxxxx?=)。
行行色色的不合规范的邮件见过不少,最常见的就是某些header未编码,还有的可能就是,Body编码了而Subject 未编码,最讨厌的就是整份Email都没有编码信息。
恨归恨,问题还是得解决,我修改了代码,处理逻辑如下:
1. 在最开始解析邮件的时候,先解析某些可能带有编码信息的header,并记录为 headerCharset;部分代码如下:
private static Pattern encodeStringPattern = Pattern.compile("=\\?(. )\\?(B|Q)\\?(. )\\?=", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
private final String[] CHARTSET_HEADER = new String[] { "Subject", "From", "To", "Cc", "Delivered-To" };
..........
Enumeration enum = message.getMatchingHeaderLines(CHARTSET_HEADER);
while (enum.hasMoreElements()) {
String header = (String) enum.nextElement();
Matcher m = encodeStringPattern.matcher(header);
if (m.find()) {
this.headCharset = m.group(1);
log.debug("guess mail charset is " this.headCharset);
break;
}
}
2. 接着解析邮件体,找到 Body 的时候,看看是否指明 charset 信息;如果指定了,记录为 bodyCharset;如果没有,使用 headerCharset,如果 headerCharset 也是 null,使用默认charset。通常是 ISO-8859-1。
3. 最后再处理邮件 header,如果没有charset 信息,使用 bodyCharset,否则使用默认charset。
以上的解决方案,只要邮件的Body或者Header中的一个提供了编码信息,那么都可能可以避免乱码的产生,如果哪份遭千杀的邮件,Body 用 gb2312 编码,Subject 却是未编码的日文,那我只能长叹被击败了。如果整份邮件都没有编码信息的话,除非你确定邮件都是指定的编码并进行转码,否则只有听天由命。
最后还是要呼吁一声,请遵循规范!
上一篇: acegi中的cache配置
下一篇: 构建Linux下IDE环境--Eclipse篇
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash