前不久在我所在的項(xiàng)目中做了一個(gè)發(fā)送html郵件模板的升級包,選一個(gè)人群,選一個(gè)模板,然后發(fā)送。
很簡單的一個(gè)小功能,可是在coding的時(shí)候還是遇到了一些小問題。其中最主要的一個(gè)問題,就是模板文件本身的字符集的問題。
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);
上面的代碼創(chuàng)建一個(gè)MimeMessage,再簡單不過的事情了。
然后根據(jù)模板名稱獲取html文件內(nèi)容,接著我做了這樣一件事情,把模板內(nèi)容轉(zhuǎn)成gb2312編碼。
 try{
temp = IOUtils.toString(IOUtils.toInputStream(temp, "gb2312"));
// temp = new String(temp.getBytes("gb2312"),"ISO-8859-1");
 } catch (IOException e){
logger.error("模板讀取后,string格式轉(zhuǎn)換時(shí)出錯(cuò).", e);
return null;
}
設(shè)置郵件正文:
message.setText(temp, "gb2312");
message.setDataHandler(new DataHandler(temp, "text/html;charset=gb2312"));
在郵件正文中,查找<title>XXX</title>,title的value就作為郵件的主題。這時(shí)候,就出問題了。
我是這么寫的:
message.setSubject("=?GB2312?B?" + enc.encode(title.getBytes()) + "?=");
選了幾個(gè)郵件模板也測試過,當(dāng)時(shí)也沒發(fā)現(xiàn)問題。可是上線后,用戶使用的時(shí)候說主題出現(xiàn)亂碼。讓用戶把模板發(fā)過來,本地再進(jìn)行測試,居然發(fā)送后的郵件正文格式,都變成了純文本。
使用下面的設(shè)置主題的方式后,就正常了:
message.setSubject(title);
暫時(shí)還沒有深入的去查找原因,直覺上是認(rèn)為和html文件本身的編碼有關(guān)。
|