前不久在我所在的項目中做了一個發送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文件本身的編碼有關。
|