首 页 | 精品电影 | 音乐天堂 | 在线游戏 | Flash MTV | 三湘书屋 | 幽默笑话 | 三湘图库 | 美女写真 | IT知识库 | QQ贴图 | 加入书签

网页制作网络编程图形图象操作系统冲浪宝典软件教学网络安全认证考试通信技术电子商务业内动态书籍教程原码

最近更新 文章分类 多媒体类 精品软件

本站搜索:
您的位置:三湘时空 -> IT知识库 -> 文章分类 -> 邮件服务器 -> Javamail处理unicode-1-1-utf-7编码的邮件
Javamail处理unicode-1-1-utf-7编码的邮件


文章类别:邮件服务器 来源: 作者: 发表日期:2006-12-7 字体:[ ]

小游戏 | 在线影院 | 幽默笑话 | 源码下载 | Flash MTV | 音乐试听 | 书屋 | 美女写真

客户总是报告某些email 在outlook中可以正常显示,而在我用javamail编写的客户端却显示正文一片空白。看看日志报告的是 UnsupportedEncodingException 。我让客户把 email 原件从outlook 中下载下来发给我,打开一看,发现标题和正文使用的编码是 unicode-1-1-utf-7。

自从使用utf-8,很久没有遇到乱码的问题了。unicode-1-1-utf-7这个编码真是头一次看到。到google 上一搜,还真有不少人使用 javamail 遇到这个问题。不想这竟是 java 的 bug,参见 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4304013 。难以理解为什么 java 一直到1.4.2还不支持UTF-7编码(j2sdk1.5 不知道搞定没有)。

看看RFC 和一些网上资料,基本了解了UTF-7,摘录一段如下:

UTF-7:A Mail-Safe Transformation Format of Unicode(RFC1642)。这是一种使用 7 位 ASCII 码对 Unicode 码进行转换的编码。它的设计目的仍然是为了在只能传递 7 为编码的邮件网关中传递信息。 UTF-7 对英语字母、数字和常见符号直接显示,而对其他符号用修正的 Base64 编码。符号 + 和 - 号控制编码过程的开始和暂停。所以乱码中如果夹有英文单词,并且相伴有 + 号和 - 号,这就有可能是 UTF-7 编码。

客户自然不能接受程序平台bug这样的借口,所以重要的是如何搞定这个编码。google 又是一阵狂搜,老实说没有google,我不知道我是否仍然可以继续程序员这份很有前途的工作。但话有说回来,google也让我产生了惰性,遇到不明白的例外的时候基本就不再自己思考了。网上提问题的人多,解决问题的人少,好不容易发现有人提供了解决的办法,不曾想竟是个日本人。

我是仇日的,除了三年前一个 Olympus 的数码相机,我一直严于律己,不染日货。但我还是对这个叫做 木下信 的日本人心生敬意。他写了整整一本书来共享其使用 javamail 的经验,《JavaMail完全解说》。其中一篇专门介绍了如何处理 UTF-7编码并提供源码下载。参见:http://www.sk-jp.com/cgi-bin/treebbs.cgi?kako=1%26amp;all=1220%26amp;s=1220,涉及的source可以从 http://www.sk-jp.com/software 下载。

结合日本人的解法,我的部分处理代码如下:

private static String decodeStream(InputStream in, String charset) throws IOException {
//System.out.println(IOUtils.toString(in));
if (isUTF7(charset)) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
int c;

while ((c = in.read()) != -1) {
out.write(c);
}
byte[] bytes = out.toByteArray();

try {
ByteToCharUTF7 btc = new ByteToCharUTF7();
char[] chars = new char[bytes.length / 2 + 1];
btc.convert(bytes, 0, bytes.length, chars, 0, chars.length);
return new String(chars);
} catch (Exception e) {
log.warn("Error occurred while parse stream with charset " + charset
+ ". Cause by: " + e.getMessage());
//可能会抛出sun.io.ConversionBufferFullException, 那么直接用默认编码解码
return new String(bytes, "ISO8859-1");
}

} else {
return IOUtils.toString(in, charset);
}
}

private static boolean isUTF7(String charset) {
return "UTF-7".equalsIgnoreCase(charset) || "unicode-1-1-utf-7".equalsIgnoreCase(charset);
}

完全按照日本人的解法,时常会抛出sun.io.ConversionBufferFullException。问题可能出在它默认假定字符串一定包含有UTF7编码的内容,如果字符串只包含ASCII,那么就抛出了例外(UTF-7 对英语字母、数字和常见符号直接显示,而对其他符号用修正的 Base64 编码,见上UTF7的说明)。所以如果 catch 了例外,就直接用ISO8859-1编码处理。

希望java赶紧支持utf-7。我对unicode一直是一知半解,觉得编码这玩意挺复杂。主要是看到代码中遍布 >>、<< 这样的位操作符就心生怯意。到底不是科班出身啊。

上一篇:用javamail收取hotmail的退信 下一篇:利用UTL_MAIL发送电子邮件
本栏目热门文章
·巧妙配置Win2003自带mail服务器 2006-12-7
·WINWEBMAIL应用CBL列表 2006-12-7
·Windows Server 2003也能提供邮件服务 2006-12-8
·打造一个小巧的邮件服务器 2006-12-7
·中小企业轻松架设E-mail服务器 2006-12-7
·iPlanet Messaging Server 安装图解 2006-12-7
·用Visual C#实现xx邮件接收程序 2006-12-8
·XMAIL的安装及配置 2006-12-7
·近日研究xmail邮件服务器心得 2006-12-7
·如何利用ASP实现邮箱访问 2006-12-7
新近更新文章
·用WebEasyMail架构邮件服务器 2006-12-8
·利用twig架设WebMail系统 2006-12-8
·如何安装一个hotmail的邮箱系统 2006-12-8
·用Foxmail Server搭建邮件服务器 2006-12-8
·Merak 5.94完全上手 2006-12-8
·WebEasyMail 问题解答大全 2006-12-8
·VisNetic MailServer简易安装指南 2006-12-8
·James安装使用简易指南 2006-12-8
·VisNetic MailServer 常见问题 2006-12-8
·Easymail邮件服务端设置全攻略 2006-12-8
首 页 | 软件发布 | 广告联系 | 下载帮助 | 意见反馈 | 网站地图
  CopyRight? 2002-2004 WWW.SXSKY.NET? All Rights Reserved
三湘时空 站长QQ:82675303 Email: