2017-02-25 288 views
1

我通過Gmail發送自己是一箇中國的電子郵件,我用下面的標題 Successful email headerJava郵件:設置編碼中國

當我通過javax.mail發送電子郵件中國出現在我的郵件瀏覽器如下收到了成功 failed email

爲失敗的郵件標題如下: enter image description here

我的代碼如下:

public boolean send() throws TestReportingException, MessagingException 
    { 
     try 
     { 

      String encodingOptions = "text/plain; charset=UTF-8"; 

      Authenticator authenticator = new Authenticator() 
      { 
       // override the getPasswordAuthentication method 
       protected PasswordAuthentication getPasswordAuthentication() 
       { 
        return new PasswordAuthentication(username, password); 
       } 
      }; 

      // Create the mail session 
      Session session = Session.getInstance(maileProperties, authenticator); 

      MimeMessage mimeMessage = new MimeMessage(session); 
      mimeMessage.setHeader("Content-Type", encodingOptions); 

      // Set From: header field of the header. 
      mimeMessage.setFrom(new InternetAddress(from, fromName)); 

      // Set To: header field of the header. 
      for (String s : toList) 
      { 
       if (null == s) 
       { 
        throw new TestReportingException("Email address is null"); 
       } 
       mimeMessage.addRecipients(Message.RecipientType.TO, InternetAddress.parse(s)); 
      } 

      for (String s : ccList) 
      { 
       mimeMessage.addRecipients(Message.RecipientType.CC, InternetAddress.parse(s)); 
      } 

      // Set Subject: header field 
      mimeMessage.setSubject(subject,"UTF-8"); 

      // Create the message part 
      //MimeBodyPart messageBodyPart = new MimeBodyPart(); 
     // messageBodyPart.setContent(message, encodingOptions); 

      // Create the message part 
      MimeBodyPart messageBodyPart = new MimeBodyPart(); 
      mimeMessage.setHeader("Content-Type", encodingOptions); 
      // Now set the actual message 
      messageBodyPart.setText(message, "utf-8", "plain"); 

      // Now set the actual message 
      //messageBodyPart.setText(message, "utf-8", "html"); 

      Multipart multipart = new MimeMultipart(); 

      // Set text message part 
      multipart.addBodyPart(messageBodyPart); 



      // Part two is attachment 
      if (null != attachmentSource) 
      { 
       messageBodyPart = new MimeBodyPart(); 

       messageBodyPart.setDataHandler(new DataHandler(attachmentSource)); 
       messageBodyPart.setFileName(attachmentSource.getName()); 
       multipart.addBodyPart(messageBodyPart); 

      } 

      // Send the complete message parts 
      mimeMessage.setContent(multipart); 


      // Send message 
      //Transport.send(mimeMessage); 

      SSm.getLogger().debug("Subject: "+mimeMessage.getSubject()); 




      Transport.send(mimeMessage); 

      SSm.getLogger().info("\n\nSent message successfully...."); 

      clear(); 

      return true; 

     } 
     catch (MessagingException mex) 
     { 
      SSm.getLogger().error(mex.getMessage()); 
      throw mex; 
     } 
     catch (Exception e) 
     { 
      SSm.getLogger().error(e.getMessage(), e); 
      throw new TestReportingException(e.getMessage(), e); 
     } 
    } 

屬性是:

  • 主機= smtp.gmail.com
  • mail.smtp.auth =真
  • mail.smtp.starttls.enable =真mail.smtp.host = SMTP .gmail.com
  • mail.smtp.port = 587 mail.mime.charset = UTF-8

NOTES: 文本在發送前未被破壞。 message.getSubject()打印出清潔中國文字 我猜東西是錯誤的,我做了編碼

編輯

這裏的方式是調試輸出:

DEBUG:setDebug: JavaMail的版本1.5.5

DEBUG:getProvider()返回javax.mail.Provider [TRANSPORT,SMTP,com.sun.mail.smtp.SMTPTransport,甲骨文]

DEBUG SMTP:用於身份驗證需要用戶名和密碼

DEBUG SMTP:useEhlo真,useAuth真正

DEBUG SMTP:試圖連接到主機 「smtp.gmail.com」,端口587,isSSL假

220 smtp.gmail.com ESMTP s20sm18171725pfg.11 - gsmtp

DEBUG SMTP:連接到主機 「smtp.gmail.com」,端口:587

>

EHLO傑克 - yoga3.hitronhub.home

250-smtp.gmail.com爲您服務,[96.49.181。179]

250-SIZE 35882577

250-8BITMIME

250 STARTTLS

250 ENHANCEDSTATUSCODES

250 PIPELINING

250 CHUNKING

250 SMTPUTF8

DEBUG SMTP:實測延伸 「SIZE」,則arg 「35882577」

DEBUG SMTP:實測延伸 「8BITMIME」,則arg 「」

DEBUG SMTP:實測延伸 「STARTTLS」,則arg 「」

DEBUG SMTP:實測延伸 「ENHANCEDSTATUSCODES」,則arg 「」

DEBUG SMTP:實測延伸 「流水線」,則arg 「」

DEBUG SMTP:實測延伸 「CHUNKING」,則arg 「」

DEBUG SMTP:實測延伸 「SMTPUTF8」,則arg 「」

STARTTLS

220 2.0.0準備好開始TLS

EHLO傑克-yoga3.hitronhub.home

250 -smtp.gmail.com爲您服務,[96.49.181。179]

250-SIZE 35882577

250-8BITMIME

250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH

250 ENHANCEDSTATUSCODES

250 PIPELINING

250-CHUNKING

250 SMTPUTF8

DEBUG SMTP:實測延伸 「SIZE」,則arg 「35882577」

DEBUG SMTP:實測延伸 「8BITMIME」,則arg 「」

DEBUG SMTP:實測延伸 「AUTH」,ARG 「LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH」

DEBUG SMTP:實測延伸 「ENHANCEDSTATUSCODES」,則arg 「」

DEBUG SMTP:實測延伸 「流水線」,則arg 「」

DEBUG SMTP:實測延伸 「CHUNKING」,則arg 「」

DEBUG SMTP:實測延伸 「SMTPUTF8」,則arg 「」

DEBUG SMTP:嘗試使用的機制來驗證:LOGIN PLAIN DIGEST-MD5 NTLM XOAUTH2

DEBUG SMTP:使用機構LOGIN

DEBUG SMTP:AUTH LOGIN命令跟蹤受抑制

DEBUG SMTP:AUTH LOGIN成功

DEBUG SMTP:use8bit假

MAIL FROM:

250 2.1.0 OK s20sm18171725pfg.11 - gsmtp

RCPT TO:

250 2.1.5 OK s20sm18171725pfg.11 - gsmtp

DEBUG SMTP:驗證地址

DEBUG SMTP:JSTONE @ I- KODA.COM

DATA

354繼續s20sm18171725pfg.11 - gsmtp

來源:iKoda報告

要:[email protected]

消息ID:< [email protected]>

Subject:=?UTF-8?B?QnZ4Y2Igw6TCuMKtIMOkwrjCrSDDpMK4wq0gw6TCuMKtIMOkwrjCrQ ==?=

MIME-版本:1.0

內容類型:多部分/混合;

boundary="----=_Part_0_1855484302.1488002481637" 

>

------ = _ Part_0_1855484302.1488002481637

內容類型:文本/無格式;字符集= UTF-8

內容傳送編碼:BASE64

>

RGVhciBaeGN2LA0KDQpCdnhjYiDDpMK4wq0gw6TCuMKtIMOkwrjCrSDDpMK4wq0gw6TCuMKtw6TC

uMKtIMOkwrjCrSDDpMK4wq0gw6TCuMKtIMOkwrjCrWh0dHBzOi8vd3d3Lmkta29kYS5jb20vZGVs

aXZlcnkvZHNmcj91ZnQ9MTAxMjc3MCZjPTEwMTI3NjTDpMK4wq0gw6TCuMKtIMOkwrjCr SDDpMK4

wq0gw6TCuMKt

------ = _ Part_0_1855484302.1488002481637--

250 2.0.0 OK 1488002489 s20sm18171725pfg.11 - gsmtp

DEBUG SMTP:郵件成功發送至郵件服務器

退出

221 2.0.0關閉連接s20sm18171725pfg.11 - gsmtp

[INFO]「jake.app」com.ikoda.service.utilities.EmailOut.send(EmailOut.java:256)01:27:01

>

已成功發送消息....

>

+1

首先,修復這些[常見的JavaMail錯誤](http://www.oracle.com/technetwork/java/javamail/faq/index.html#commonmistakes)。 你從[這個其他職位](http://stackoverflow.com/questions/42447635/javax-mail-utf-8-encoding-issue)複製你的代碼?即使這些評論也非常相似。 你使用的是什麼版本的JavaMail? [JavaMail調試輸出](http://www.oracle.com/technetwork/java/javamail/faq/index.html#debug)顯示什麼? –

+0

是的,我轉發了另一個職位在其中有一個重大的人爲錯誤。我沒有看到任何常見的錯誤,驗證者可能不是理想的,但它的工作原理。 我會看看javamail日誌。感謝提示 – Jake

+1

人爲錯誤是什麼?並修復Session.getDefaultInstance。 「它有效」與「它是正確的」不一樣。這些都不是你的問題的原因,但這就是爲什麼我想看到JavaMail調試輸出。 –

回答

0

我已經找到了問題。 問題不在電子郵件類中,只與javamail相切。 (所以上面的代碼是正確的)

問題是從我的控制器中的Spring的MessageBundle的hotwired實例中提取文本。

我錯誤地使用了下面的代碼,以便我的日誌記錄類可以記錄從消息包中提取的字符串。

byte[] barray =messageSource.getMessage(code, null, LocaleContextHolder.getLocale()).getBytes(Charset.forName("UTF-8")); 
    String s = new String(barray); 

的Log4j可以在主題和這使我相信,絲線在正確的UTF-8消息(通過StringBuilder的建)讀取的字符串。但是,javax。郵件亂碼。

我應該做的是這樣的:

messageSource.getMessage(code, null, LocaleContextHolder.getLocale()) 

現在我的記錄剛剛獲得???,但電子郵件發送就好了。

所以,保持簡單愚蠢。

+1

The ???可能只是不支持中文字符的控制檯,並且他們被替換爲?代替。 –

+0

這不是,因爲??出現在控制檯和日誌文件中,直到我使用getBytes進行轉換。然後這兩個角色出現。 但是,我並不太在意這個問題。如果我需要的話,在登錄之前有一個實用的轉換方法將是微不足道的。 – Jake

+1

您的控制檯使用不包含中文字符的特定編碼,因此寫入日誌時,這些字符會被問號替換。這也可以通過使用'new String(barray)'來說明,因爲它會重新解釋系統默認字符集中的字節(不是UTF-8,因此您可能在Windows上)。順便說一句:使用'new String(barray)'是不好的,因爲你沒有指定一個明確的字符集,這可能會讓你的應用在另一個平臺上運行時表現不同(比如Linux,默認字符集通常是UTF-8) –