动态网站制作指南



当前位置 > 网站建设学院 > 邮件系统软件 > 其它邮件服务器软件 Rss

JavaMail 之 杜绝邮件乱码


发表日期:2006-12-3


我一直想不通,RFC822 标准都发布多少年了,为什么还有那么多不符合规范的email 出现呢?一来也许是服务器的问题,二来就是不负责任的程序员的错了。所以我突然意识到,不是只有冷血无情的老板和咄咄逼人的客户让程序员的身心饱受摧残,同行的不经意或经意也在加剧着伤害。

我面对着一份邮件原文发出以上的感慨,客户抱怨该邮件收到的时候在系统中正文显示是乱码而标题正常。这是一份典型的不合规范的邮件: 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,但通常我们收到的很多不符合规范的邮件都是简体或者繁体中文的,所以设置默认charset 为 GBK比较保险。

3. 最后再处理邮件 header,如果没有charset 信息,使用 bodyCharset,否则使用默认charset。

以上的解决方案,只要邮件的Body或者Header中的一个提供了编码信息,那么都可能可以避免乱码的产生,如果哪份遭千杀的邮件,Body 用 gb2312 编码,Subject 却是未编码的日文,那我只能长叹被击败了。如果整份邮件都没有编码信息的话,除非你确定邮件都是指定的编码并进行转码,否则只有听天由命。

在寻求解决方案的过程中,参考了JCharDet 项目,一个猜测字符串编码集的程序包,具体参见竹笋炒肉的blog。不过在实际操作中,猜测结果并不准确,繁体字总被猜作UTF-16。

最后呼吁一声,请遵循规范!

关注此文的读者还看过:
·2012-2-9 8:18:53 利用UTL_MAIL发送电子邮件
·2012-2-9 8:05:25 用Windows 2003配置邮件服务器
·2012-2-9 7:57:46 使用System.Web.Mail通过需验证的邮件服务器发送邮件
·2012-2-9 7:56:36 强大的企业级邮件服务器:VOP modusMail
·2012-2-9 7:53:09 WebEasyMail 官方FAQ
·2012-2-9 7:53:01 邮件服务器CMailServer 功能设置
·2012-2-9 7:42:02 使用Magic Winmail Server轻松架设邮件服务器(六)
·2012-2-9 7:28:46 使用Magic Winmail Server轻松架设邮件服务器(二)
·2012-2-9 7:20:55 Javamail操作指南:实例代码解析
站长推荐 PS笔刷下载 在线翻译 系统进程 广告代码
  发表评论
姓 名: 验证码:
内 容:
教程搜索服务
项目外包信息
·设计外包(限杭州本地设计师)
·Discuz论坛二次开发首页
·找长期合作的网页设计师(切图+
·SNS 网站开发
·云南大蓄文化传播有限公司网站设
·药品代购网站
·FLASH网站汉化
·求高手帮我设计一个减肥产品网站
·flash首页制作(已有设计图)
·寻求长期外包人员
·网页页面修改
·北京地区 flash动画合作
·佛山网站建设+263企业邮箱找我。
·ecshop+Discuz! X2+ Home会员整
·寻找网站建设团队或者个人合伙
发布信息 浏览信息
邮件订阅服务
输入你的邮件地址,你将不会错过任何关于<其它邮件服务器软件>的内容


邮件系统软件文章分类
Qmail
IMail Server
MDaemon Server
Exchange Server
Lotus Notes
其它邮件服务器软件
站长工具:Google PR查询|Alexa排名查询|网站速度测试|CSS在线编辑器|OPEN参数生成器|弹出式窗口代码产生器|密码登录生成器|在线按钮生成器|Meta标签生成器|邮箱图标在线生成|多色彩特效字代码生成器|网页代码调试器|在线FTP登陆|Flash取色器|配色代码对照表|配色辞典|CSS生成器|CSS在线压缩|广告代码|框架网页代码生成器|js/vbs加密|md5加密|进制转换|UTF-8 转换工具|在线调色板|Html转换js|Html转换asp|Html转换php|Html转换perl
实用工具:汉字翻译拼音|拼音字典|在线翻译|天气预报|火星文|在线网速测试|符号对照表|个税计算|理财工具|黄金价格|购房银行按揭利率计算|汇率查询|经典小工具|汉字简繁转换|普通单位换算|公制单位换算|生辰老黄历|国内电话区号|国家代码与域名缩写|文字加密解密|元素周期表|健康查询|世界时间|全国各地车牌查询|全国车辆交通违章查询|万年历|二十四节气|汉字横竖排版|手机号码查询|计算器|ip搜索
广告刊登 | 版权声明 | 联系我们 | 加入收藏 | RSS订阅
Copyright © 2000-2012 www.knowsky.com All rights reserved | 沪ICP备05001343号