1. 程式人生 > >java mail附件 文體中文亂碼

java mail附件 文體中文亂碼

轉自:

http://blog.csdn.net/neo_liu0000/article/details/7710824

發郵件:

郵件頭(參見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”)); //B為base64方式

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

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

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

         裡面有個=?GBK?Q?,GBK表示的是內容的字符集,?Q?表示的是以QP方式編碼的(?B?則是以base64方式編碼),後面緊跟的才是編碼後的中文字元。所以用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("")) // ContentType為編碼型別,如GBK等

mbp.setText( Content ); // 由JavaMail來決定編碼

else

mbp.setContent( Content, ContentType); // 指定編碼格式

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為正確的郵件正文了

收郵件

javaMail收郵件的操作是:1.連線到Pop3郵件伺服器2.得到郵件物件陣列3.檢視指定郵件的資訊4.刪除郵件。

javamail通過pop3接收到發件人的亂碼問題:

郵件發件人的格式為:姓名+<郵件地址>

而有些郵件沒姓名,直接是<郵件地址> 。可以把它看成一個字串,這個字串先經過編碼,然後可以被加密。由於Email的規範,在smtp傳輸中不可使用中文字元。所以可以使用內建類的MimeUtility方法encodeText將收件人、發件人名字編碼即可。編碼方式有兩種:"B"代表Base64、"Q"代表QP(quoted-printable)方式。

從163的pop3的伺服器上讀取我的郵件,並輸出發件人。中文出現了亂碼。收件人字串格式有:utf-8,gbk,gb2312,gb18030。加密形式有"B"代表Base64如:=?gb2312?B?1sfBqtXQxrj=?= <[email protected]>",可以看出,這個字串的編碼格式是:gb2312,而採用了base64加密。Q表QP(quoted-printable)方式

對於沒有加密的字串,直接用rtnStr=new String(str.getBytes("iso-8859-1"));就能正確顯示。對於加密的字串,需要用rtnStr=MimeUtility.decodeText(str);就能解決。

關於郵件正文處理亂碼方式:

   部分程式碼:

 InputStream in = part.getInputStream();
                 try{
                 if(contenttype.toLowerCase().indexOf("charset") == -1){
                 StringBuffer sb = new StringBuffer();
                 
                 InputStreamReader isr=new InputStreamReader(in,"GBK");
                 BufferedReader br=new BufferedReader(isr);
                 String strLine=br.readLine();
                 String s=new String(strLine.getBytes("gbk"),"gbk");
                 sb.append(s);
                 isr.close();
                 result.append(sb.toString());

相關推薦

java mail附件 文體中文亂碼

轉自: http://blog.csdn.net/neo_liu0000/article/details/7710824 發郵件: 郵件頭(參見RFC822,RFC2047)只能包含US-ASCII字元。郵件頭中任何包含非US-ASCII字元的部分必須進行編碼,使其

Java web 中的中文亂碼問題總結

一、亂碼由來:        大家都知道一句話:“亂碼是因為編碼和解碼方式不一致造成的”。 那麼,我們為什麼要編碼呢?        那就要從計算機底層是如何表示人類語言(

java實現Servlet的中文亂碼處理

HttpServletRequest:這個物件封裝了客戶端提交過來的一切資料 客戶端提交資料給服務端(這裡指的是在網頁輸入內容提交servlet處理時,在servlet控制檯的輸出亂碼),如果資料中帶有亂碼,可參照如下方法解決: 如果是GET請求(若無亂碼則無需修改) String n

java壓縮zip檔案中文亂碼問題

用java來打包檔案生成壓縮檔案,有兩個地方會出現亂碼 1、內容的中文亂碼問題,這個問題網上很多人給出瞭解決方法,兩種:修改sun的原始碼;使用開源的類庫org.apache.tools.zip.ZipOutputStream和org.apache.tools.zip.ZipEntry,這兩個類ant.ja

centos下Java生成圖片字型中文亂碼問題

將需要的字型上傳jdk目錄:/usr/local/jdk1.7.0_79/jre/lib/fonts 例如:msyhbd.ttf msyh.ttf 從window中找,目錄:C:\WINDOWS\Fonts\ 重啟tomca

java資料傳輸時中文亂碼

在傳送mq時,傳入資料正常,但是消費者接收的資料是亂碼的,可以在傳送的時候對資料進行編碼,然後消費者在進行解碼即可 java中編碼:URLEncoder.encode(URLEncoder.encode("傳遞的中文","utf-8")); java中解碼碼:URLDecoder.decode(

Java Web 中 Servlet 中文亂碼解決方法

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

Java:IO流之:中文亂碼的探究

前言----- 整理是有價值的,記憶無法相信,~ 目錄 一.理解各種編碼規則 我的轉載部落格----"字串的前世今生", 大家好好看看,先對各種編碼規則有所瞭解,這是重要的基礎!!! 二.輸出"簡"字在4種編碼規則下對應的十六進位制值

Java程式中的中文亂碼問題的解決方法

中文問題的來源 計算機最初的作業系統支援的編碼是單位元組的字元編碼,於是,在計算機中一切處理程式最初都是以單位元組編碼的英文為準進行處理。 隨著計算機的發展,為了適應世界其它民族的語言(當然包括我們的漢字),人們提出了UNICODE編碼,它採用雙位元組編碼,相容英文字元和其它民族的雙位元

java html轉pdf 中文亂碼

網上關於 html生產pdf的java程式碼許多,我就不說了。主要是記錄一下亂碼問題的關鍵 1、html檔案必須是utf-8編碼格式的檔案。 2、程式碼中的獲取方式也是utf-8的格式。 3、其他的按照別人的教程編寫

解決 Java Mail 接受郵件主題 亂碼

message獲取主題有兩種方式: //頭部獲取 message.getHeader("subject")[0]; //message中獲取 message.getSubject(); 第二種方法 郵件主題會出現亂碼,但大部分是正常,舉個例子 郵件主題寫成 “的” 第一種一定不會出現亂

jython環境安裝、java呼叫python、中文亂碼問題

1、jython安裝 jython下載地址 http://www.jython.org/downloads.html (1)直接雙擊“jython-installer-2.7.0.jar”一步步安裝即可 (2)配置環境變數,     新建系統環境變數:  JYTHON_HO

Java讀取文字檔案中文亂碼問題

最近遇到一個問題,Java讀取文字檔案(例如csv檔案、txt檔案等),遇到中文就變成亂碼。讀取程式碼如下: List<String> lines=new ArrayList<String>(); BufferedReader br = new

java檔案下載以及中文亂碼解決

  在客戶端下載檔案時替換下載檔案的名稱,但是當名稱是中文時瀏覽器會出現亂碼,解決程式碼如下: public org.springframework.http.ResponseEntity<InputStreamResource> handleExcel(HttpServletRe

記一個bug:Linux中Java Graphics drawString寫中文亂碼

近期用到了動態生成二維碼的功能,並且在二維碼底下加文字,win下開發沒有出現問題,但是部署到Linux環境下出現中文亂碼。經排查之後發現程式碼中Font類(new Font("微軟雅黑", Font.PLAIN, 35))用到了"微軟雅黑"中文字型,但Centos預設沒有這種

解決java編寫sql語句中文亂碼問題

實行一條插入語句輸出後發現中文沒有被識別,中文亂碼我們可以更改DriverManage,在後邊加上設定編碼.DriverManager.getConnection("jdbc:mysql://localhost:3306/資料庫?useUnicode=true&cha

tips:linux伺服器上java應用圖片中中文亂碼的解決

專案中需要將一定的業務邏輯實時的用圖片繪出來,難免用到中文,在自己電腦上開發時沒有任何問題,但是部署到linux下tomcat中時,圖片中的中文全部亂碼,口口口口...... 檢索了一下原因,是由於當前執行的系統環境下缺乏中文字型導致,將文字繪製出來時,會將文字拆成畫素點進

Java servlet中cookie中文亂碼解決

由於之前出現錯誤:java.lang.IllegalArgumentException: Control character in cookie value or attribute. 是編碼問題造成的。 故先在寫入cookie時進行編碼:URLEncoder.encode

idea2017.03做java web 專案解決中文亂碼問題

方法一:第一步:修改配置檔案進入tomcat對應版本資料夾-->conf-->serve.xml,右擊用記事本開啟 將<Connector port="8080" protocol="HTTP/1.1"               connectionTim

Java 讀取ANSI檔案中文亂碼問題解決方式

第一步:首先判斷原始檔的編碼格式: 按照給定的字符集儲存檔案時,在檔案的最開頭的三個位元組中就有可能儲存著編碼資訊,所以,基本的原理就是隻要讀出檔案前三個位元組,判定這些位元組的值,就可以得知其編碼的格式。其實,如果專案執行的平臺就是中文作業系統,如果這些文字檔案在專案內