HelloWorld 善战者,求之于势,不责于人;故能择人而任势。

知止而后有定,定而后能静,静而后能安,安而后能虑,虑而后能得。物有本末,事有终始。知所先后,则近道矣。

  BlogJava :: 首页 ::  :: 联系 ::  :: 管理 ::
  167 随笔 :: 1 文章 :: 40 评论 :: 0 Trackbacks

近日,发现gmail开放了IMAP服务,于是想着iOffice的WebMail功能是否能够对应Gmail呢? 虽然不用想都知道WebMail方面,不可能做的比gmail更好。但是出于一种功能验证的考虑,还是进行了尝试用iOffice的WebMail去连接gmail的邮件账户。

这一连接,发现WebMail只支持pop3/imap/smtp的protocol,而对gmail的pop3 ssl/imap ssl/smtp ssl的安全连接都不支持,于是奋力去修改,终于今天搞定了。

接着为了测试邮件的多样性,从Hotmail账户当中转移了一部分邮件进入gmail的IMAP Folder,发现英国金融时报旗下的FT中文网发送的新闻邮件,居然无法在WebMail中显示,出现Exception.

java.io.IOException: Unknown encoding: GB2312
at javax.mail.internet.MimePartDataSource.getInputStream(MimePartDataSource.java:108)
at com.sun.mail.handlers.text_plain.getContent(text_plain.java:90)
at javax.activation.DataSourceDataContentHandler.getContent(DataHandler.java:775)
at javax.activation.DataHandler.getContent(DataHandler.java:522)
at javax.mail.internet.MimeMessage.getContent(MimeMessage.java:1395)

觉得很奇怪,GB2312肯定属于Java认识的encoding啊? 为什么会出这种信息呢? 仔细检查此邮件的源码,以及查阅资料。发现此处所说的Encoding并非是Java Encoding。 而是邮件的一种自有的编码。 该新闻邮件的编码

Date: Thu, 20 Aug 2009 09:09:16 +0800
MIME-Version: 1.0
Content-Type: text/html; charset=”gb2312″
Content-Transfer-Encoding: gb2312
Message-ID: 1250730614939471@200809NewsLetter

该邮件的发送程序把 text/html charset=gb2312的编码部分,当作Content-Transfer-Encoding的编码,而实际上JavaMail认识的Content-Transfer-Encoding包含如下几种:”base64″, “quoted-printable”, “7bit”, “8bit”, “binary”, “uuencode”。

原则上针对这种错误格式的邮件,可以不对应,但是考虑到未来可能还有别的问题,于是直接去修改 javax.mail.internet.MimePartDataSource.java,

public InputStream getInputStream() throws IOException {
InputStream is;

try {
if (part instanceof MimeBodyPart)
is = ((MimeBodyPart)part).getContentStream();
else if (part instanceof MimeMessage)
is = ((MimeMessage)part).getContentStream();
else
throw new MessagingException(“Unknown part”);
String encoding = restrictEncoding(part.getEncoding(), part);
if (encoding != null){
if(encoding.equalsIgnoreCase(“GB2312″) ||
encoding.equalsIgnoreCase(“GBK”)){
encoding = “7bit”;
}

return MimeUtility.decode(is, encoding);
}else{
return is;
}
} catch (MessagingException mex) {
throw new IOException(mex.getMessage());
}
}

编译好以后,放回 sun-javamail-1.4.2.jar,执行一遍后,OK了。



</script>

posted on 2010-10-09 13:38 helloworld2008 阅读(1609) 评论(0)  编辑  收藏 所属分类: java

只有注册用户登录后才能发表评论。


网站导航: