郵件傳送時的亂碼問題

二十七杯酒發表於2008-07-30
前不久在我所在的專案中做了一個傳送html郵件模板的升級包,選一個人群,選一個模板,然後傳送。
很簡單的一個小功能,可是在coding的時候還是遇到了一些小問題。其中最主要的一個問題,就是模板檔案本身的字符集的問題。
Properties props = System.getProperties();
Session session;

props.put("mail.smtp.host", strSMTPAdress);
props.put("mail.smtp.port", strSMTPPort);

if (strSenderPassword == null) {
props.put("mail.smtp.auth", "false");
session = Session.getDefaultInstance(props);
} else {
props.put("mail.smtp.auth", "true");
MyAuthenticator myauth = new MyAuthenticator(strSenderEmail, strSenderPassword);
session = Session.getDefaultInstance(props, myauth);
}

MimeMessage message = new MimeMessage(session);

上面的程式碼建立一個MimeMessage,再簡單不過的事情了。
然後根據模板名稱獲取html檔案內容,接著我做了這樣一件事情,把模板內容轉成gb2312編碼。
try{
temp = IOUtils.toString(IOUtils.toInputStream(temp, "gb2312"));
// temp = new String(temp.getBytes("gb2312"),"ISO-8859-1");
} catch (IOException e){
logger.error("模板讀取後,string格式轉換時出錯.", e);
return null;
}設定郵件正文:
message.setText(temp, "gb2312");
message.setDataHandler(new DataHandler(temp, "text/html;charset=gb2312"));

在郵件正文中,查詢<title>XXX</title>,title的value就作為郵件的主題。這時候,就出問題了。
我是這麼寫的:
message.setSubject("=?GB2312?B?" + enc.encode(title.getBytes()) + "?=");

選了幾個郵件模板也測試過,當時也沒發現問題。可是上線後,使用者使用的時候說主題出現亂碼。讓使用者把模板發過來,本地再進行測試,居然傳送後的郵件正文格式,都變成了純文字。
使用下面的設定主題的方式後,就正常了:
message.setSubject(title);

暫時還沒有深入的去查詢原因,直覺上是認為和html檔案本身的編碼有關。

相關文章