2012-12-20 35 views
9

我正在使用Java郵件API,並試圖通過Gmail的SMTP發送電子郵件。 我的程序如何工作: java.util.Scanner類用於獲取用戶輸入 - 我要求用戶在郵件發送類中使用各種參數;它具有以下功能:Java郵件API - 編碼問題

Message mailMessage = new MimeMessage(session); 
mailMessage.setFrom(new InternetAddress("[email protected]")); 
mailMessage.setRecipients(Message.RecipientType.TO,InternetAddress.parse(mail.getTo())); 
mailMessage.setSubject(mail.getSubject()); 
mailMessage.setText(mail.getMessage()); 
Transport.send(mailMessage); 

只要我使用ASCII符號/字符,一切都會正常工作。但是,只要我想使用「特定國家」字符 - 比如[õäöü] - 我會看到一堆奇怪的符號...

我到目前爲止使用的技術(不適用於我):

setHeader("Content-Type", "text/plain; charset=UTF-8"); 
setHeader("Content-Encoding","ISO-8859-9"); 
setContent(message, "text/plain; charset=iso-8859-2"); 

注意:當進行的System.out.println(),顯示消息被髮送一切都正確顯示的IDE內。

編輯:e.x.當發送郵件正文爲[õäöü] 它在Gmail中顯示[ä「」?]。

編輯:當使用mailMessage.setText(MimeUtility.encodeText(mail.getMessage(), "UTF-8", "Q"));,然後在Gmail輸出如下:

"=?UTF-8?Q?=C3=A4=E2=80=9E=E2=80=9D=EF=BF=BD;=0D=0A?=" 

ANOTHER編輯:有趣的是,當我這樣做:mailMessage.setText(strVar + "õäöü", "ISO-8859-1"); 它實際上追加「õäöü」很好地在我的電子郵件(但字符串的第一部分[strVar]仍然充滿了?和[]的)。

+0

如何設置'strVar'?什麼,如果你指定'strVar'立即之前'mailMessate.setText(..)'?也許你從掃描儀收到的內容與工作的字符串不一樣。 –

+0

我已經改變了我的代碼一點點,讓我送HTML,所以我的發送方法是: 'message.setContent( 「

[õäöü]

」+ strVar +「

」, 「text/html的」); ' 當我收到一封郵件正確解析HTML時,「[õäöü]」也是如此,但是'strVar'似乎「不正確」。 我有一個類'Input'和'得到()'方法裏面: '公共字符串得到(){ /*掃描此處的聲明*/ 回報scanner.nextLine(); }' 而在第二類'我MailSender'初始化'strVar'那樣: ' /* Input類聲明*/ 字符串strVar = input.get(); ' //對不起,很難在這裏寫代碼:) – Furlando

+0

你能檢查哪些實際的字符字符串中(以及如何比較的字符在不工作的情況下)? –

回答

2

基本上,我的代碼工作得很好,因爲它應該。這是CMD,不能處理非ASCII字母。我使用了一個bat文件來訪問一個jar文件。我想我只是要製作一個GUI,然後......謝謝大家的回答。

+0

大家好,我有與法國字符相同的問題,我試過這段代碼: MimeMessage message = new MimeMessage(session); message.setSubject(subject,「UTF-8」); 消息。setBody(body,「UTF-8」); 身體正在正確生成,但主題我得不到正確。可以有人幫助我 –

5

您應該使用setText(String text, String charset)setText(String text, String charset, String subtype)來設置具有特定編碼的文本正文。

MimeUtility.encodeText()不適用於正文文本,但僅適用於標題中的編碼文本(然後僅適用於使用setHeaderaddHeader設置的標題)。

+0

我用這個:'mailMessage.setText(「來自掃描儀輸入在這裏」,「ISO-8859-1」);' 但什麼都沒有改變......還有什麼可能是問題嗎? – Furlando

9
MimeMessage message = new MimeMessage(session); 
    message.setSubject(subject, "UTF-8"); 
    message.setText(body, "UTF-8"); 

所以人們必須爲身體和主體設置字符編碼。

+1

使用'setText'也會設置Content-Type頭(如果你仔細查看代碼,你會看到現有的Content-Type和Content-Transfer-Encoding頭在使用' setText'或'setContent') –

+0

@MarkRotteveel謝謝,我將刪除多餘的'setHeader(「Content-Type」,「text/plain; charset = UTF-8」)'。 –

0

1-考慮要與此字符串體內發送電子郵件:

"Olá João!" 

2 - 由於代碼在GAE服務器運行,這個字符串解釋與缺省的ASCII編碼。要發送這封電子郵件與正確的重音符號,定義爲字符串:

String body = "Ol\u00e1 Jo\u00e3o!"; 

特殊字符手動其UTF-8編碼定義。在表格中搜索您需要的代碼http://www.utf8-chartable.de/

3-將字符串編碼轉換爲UTF-8。所有的代碼手動鍵入現在將正確解釋:

Session session = Session.getDefaultInstance(props); 
MimeMessage message = new MimeMessage(session); 
String encodedSubject = new String (subject.getBytes("UTF-8"),"UTF-8"); 
String encodedBody = new String (body.getBytes("UTF-8"),"UTF-8"); 
message.setSubject(encodedSubject, "UTF-8"); 
message.setText(encodedBody, "UTF-8"); 
2

以下爲我工作:

MimeMessage message = ... 
message.setSubject(subject, "UTF-8"); 
message.setContent(body, "text/plain; charset=UTF-8"); 

subjectbody是沒有特殊處理規則的String對象(代碼和用戶界面使用UTF -8)。

0

從MimeUtility使用encodeText方法:

MimeUtility.encodeText(mail_subject, "UTF-8", "B") 

(我不知道什麼是 「B」 表示,保持冷靜,並且只使用其實也可以是 「B」 或 「Q」。)

+1

B代表Base64編碼在這種情況下。 Q代表引用可打印。你想選擇一個代表你的編碼單詞中的數據編碼。在原始問題中,使用了quoted-printable,所以Q在這裏是正確的選擇 –