熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

JavaMail發送中文郵件中主題亂碼的解決方法

2013-11-23 19:27:29  來源: Java核心技術 
    我們的程序經常會出現這樣一個問題在WinXp下測試是正常的而到了服務器(Linux操作系統)上就出現這個問題


        由於郵件我寫的程序的郵件主題是寫在配置文件( properties)中的再通過nativeascii把中文郵件主題從本地碼(簡體中文Wind Xp 是GBK)轉換為Unicode 編碼而Java程序讀取properties配置文件內容時是根據操作的編碼方式來讀取的這樣就造成程序的可移植性差
        沒有指定郵件主題的編碼方式
    當一段 Text 或者 HTML 通過電子郵件傳送時發送的內容首先通過一種指定的字符編碼轉化成字節串然後再把字節串通過一種指定的傳輸編碼(ContentTransferEncoding)進行轉化得到另一串字節串比如打開一封電子郵件源代碼可以看到類似的內容
ContentType: text/plain;charset=gb
ContentTransferEncoding: base
sbG+qcrQuqOcfyeebGjzW+bwudzAdbQMQNCgKvPKzxqOuqOcnnsaPWNDEDQoNCg==
最常用的 ContentTransferEncoding 有 Base 和 QuotedPrintable 兩種在對二進制文件或者中文文本進行轉化時Base 得到的字節串比 QuotedPrintable 更短在對英文文本進行轉化時QuotedPrintable 得到的字節串比 Base 更短
    郵件的標題用了一種更簡短的格式來標注字符編碼傳輸編碼比如標題內容為 則在郵件源代碼中表示為
// 正確的標題格式
Subject: =?GB?B?tA=?=
其中
第一個=??中間的部分指定了字符編碼在這個例子中指定的是 GB 
??中間的B代表 Base如果是Q則代表 QuotedPrintable 
最後??=之間的部分就是經過 GB 轉化成字節串再經過Base 轉化後的標題內容 
如果傳輸編碼改為 QuotedPrintable同樣如果標題內容為 
// 正確的標題格式
Subject: =?GB?Q?=D=D?=
    如果閱讀郵件時出現亂碼一般是因為字符編碼傳輸編碼指定有誤或者是沒有指定比如有的發郵件組件在發送郵件時標題 
// 錯誤的標題格式
Subject: =?ISO?Q?=D=D?=
這樣的表示實際上是明確指明了標題為 [xD xD]即 ÖÐ而不是 
        解決方法
修改操作系統編碼方式為GBK或在服務器上通過nativeascii把郵件主題重新生成Unicode 編碼並更新配置文件內容
給郵件主題指定編碼方式
sunmiscBASEEncoder enc = new sunmiscBASEEncoder();  
msgsetSubject(=?GB?B?+encencode(subjectgetBytes())+?=);


    建議帶有中文的配置文件盡量不用* properties文件而用XML文件替代

From:http://tw.wingwit.com/Article/program/Java/hx/201311/26904.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.