近日,发现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>