近日,發現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>