littleQ

          終于明白曾經(jīng)他們失落的目光,當(dāng)年的你們是否一樣;間有懈怠或有頹放,難知多久方能補(bǔ)上;今起,不再彷徨!

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            33 Posts :: 0 Stories :: 60 Comments :: 0 Trackbacks
          前不久在我所在的項(xiàng)目中做了一個(gè)發(fā)送html郵件模板的升級(jí)包,選一個(gè)人群,選一個(gè)模板,然后發(fā)送。
          很簡(jiǎn)單的一個(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,再簡(jiǎn)單不過的事情了。
          然后根據(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è)郵件模板也測(cè)試過,當(dāng)時(shí)也沒發(fā)現(xiàn)問題。可是上線后,用戶使用的時(shí)候說主題出現(xiàn)亂碼。讓用戶把模板發(fā)過來,本地再進(jìn)行測(cè)試,居然發(fā)送后的郵件正文格式,都變成了純文本。
          使用下面的設(shè)置主題的方式后,就正常了:
          message.setSubject(title);

          暫時(shí)還沒有深入的去查找原因,直覺上是認(rèn)為和html文件本身的編碼有關(guān)。
          posted on 2008-07-29 11:22 littleQ 閱讀(636) 評(píng)論(1)  編輯  收藏

          Feedback

          # re: 郵件發(fā)送時(shí)的亂碼問題 2008-07-29 12:05 傳軍
          切身體會(huì),好!!!  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航: