1. 程式人生 > >spring 傳送郵件中的亂碼情況

spring 傳送郵件中的亂碼情況

只是在網上找了些資料,經過實踐發現好使,加了些備註。

編碼

郵件頭(參見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工具

編碼後的資訊裡包含了編碼方式的資訊。

(上面的不用開發人員自己處理,API已經處理好了,直接交給他們處理就好了)

郵件的正文也要進行編碼,但它不能用MimeUtility裡的方法來編碼。

郵件正文的編碼方式的資訊是要放在Content-Transfer-Encoding這個郵件頭引數中的,而MimeUtility裡面的方法是將編碼方式的資訊放在編

碼後的正文內容中。所以如果你對正文也用MimeUtility進行處理,那麼其他郵件程式就不

會正常顯示你編碼的郵件,因為其他郵件軟體如outlook,foxmail只會根據Content-Transfer-Encoding

這個裡面的資訊來對郵件正文進行解碼。

其實,郵件正文部分的編碼javamail已經自動幫你做了,當你傳送郵件的時候,它會自己決定編碼方式,並把編碼方式的資訊放入Content-

Transfer-Encoding這個郵件頭引數中,然後再發送。所以你所要做的就是直接把郵件正文的內容放入郵件中就可以了。

(

MimeMessage mime = mailSender.createMimeMessage();

MimeMessageHelper helper;

.......

//之前設定為UTF-8,在某些接收的郵件伺服器中有亂碼的情況,改成GBK就好了

//郵件的內容,直接放入就行

helper = new MimeMessageHelper(mime, true, "GBK"); 

)

對郵件正文的編碼方式比較多,包括了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為正確的郵件正文了

相關推薦

spring 傳送郵件亂碼情況

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

基於SSM的spring傳送郵件的實現

郵件傳送功能是我們在開發中非常常見的一個需求,對於各種賬號的註冊繫結和賬號啟用都是非常好用的。因此今天我們來學習一下在spring中實現傳送郵件的功能。 1.匯入jar包。首先我們需要在我們spring專案中新增以下兩個jar包(我是使用的maven所以直接配置依賴資訊)  

java spring 傳送郵件

一  匯入jar 匯入spring-context-support-4.0.5.RELEASE.jar相關jar 二  配置spring配置檔案 這裡可以靈活配置發件郵箱伺服器、發件郵箱埠、發件使用者名稱、密碼 如果系統發件伺服器資訊定死在proper

SSM 框架整合 spring 傳送郵件功能實現!

基於SSM的 spring 傳送郵件的實現 由於考慮到專案中需要,如果程式出現異常或其它問題,可以傳送郵件來及時提醒後臺維護人員處理。所以目前考慮使用JavaMail來實現郵件傳送!如下,是我整理的一些內容,做個筆記記錄下:(當然,在這功能實現之前,需要搭建好

Spring傳送郵件時遇到的錯誤

Spring傳送郵件時發生如下異常: Exception in thread "main" org.springframework.mail.MailAuthenticationException: Authentication failed; nested excepti

spring傳送郵件時遇到錯誤org.springframework.mail.MailAuthenticationException: Authentication failed;

spring 傳送郵件時遇到異常org.springframework.mail.MailAuthenticationException org.springframework.mail.MailAuthenticationException: Authentication

解決jenkins 傳送郵件圖片亂碼問題

1.在本地mac上測試郵件傳送正常 傳送郵件內容圖片沒有亂碼  2.公司測試伺服器是一臺windows2008的系統jmeter + ant  jenkins 安裝完成後 設定郵件傳送格式模板,設定附件傳送方式,   jenkins 自動執行後傳送郵件 發現郵件內容圖片是亂碼&n

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

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

Spring Boot使用JavaMailSender傳送郵件

相信使用過Spring的眾多開發者都知道Spring提供了非常好用的JavaMailSender介面實現郵件傳送。在Spring Boot的Starter模組中也為此提供了自動化配置。下面通過例項看看如何在Spring Boot中使用JavaMailSender傳送郵件。 快速入門 在Spring

Spring Boot學習(十四)之Spring boot使用QQ郵箱傳送郵件

相信使用過Spring的眾多開發者都知道Spring提供了非常好用的JavaMailSender介面實現郵件傳送。在Spring Boot的Starter模組中也為此提供了自動化配置。下面通過例項看看如

使用spring框架的元件傳送郵件的詳細說明

原創作者:http://blog.csdn.net/caimengyuan/article/details/51224269 在進行專案開發的時候,要做一個通過傳送郵件驗證碼的功能來找回密碼。spring傳送郵件的過程這篇部落格寫的太好了。 首先進入自己的QQ郵箱,在設定

解決pycharm左側項目文件名文字體亂碼情況?中文顯示口口口口.

name ros 分享 img 亂碼 中文 alt behavior mage 解決pycharm左側項目文件名中文字體亂碼情況?中文顯示口口口口. 點擊file,進入settings 出現 Appearance & Behavior 點擊Appearance

Spring JavaMail傳送郵件

JavaMail的介紹      JavaMail,顧名思義,提供給開發者處理電子郵件相關的程式設計介面。它是Sun釋出的用來處理email的API。它可以方便地執行一些常用的郵件傳輸。    雖然JavaMail是Sun的A

spring boot傳送郵件,使用的velocity模板(html)

新增依賴: <!--郵件依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId&

Oracle 儲存過程傳送郵件,並支援使用者驗證 中文標題和內容

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

使用spring的JavaMailSender傳送郵件

步驟:     一:pom.xml       <!-- java郵件 -->       <dependency>         &nb

Spring JavaMailSender傳送郵件

個人選擇的傳送服務伺服器是QQ,所以要進行開啟QQ郵箱的SMTP服務,過程如圖所示: 在賬戶下設定開啟SMTP服務,需記住顯示的STMP密碼,點選“開啟”後發簡訊過去即可開啟 EmailSendTest: import org.junit.Test; im

Linux實用技巧——mail傳送郵件命令以及中文亂碼解決

文章目錄 0 前言及準備 1 mailx安裝及配置 1.1 安裝 1.2 編輯配置檔案 2 傳送郵件 2.1 無正文郵件 2.2 有正文郵件 3 郵件中文亂碼問題解決

laravel傳送郵件

  laravel中使用郵箱的163,QQ郵箱傳送郵件 需要注意的是:使用QQ郵箱的話,需要開啟POP3和SMTP服務。開啟方式如下: QQ郵箱 > 設定 > 賬戶   需要開啟服務.png   當開啟成功會生成金鑰,這個

使用 spring封裝的javamail linux伺服器傳送郵件失敗解決

原文參考:https://blog.csdn.net/a540891049/article/details/79385471 由於某些平臺的linxu伺服器為了安全起見 遮蔽了傳送郵件的常用埠  25、465、587 下面我用QQ郵箱舉例子   用Linux