1. 程式人生 > >JavaMail傳送中文郵件中主題亂碼的解決方法

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

   我們的程式經常會出現這樣一個問題,在WinXp下測試是正常的,而到了伺服器(Linux作業系統)上就出現這個問題。


    1、    由於郵件我寫的程式的郵件主題是寫在配置檔案(. properties)中的,再通過native2ascii把中文郵件主題從本地碼(簡體中文Wind Xp 是GBK)轉換為Unicode 編碼。而Java程式讀取properties配置檔案內容時,是根據操作的編碼方式來讀取的,這樣就造成程式的可移植性差。
    2、    沒有指定郵件主題的編碼方式
    當一段 Text 或者 HTML 通過電子郵件傳送時,傳送的內容首先通過一種指定的字元編碼轉化成“位元組串”,然後再把“位元組串”通過一種指定的傳輸編碼(Content-Transfer-Encoding)進行轉化得到另一串“位元組串”。比如,開啟一封電子郵件原始碼,可以看到類似的內容:
Content-Type: text/plain;charset="gb2312"
Content-Transfer-Encoding: base64
sbG+qcrQuqO17cf4yee74bGjz9W7+b3wudzA7dbQ0MQNCg0KvPKzxqO6uqO17cnnsaPW0NDEDQoNCg==
最常用的 Content-Transfer-Encoding 有 Base64 和 Quoted-Printable 兩種。在對二進位制檔案或者中文文字進行轉化時,Base64 得到的“位元組串”比 Quoted-Printable 更短。在對英文文字進行轉化時,Quoted-Printable 得到的“位元組串”比 Base64 更短。
    郵件的標題,用了一種更簡短的格式來標註“字元編碼”和“傳輸編碼”。比如,標題內容為 "中",則在郵件原始碼中表示為:
// 正確的標題格式
Subject: =?GB2312?B?1tA=?=
其中,
第一個“=?”與“?”中間的部分指定了字元編碼,在這個例子中指定的是 GB2312。 
“?”與“?”中間的“B”代表 Base64。如果是“Q”則代表 Quoted-Printable。 
最後“?”與“?=”之間的部分,就是經過 GB2312 轉化成位元組串,再經過Base64 轉化後的標題內容。 
如果“傳輸編碼”改為 Quoted-Printable,同樣,如果標題內容為 "中":
// 正確的標題格式
Subject: =?GB2312?Q?=D6=D0?=
    如果閱讀郵件時出現亂碼,一般是因為“字元編碼”或“傳輸編碼”指定有誤,或者是沒有指定。比如,有的發郵件元件在傳送郵件時,標題 "中":
// 錯誤的標題格式
Subject: =?ISO-8859-1?Q?=D6=D0?=
這樣的表示,實際上是明確指明瞭標題為 [0x00D6, 0x00D0],即 "ÖÐ",而不是 "中"。
    3、    解決方法
(1):修改作業系統編碼方式為GBK,或在伺服器上通過native2ascii把郵件主題重新生成Unicode 編碼,並更新配置檔案內容;
(2):給郵件主題指定編碼方式:
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();  
msg.setSubject("=?GB2312?B?"+enc.encode(subject.getBytes())+"?=");

相關推薦

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

   我們的程式經常會出現這樣一個問題,在WinXp下測試是正常的,而到了伺服器(Linux作業系統)上就出現這個問題。    1、    由於郵件我寫的程式的郵件主題是寫在配置檔案(. properties)中的,再通過native2ascii把中文郵件主題從本地碼(簡體中文Wind Xp 是GBK)轉換

Android使用HttpConnection傳送中文到伺服器端亂碼解決辦法

最近在寫一個簡單地案例,是將二維碼掃描的資訊傳送到伺服器端,並存儲到資料庫。以前的測試都是用英文,沒出什麼問題,今天試了一下中文,卻發現傳到伺服器端的全是亂碼。 解決步驟: 1、伺服器端是用PHP來寫,所以在保證檔案儲存為utf-8格式的前提下,在加上頭宣告

Struts2action接收中文參數為亂碼解決方法

tin rate 過濾 apache nrv win @override name dci 老實說,中文亂碼問題是每個程序員會經常遇到的問題,而且也是一個很頭疼的問題。網上很多關於解決中文亂碼的帖子,看幾個之後你會發現大都是一樣的。但是我們照著做,卻還是無法解決亂碼問題。我

php寫入數據到mysql數據庫出現亂碼解決方法

names .com http image alt ima utf8 情況 mysql 亂碼情況: 在選擇數據庫前加入一句代碼即可 mysql_query("set names utf8"); 最後效果 php寫入數據到mysql數據庫中出現亂碼解決方法

SpringMVC繫結引數亂碼解決方法(Post與Get)

post解決方法: 在web.xml中配置如下引數,由於在javaweb中執行順序是listen——>filter——>servlet,在將請求傳遞給springmvc的前端控制器的時候,filter會先處理,其中下面的處理就是處理請求過來post的引數的亂碼問

struts2傳中文引數到action亂碼解決方法

在做專案時,由於需要表單提交時,將中文引數傳到action進行處理。雖然我的jsp與action的編碼格式都為UTF-8。但是 中文引數傳遞到action時,已然變為亂碼。於是,我找到一種決解方法。 首先,通過js將中文引數轉碼 如:var cou_year = encod

中文亂碼-Javaweb-response輸出中文時瀏覽器頁面亂碼解決方法

中文亂碼有兩類,第一種是,請求物件中文亂碼,即就是request物件亂碼。第二種是,響應物件中文亂碼,即就是response物件亂碼。 第一種情況參見上一篇文章。 2. response物件輸出中文資料亂碼解決方案: 2.1 位元組流輸出響應亂碼。 該

JavaMail郵件別名和主題亂碼解決[轉]

  編碼<o:p></o:p> 郵件頭<o:p></o:p> 郵件頭(參見RFC822,RFC2047)只能包含US-ASCII字元。郵件頭中任何包含非US-ASCII字元的部分必須進行編碼,使其只包含US-ASCII字元。所以

C# .netcookie值為中文時的亂碼解決方法

一.cookie的名稱或子cookie的名稱不能為中文,否則無法獲得cookie 這個好辦,名稱不用中文即可 二.cookie的值為中文時候,取cookie的值會出現亂碼 解決辦法:存取cookie時候先解碼和編碼 存cookie,進行編碼: cookie.Valu

Java Web Servlet 中文亂碼解決方法

Servlet中文亂碼問題解決方法 import java.io.*; import java.net.URLEncoder; import javax.servlet.*; import javax

xshell出現中文亂碼解決方法

        作為一個IT程式設計師,經常需要遠端登入Linux系統的伺服器,使用工具Xshell工具,但是很多時候出現中文問題。根本原因為遠端伺服器Linux系統和本地系統的編碼不一致導致的 。此處的資訊雖然是“總共76”兩個中文漢字,但還是顯示亂碼。一、問題原因:1、遠

idea軟體編碼已經設定好了為utf-8,但是svndown下來的檔案格式本身不是utf-8的,此時開啟後會出現中文亂碼解決方法

我是個idea的忠實使用者,新公司的專案都是用eclipse做的,通過svn拉下程式碼後發現,註釋的內容裡,中文內容都是亂碼。問過專案負責人,說可能是GBK編碼。 但是,我通過idea的setting設定了編碼,試了5種編碼都沒用,中文內容還是亂碼。最後還是自己試出來解決方案。 詳細的原因請參考

javaweb中文亂碼解決方法總結之response和request解決方法

一中文論碼問題出現的由來         之所以會產生亂碼問題,不僅僅是中文亂碼,其原因就在於:編碼和解碼採用了不同的碼錶。而之所以會有編碼和解碼這一回事,也是因為,無論資料是在傳輸還是儲存等等過程中

Tomcat 日誌(控制檯)中文亂碼解決方法

背景: windows系統以Linux指令碼啟動服務 問題 在Tomcat中有時輸出的日誌中文為亂碼,包括控制檯視窗和輸出日誌檔案中都為亂碼。 解決方案 JDK引用的設定 Java引用引數新增"-Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8" 將上面

spring 傳送郵件亂碼情況

只是在網上找了些資料,經過實踐發現好使,加了些備註。 編碼 郵件頭(參見RFC822,RFC2047)只能包含US-ASCII字元。郵件頭中任何包含非US-ASCII字元的部分必須進行編碼, 使其只包含US-ASCII字元。所以使用java mail傳送中文郵件必須經過編碼

sublime text3 python3編譯出現中文亂碼解決方法

一、亂碼現象利用sublime自帶編譯快捷方式ctrl+B會出現中文亂碼的情況print("沒有迴圈資料!") print("完成迴圈!")二、尋找原因1、由於之前我已經安裝了外掛ConvertToUTF8,排除文字編碼錯誤問題2、相同的程式碼在外掛sublimerepl搭建

QT使用MYSQL中文亂碼解決方法(Linux)

1.在QT程式的main.cpp的main函式中QTextCodec```那三句: int main(int argc, char *argv[]) { QApplication a(argc, argv); QTextCodec *codec =

js檔案中文提示資訊發到jsp出現亂碼解決步驟

.js檔案建立預設是gbk編碼,該js檔案中如果有中文,在utf-8的jsp頁面中,顯示改中文,為亂碼! 解決方法: 1--將原來.js檔案中的內容全部複製到剪貼簿中; 2--修改js檔案的編碼格式為utf-8; 3--將剪貼簿中的內容黏貼到原來的js檔案覆蓋原有內

【ubuntu linux】 QT使用MYSQL中文亂碼解決方法

其實這篇文章是整合版,是借鑑網上兩篇文章整合起來的。 先給出兩篇源文章的來源: 第一篇是講mysql資料庫編碼的,而我採用成功的方法是第二篇的。 推薦你先試一下第二篇文章,如果成功了,就不用往下看了。 產生中文亂碼的原因:QT預設的傳送和接受都是UTF-8編碼的,而

windows下eclipse工程轉到linux下原始碼註釋以及輸出字串中文亂碼解決方法

問題出在在windows上面原始碼檔案的編碼方式用cp936,也就是gbk字符集的編碼方式。而linux下預設是utf-8的編碼方式。所以產生了亂碼。 我的解決辦法是: 用vim開啟要轉碼的檔案,在vim中沒有亂碼,必須要無亂碼,如果還有亂碼說明檔案解碼