|
發表者 |
討論內容 |
冷日 (冷日) |
發表時間:2019/11/5 10:24 |
- Webmaster

- 註冊日: 2008/2/19
- 來自:
- 發表數: 15771
|
- [轉貼]JavaMail 中文亂碼的問題
- JavaMail中文亂碼的問題....
於 2003-07-23 15:38 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. ie only, sorry for netscape users:-)add this post to my favorite list 小弟在google上找了相關的資料來測試了... 但是一直無法讓Subject及信件內容用中文顯示出來... 不知是什麼問題?
<%@ page contentType="text/html; charset=big5"%>
<%@ page language="java" import="java.util.*,java.io.*" %>
<%@ page import="javax.mail.*" %>
<%@ page import="javax.mail.internet.*" %>
<%@ page import="javax.activation.*" %>
<%!
InternetAddress[] address = null ;
final String charset="big5";
%>
<html>
<head>
<title>:::寄信:::</title>
</head>
<body>
<%
String mailserver = "mail.cyut.edu.tw";
String From = "s8914020@mail.cyut.edu.tw";
String to = request.getParameter("ToMailAddress");
String Subject = new String((request.getParameter("ToMailSubject")).getBytes());
String messageText = request.getParameter("ToMailMsg");
String name=request.getParameter("ToMailName");
boolean sessionDebug = false;
try {
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
// 設定所要用的Mail 伺服器和所使用的傳送協定
java.util.Properties props = System.getProperties();
props.put("mail.host",mailserver);
props.put("mail.transport.protocol","smtp");
// 產生新的Session 服務
javax.mail.Session mailSession = javax.mail.Session.getDefaultInstance(props,null);
mailSession.setDebug(sessionDebug);
Message msg = new MimeMessage(mailSession);
// 設定傳送郵件的發信人
InternetAddress ia = new InternetAddress(From);
ia.setPersonal(name, "Big5");
msg.setFrom(ia);
// 設定傳送郵件至收信人的信箱
address = InternetAddress.parse(to,false);
msg.setRecipients(Message.RecipientType.TO, address);
// 設定信中的主題
msg.setSubject("=?GB2312?B?"+enc.encode(Subject.getBytes())+"?=");
// 設定送信的時間
msg.setSentDate(new Date());
// 設定傳送信的MIME Type
msg.setText(messageText);
// 送信
Transport.send(msg);
out.println("郵件己順利傳送");
}
catch (MessagingException mex) {
mex.printStackTrace();
}
%>
</body>
</html>
--------------------------------------------------------------------------------
Re:JavaMail中文亂碼的問題....
JavaMail中的郵件主題需要進行BASE64編碼,格式形如:
=?GB2312?B?xPq1xMPcwuvS0b6t1tjWw6Osx+u+ob/stcfCvKOssqLQ3rjEw9zC66Oh?=
在設置郵件主題前需要將主題字串的位元組編碼爲BASE64格式,並添加編碼頭,示例代碼如下:
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
msg.setSubject("=?GB2312?B?"+enc.encode(subject.getBytes())+"?=");
--------------------------------------------------------------------------------
Re:JavaMail中文亂碼的問題....
註解: GB2312是大陸國標碼,請改成相應臺灣需要的編碼.
--------------------------------------------------------------------------------
Re:JavaMail中文亂碼的問題....
那如果要改成台灣的編碼... 是不是要改成Big5還是UTF-8呢...???
--------------------------------------------------------------------------------
Re:JavaMail中文亂碼的問題....
不是還有另一個MimeMessage.setSubject(String subject, String charset)可以用嗎?應該不需要自己用BASE64Encoder,使用的編碼就看收信對象的讀信程式能不能處理UTF-8了,否則用Big5或MS950是比較安全的
--------------------------------------------------------------------------------
Re:JavaMail中文亂碼的問題....
Forth wrote: 不是還有另一個MimeMessage.setSubject(String subject, String charset)可以用嗎?應該不需要自己用BASE64Encoder,使用的編碼就看收信對象的讀信程式能不能處理UTF-8了,否則用Big5或MS950是比較安全的
我支持用這個方法 ..... 比較簡單囉 ....
老實說 ... 看到 龍大蝦的高級解法 .. 用到 BASE64Encoder ... 我瞬間不敢回應 ...... ^^
--------------------------------------------------------------------------------
Re:JavaMail中文亂碼的問題....
ChungChuanChen wrote: 那如果要改成台灣的編碼... 是不是要改成Big5還是UTF-8呢...???
Mm... =編碼 似乎是M$ 專有的格式 version 1.3 已經有修正了, 請下載 否則抓出來的無法做正確的解碼 http://java.sun.com/products/javamail/
--------------------------------------------------------------------------------
Re:JavaMail中文亂碼的問題....
以下是某個大大的文章 來源不詳 不過說出了 M$ Outlook MIME 攻城掠地的歷史了 現在 javamail 1.3 也 support 了.... 唉.... 果然軟體業有市場有本錢就可以亂搞
== 某前輩的文章.( 很久以前收到的 ) 如果有版權上的問題, 請告知 ===== 一、前言: 您還記不記得,在多年以前,在Microsoft Internet Explorer尚未流行之前,大家收發信件所使用的工具,不是Netscape就是Eudora;那時大家在寫中文信時,並沒有發生什麼困難。直到Internet Explorer出現之後,大家發現,收回來的信件中,總是在主旨欄內看不到正常的中文字,而是看到以=Big5為開頭的一些亂碼,後來慢慢地發現所收的信件中,主旨欄以=Big5為開頭亂碼愈來愈多,逼得到最後,心不甘情不願地將自己原來習慣使用的郵件工具改換為Outlook Express。
二、說明: 到底為什麼大家非得使用Outlook Express作為收發郵件工具不可呢?得簡單,它預設的信件傳送格式是獨有的,Microsoft老大哥絕對不會遵循大家既有且通用的格式,如此才能慢慢地將大家同化,而改用它的產品,而目前這個目標就快達成了! 原來Microsoft運用了小技巧,讓我來詳細說明吧!
在原本Internet世界中,所有的Server幾乎都是Unix的天下,若了解Internet的發展史,應該說是在Unix環境下,才產生Internet的。
信件在遠端收送時,必須透過一個大家共同遵循的協定,如此大家才能順利地將信件正確的收發。信件在達端收送,可分為兩部分,一是送信,一是收信;送信協定為SMTP(Simple Mail Transhfer Protocol),收信協定則是POP(Post Office Protocol)。
一般在歐美國家的環境中,所有文字只用到7Bit,所以在整個傳送的協定,都只有7Bit來傳送;但Internet發展到其他各地時,因各地文字之關係,文字有的使用到第8Bit,因此在送信協定(SMTP)中又增加了擴充的功能叫ESMTP(Extented Simple Mail Transfer Protocol),其增加了額外的命令及編碼的功能,讓8Bit的資料能以7Bit編碼的方式來傳送信件。
在擴充的送信協定(ESMTP)中,提供了MIME(Multiparpose Internet Mail Extersion)的編碼方式,但只是針對信件內容(body)而言;對信件的header(含To:,From:,Message ID:,Subject:,Status:...等)部份,若有用到8Bit文字時,則採用UUencode編碼。
再來我們介紹一下MIME格式: =?國家碼代號?編碼方式?內容.....?= 國家碼代號=>英文:US-900A,中文(Big5內碼):big5 編碼方式===>Q:Quoted-Printable,B:Base-64 以中文字為例,您看到的MIME編碼後為=?big5?B?...........?=這行文字看起來有沒有很熟悉呢?
接下來我們看一下由Outlook Express所寄出來的Header部份: Message-ID: <004401bf0562$db9b86c0$18e412a3@manager> From: =?big5?B?vbKrVKhr?= <jnans@mail.hshanps.kh.edu.tw> To: =?big5?B?sWmnu6n6?= <jang@mail.nsysu.edu.tw> References: <000201bf0514$ec8e5960$0c0aa8c0@jang-home> Subject: =?big5?B?UmU6IKZVpuyl66bxLKdAt36o06RGLi4u?= Date: Thu, 23 Sep 1999 09:27:53 +0800 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0041_01BF05A5.E99D3500" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 5.00.2314.1300 X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2314.1300 Status: RO 不論是From:,To:,Subject:,看到的均為=?big5?B?......?=,這是什麼意義呢?原來Outlook Express將整個Header部份,全部以MIME格式編碼。 問題就在這邊,以ESMTP協定來看,Header部份是UUencode,body部份才是MIME,Microsoft這會兒都用MIME編碼!所以大家看到的主旨才會是=?big?B?.......?=,而不是中文字!
想當初大家都用 Eudora 或 Netscape 收信,都沒什麼問題,主旨使用中文完全沒有問題,遇到中文就用Uuencode,中文完全沒問題;可是Outlook Express一出現,軟微老大他在”主旨”方面的編碼,也給你用Mime格式編碼,大家原本使用的Eudora或Netscape收信,主旨從此就看不到正確的中文字,只看到=Big5.....?=這些亂碼了,被迫得大家非得使用Outlook 或 Outlook Express看信不可。
三、設定方法: 將 Outlook 信件處理中,信件傳送格式不論是純文字或HTML(預設是HTML格式),MIME格式必須將編碼關掉(不選Quoted Printable或Base 64,要選"無"),且須設定"表頭容許8位元字元";或是乾脆許取選取Uuencode方式;如此便能正常地顯示中文字! 現在請大家廣為推行,每次設定Outlook時,信件傳送格式若用Mime格式,就不要編碼且須設定"表頭容許8位元字元",或大家乾脆使用Uuencode編碼,讓非Microsoft的信件處理程式,也能順利地看到中文字,不再受軟微老大的壓榨!
--------------------------------------------------------------------------------
Re:JavaMail中文亂碼的問題....
如jini大大所說,JavaMail API 1.3.1 好像已對此問題做修正,但如果你一定要用舊版的API來做的話,可以參考以下的 code :
String subject = msg.getHeader("subject")[0];
if (subject != null) {
if (subject.indexOf("=?") != -1) {
subject = MimeUtility.decodeText(subject);
}
else {
subject = new String(subject.getBytes("ISO-8859-1"),"big5");
}
}
不知道你的問題是指寄信時無法寄出正確的內容還是讀信時無法讀出正確的內容,而以上的sample code僅供讀信∼
--------------------------------------------------------------------------------
Re:JavaMail中文亂碼的問題....
http://www.ietf.org/rfc/rfc2047.txt
--------------------------------------------------------------------------------
Re:JavaMail中文亂碼的問題....
為什麼我執行這個程式會有錯呢???
Error: 500
Location: /mail.jsp
Internal Servlet Error:
javax.servlet.ServletException
at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:460)
at mail_5._jspService(mail_5.java:144)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:119)
at javax.servlet.http.HttpServlet.service(HttpServlet.java)
at org.apache.tomcat.facade.ServletHandler.doService(ServletHandler.java:574)
at org.apache.tomcat.core.Handler.invoke(Handler.java:322)
at org.apache.tomcat.core.Handler.service(Handler.java:235)
at org.apache.tomcat.facade.ServletHandler.service(ServletHandler.java:485)
at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:917)
at org.apache.tomcat.core.ContextManager.service(ContextManager.java:833)
at org.apache.tomcat.modules.server.Http10Interceptor.processConnection(Http10Interceptor.java:176)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:494)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:516)
at java.lang.Thread.run(Thread.java:534)
Root cause:
java.lang.NullPointerException
at mail_5._jspService(mail_5.java:86)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:119)
at javax.servlet.http.HttpServlet.service(HttpServlet.java)
at org.apache.tomcat.facade.ServletHandler.doService(ServletHandler.java:574)
at org.apache.tomcat.core.Handler.invoke(Handler.java:322)
at org.apache.tomcat.core.Handler.service(Handler.java:235)
at org.apache.tomcat.facade.ServletHandler.service(ServletHandler.java:485)
at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:917)
at org.apache.tomcat.core.ContextManager.service(ContextManager.java:833)
at org.apache.tomcat.modules.server.Http10Interceptor.processConnection(Http10Interceptor.java:176)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:494)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:516)
at java.lang.Thread.run(Thread.java:534)
--------------------------------------------------------------------------------
Re:JavaMail中文亂碼的問題....
<%@ page language="java" import="java.util.*,java.io.*" %>
<%@ page import="javax.mail.*" %>
<%@ page import="javax.mail.internet.*" %>
<%@ page import="javax.activation.*" %>
<%@ page contentType="text/html; charset=big5"%>
<%!
InternetAddress[] address = null ;
%>
<%
String mailserver = "msk.pchome.com.tw";
String From = request.getParameter("From");
String to = request.getParameter("To");
String Subject = request.getParameter("Subject");
String messageText = request.getParameter("Message");
boolean sessionDebug = false;
try {
// 設定所要用的Mail 伺服器和所使用的傳送協定
java.util.Properties props = System.getProperties();
props.put("mail.host",mailserver);
props.put("mail.transport.protocol","smtp");
// 產生新的Session 服務
javax.mail.Session mailSession = javax.mail.Session.getDefaultInstance(props,null);
mailSession.setDebug(sessionDebug);
Message msg = new MimeMessage(mailSession);
// 設定傳送郵件的發信人
msg.setFrom(new InternetAddress(From));
// 設定傳送郵件至收信人的信箱
address = InternetAddress.parse(to,false);
msg.setRecipients(Message.RecipientType.TO, address);
// 設定信中的主題
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder(); msg.setSubject("=?GB2312?B?"+enc.encode(Subject.getBytes())+"?=");
// 設定送信的時間
msg.setSentDate(new Date());
// 設定傳送信的MIME Type
msg.setText(messageText);
// 送信
Transport.send(msg);
out.println("郵件己順利傳送");
}
catch (MessagingException mex) {
mex.printStackTrace();
}
%>
------------------------------------- 這個程式寄發email給人啊 內容雖有中文 但是,後面卻出現 豬?/tt> ^^^^^ 是什麼問題呢???
--------------------------------------------------------------------------------
Re:JavaMail中文亂碼的問題....
各位高手:
MimeMessage.setSubject(String subject, String charset);
我寫:
Message Msg = new MimeMessage(mailSession);
Msg.setSubject(Subject,"Big5");
仍不能, 不知是否我下錯語法, 懇請回應, 感謝!!
--------------------------------------------------------------------------------
Re:JavaMail中文亂碼的問題....
你可以show一下你的error message 嗎 ?
--------------------------------------------------------------------------------
Re:JavaMail中文亂碼的問題....
錯誤訊息如下:
org.apache.jasper.JasperException: Unable to compile class for JSP
An error occurred at line: 10 in the jsp file: /mail.jsp
Generated servlet error:
[javac] Since fork is true, ignoring compiler setting.
[javac] Compiling 1 source file
[javac] Since fork is true, ignoring compiler setting.
[javac] /usr/local/jakarta-tomcat-4.1.24/work/Standalone/localhost/moe/mail_jsp.java:115: setSubject(java.lang.String) in javax.mail.Message cannot be applied to (java.lang.String,java.lang.String)
[javac] Msg.setSubject(Subject,"Big5");
[javac] ^
[javac] 1 error
--------------------------------------------------------------------------------
Re:JavaMail中文亂碼的問題....
你確定一下你的javamail版本是否正確 , 找找看setSubject 有沒有支援 setSubject(Subject,encoding) Smile
--------------------------------------------------------------------------------
Re:JavaMail中文亂碼的問題....
你好, 版本如下: javamail-1.3.1 jaf-1.0.2 OS:Linux 在安裝後的javaMail的說明文件中,可以找到該語法:
MimeMessage.setSubject(java.lang.String subject, java.lang.String charset)
這樣應代表,是支援的,對吧!?
--------------------------------------------------------------------------------
Re:JavaMail中文亂碼的問題....
就error mesg 並沒有這一個method 可以用,會不會是你的javamail不是用到那ㄧ個(1.3.1) ?
--------------------------------------------------------------------------------
Re:JavaMail中文亂碼的問題....
JavaMail有很多不同的版本嗎 - -? 我在我裝好的 JavaMail 的 README.txt 檔案中,看到第一行寫著"JavaMail(TM) API 1.3.1 release"...
--------------------------------------------------------------------------------
Re:JavaMail中文亂碼的問題....
ally wrote: snpshu 你好, 版本如下: javamail-1.3.1 jaf-1.0.2 OS:Linux 在安裝後的javaMail的說明文件中,可以找到該語法:
MimeMessage.setSubject(java.lang.String subject, java.lang.String charset)
這樣應代表,是支援的,對吧!?
JavaMail 1.3.1 確實沒有
MimeMessage.setSubject(java.lang.String subject, java.lang.String charset)
我猜測你的中文問題是表單傳送資料時 在接收之前,忘了加上
request.setCharacterEncoding("MS950");
--------------------------------------------------------------------------------
Re:JavaMail中文亂碼的問題....
Message Msg = new MimeMessage(mailSession);
^^^^^
你宣告的是 Message class, 不是 MimeMessage class 所以當然不會有 setSubject(subject, charset) 這個method (我是看1.2 API, 不知道1.3 API有沒有)
--------------------------------------------------------------------------------
Re:JavaMail中文亂碼的問題....
其實大家可以去看原始碼是如何處理!我也被這問題困擾很久,後來才找出來。
原本使用
Message msg = new MimeMessage(mailSession);
msg.setSubject("中文主題");
改成
msg.setHeader("Subject", MimeUtility.encodeText("中文主題", "big5", null));
只要你的收信軟體是設成 big5,應該可以正常看到。 我是使用 Mozilla 收信,之前測試時應為發信系統標題編碼是MS950,所以都是亂碼。
提供大家參考。
--------------------------------------------------------------------------------
Re:JavaMail中文亂碼的問題....
ally wrote: 各位高手:
MimeMessage.setSubject(String subject, String charset);
我寫:
Message Msg = new MimeMessage(mailSession);
Msg.setSubject(Subject,"Big5");
仍不能, 不知是否我下錯語法, 懇請回應, 感謝!!
MimeMessage mesg = new MimeMessage(MailSession);
這樣子宣告就可以用了
--------------------------------------------------------------------------------
Re:JavaMail中文亂碼的問題....
// 設定傳送信的MIME Type 為 html格式
MimeMultipart mm = new MimeMultipart();
MimeBodyPart mbp = new MimeBodyPart();
mbp.setContent(messageText, "text/html;charset=Big5");
mm.addBodyPart(mbp);
msg.setContent(mm);
用這個方法,信件內容若是以html格式,也會變成中文喔!
--------------------------------------------------------------------------------
Re:JavaMail中文亂碼的問題....
bensu wrote: 原本使用
Message msg = new MimeMessage(mailSession);
msg.setSubject("中文主題");
改成
msg.setHeader("Subject", MimeUtility.encodeText("中文主題", "big5", null));
只要你的收信軟體是設成 big5,應該可以正常看到。 我是使用 Mozilla 收信,之前測試時應為發信系統標題編碼是MS950,所以都是亂碼。
其實,在 Create MimeMessage 前,先設定一下系統參數就不用再去管編碼的問題... ( 這是 JavaMail 1.3 還是 1.2 後才提供的,請看一下 ChangeLog 確定使用中的 JavaMail 版本是否支援! )
System.setProperty( "mail.mime.charset", "big5" );
另外若是要建立 HTML 信件時,最好記得設定一下 Content Type:
msg.setContent( body, "text/html; charset=big5" );
最近在搞寄信的作業,深覺 M$ Outlook 超喜歡惡搞,而這個責任個人認為是台灣微軟要負責!
在M$ Outlook 2000 中文版中有一個 郵件標幟 的信件屬性,可以讓 Outlook 作為提示之用 ( Reminder ),結果 Outlook 把那個 Mail Header 的值用純 Big5 碼方式輸入,格式像這樣:
Reply-By: Thu, 25 Mar 2004 17:00:00 +0800
X-Message-Flag: 待處理
若是像這樣則 Outlook 不會啟動提示機制,且 Outlook 會出現如附圖的亂碼!
X-Message-Flag: =?big5?B?q92zQrJ6?=
Reply-By: Thu, 25 Mar 2004 11:55:37 +0800 (CST)
為什麼會認為這是台灣微軟的問題呢? 在 M$ Outlook 2003 英文版中的 X-Message-Flag 後面接的是英文訊息,此時若用中、英文版互寄待辦訊息時,很抱歉,兩版本都不會出現時間提示... Confused
另外,Outlook 寄出的信件似乎也不會 Subject 做編碼作業,搞的 Mail Server 常會丟出這個警告:
X-Amavis-Alert: BAD HEADER Non-encoded 8-bit data (char AB hex) in message header 'Subject' Subject: \253\335\263B\262z\n ^
原文出處:JWorld@TW Java論壇 - JavaMail中文亂碼的問題....
|
|
|
討論串
-
[分享]JavaMail (冷日 (冷日), 2008/3/18 6:49)
-
[分享]java mail來寄電子賀卡 (冷日 (冷日), 2008/3/18 6:50)
-
[分享]Java Mail內付的範例(sendhtml.java) (冷日 (冷日), 2008/3/18 6:51)
-
[分享]人家寫好的Class (冷日 (冷日), 2008/3/18 6:51)
- »
[轉貼]JavaMail 中文亂碼的問題 (冷日 (冷日), 2019/11/5 10:24)
-
[轉貼]javaMail 標題亂碼說明及處理 (冷日 (冷日), 2019/11/5 10:30)
-
[轉貼]詳解 Java 程式設計中 JavaMail API 的使用 (冷日 (冷日), 2019/11/23 7:25)
-
[轉貼]JavaMail 郵件開發 (冷日 (冷日), 2019/11/23 7:42)
-
[轉貼]javaMail 使用 javax.mail 自動讀取郵件 (冷日 (冷日), 2019/12/18 5:23)
-
[轉貼]JavaMail - How to download attachments in e-mails (冷日 (冷日), 2019/12/21 3:26)
-
[轉貼]Reading email attachments in java (冷日 (冷日), 2019/12/21 3:29)
|