176142998

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            116 Posts :: 0 Stories :: 45 Comments :: 0 Trackbacks

           使用java mail 包收發中文郵件的編碼,解碼問題以及解決方法
          JSP教程-郵件相關
          編碼


          郵件頭(參見RFC822,RFC2047)只能包含US-ASCII字符。郵件頭中任何包含非US-ASCII字符的部分必須進行編碼,使其只 包含US-ASCII字符。所以使用java mail發送中文郵件必須經過編碼,否則別人收到你的郵件只能是亂碼一堆。不過使用java mail 包的解決方法很簡單,用它自帶的MimeUtility工具中encode開頭的方法(如encodeText)對中文信息進行編碼就可以了。



          例子:



          MimeMessage mimeMsg = new MimeMessage(mailSession);



          //讓javamail決定用什么方式來編碼 ,編碼內容的字符集是系統字符集mimeMsg.setSubject( MimeUtility.encodeText( Subject) );



          //使用指定的base64方式編碼,并指定編碼內容的字符集是gb2312

          mimeMsg.setSubject( MimeUtility.encodeText( Subject,”gb2312”,”B”));



          通常對郵件頭的編碼方式有2種,一種是base64方式編碼,一種是QP(quoted-printable)方式編碼,javamail根據具體情況來選擇編碼方式。



          如“txt測試”編碼后內容如下:

          =?GBK?Q?Txt=B2=E2=CA=D4



          里面有個=?GBK?Q?,GBK表示的是內容的字符集,?Q?表示的是以QP方式編碼的,后面緊跟的才是編碼后的中文字符。所以用MimeUtility工具編碼后的信息里包含了編碼方式的信息。



          郵件的正文也要進行編碼,但它不能用MimeUtility里的方法來編碼。郵件正文的編碼方式的信息是要放在Content- Transfer-Encoding這個郵件頭參數中的,而MimeUtility里面的方法是將編碼方式的信息放在編碼后的正文內容中。所以如果你對正 文也用MimeUtility進行處理,那么其他郵件程序就不會正常顯示你編碼的郵件,因為其他郵件軟件如outlook,foxmail只會根據 Content-Transfer-Encoding這個里面的信息來對郵件正文進行解碼。



          其實,郵件正文部分的編碼javamail已經自動幫你做了,當你發送郵件的時候,它會自己決定編碼方式,并把編碼方式的信息放入 Content-Transfer-Encoding這個郵件頭參數中,然后再發送。所以你所要做的就是直接把郵件正文的內容放入郵件中就可以了。



          對郵件正文的編碼方式比較多,包括了base64和QP方式,還有一些如7bit,8bit等等,因為javamail自動為郵件正文編碼,所以我就不一一祥敘了。



          例子:



          //處理郵件正文

          MimeBodyPart mbp=new MimeBodyPart();



          if ( ContentType() == null || ContentType.equals(""))

          mbp.setText( Content );

          else

          mbp.setContent( Content, Content );











          解碼


          javamail包中的MimeUtility工具中也提供了對郵件信息解碼的方法,都是以decode開頭的一些方法(如decodeText)



          例子:

          String Subject = mimemsg.getSubject();

          String ChSubject = MimeUtility.decodeText(Subject);



          對于base64和QP編碼后信息,decode* 方法能將他們正確的解碼,但是,如果指定的字符集不對,那么javamail就會出現錯誤,不能正確地將其解碼。



          如有的郵件系統將”txt測試”編碼后如下:

          =?x-unkown?Q?Txt=B2=E2=CA=D4



          這里指定的字符集是x-unknown,是非明確的字符集,javamail就不能正確的處理了,但是”測試”這兩個中文字還是按照gbk字符集編碼的,所以你可以手工的將編碼方式信息改正確,再用decode*方法來解碼。



          例子:

          if ( str.indexOf("=?x-unknown?") >=0 ){

          str = str.replaceAll("x-unknown","gbk" ); // 將編碼方式的信息由x-unkown改為gbk

          try{

          str = MimeUtility.decodeText( str ); //再重新解碼

          }catch( Exception e1){

          return str ;

          }





          decode*方法都是根據在編碼信息中包含的編碼方式的信息來解碼,所以decode*方法對郵件正文解碼是無效的,因為郵件正文中不包含編碼方式的信息。



          同編碼一樣,郵件正文的解碼也是由javamail做了。Javamail根據Content-Transfer-Encoding里的信息,來對郵件的正文解碼。

          客戶程序從javamail取得的正文內容字符集為iso-8859-1,所以還要將字符集轉換一下,例:



          String CorrectContent = new String( Content.getbytes(“iso-8859-1”),”gb2312”);



          CorrentContent為正確的郵件正文了

          posted on 2010-09-01 23:34 飛飛 閱讀(3329) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 玉溪市| 汝南县| 银川市| 噶尔县| 龙江县| 吉木萨尔县| 淮安市| 行唐县| 玉龙| 湘西| 沐川县| 富民县| 高要市| 行唐县| 襄城县| 阜南县| 扶余县| 永平县| 松溪县| 南华县| 梅河口市| 微博| 汾西县| 宜州市| 克拉玛依市| 平潭县| 攀枝花市| 吴旗县| 新乐市| 丽水市| 济南市| 新津县| 淅川县| 独山县| 峨眉山市| 图木舒克市| 囊谦县| 巴南区| 宝兴县| 新巴尔虎右旗| 闽侯县|