2017-02-25 1 views
1

설정 나는 Gmail을 통해 자신을 중국의 이메일을 발송하고 나는 javax.mail를 통해 중국의 전자 우편을 보낼 때 내 메일 브라우저에서 다음과 같이 나타납니다 Successful email header자바 메일 : 중국어 인코딩

다음 헤더를 성공적으로받은 다음과 같이 enter image description here

내 코드는 다음과 같습니다 : 다음과 같이 failed email

실패한 메일의 헤더는

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 : 전송하기 전에 텍스트가 손상되지 않았습니다.

DEBUG : setDebug message.getSubject은() 내가 뭔가를 추측하고 내가 인코딩 여기

편집

을했던 방식에 문제가있는 디버그 출력의 깨끗한 중국어 텍스트를 출력합니다 : JavaMail에 버전 1.5.5

DEBUG :를 GetProvider() javax.mail.Provider [TRANSPORT, SMTP com.sun.mail.smtp.SMTPTransport 오라클]

반환

디버그 SMTP : 인증 필요 사용자 이름과 암호

디버그 SMTP : useEhlo 사실, USEAUTH 사실

디버그 SMTP : "smtp.gmail.com"isSSL 거짓 포트 587를 호스트에 연결을 시도

220 smtp.gmail.com ESMTP s20sm18171725pfg.11 -

DEBUG의 SMTP를 gsmtp "smtp.gmail.com"호스트에 연결된 포트 : 587

>를,912,

EHLO 제이크-yoga3.hitronhub.home 서비스, [96.49.181에서

250-smtp.gmail.com

.179]

250 SIZE 35,882,577

250-8BITMIME

250 STARTTLS

250 ENHANCEDSTATUSCODES

250 PIPELINING

250 CHUNKING

250 SMTPUTF8

디버그 SMTP : 찾을 수 확장 "SIZE"인수 "35882577"

디버그 SMTP : 찾을 수 확장 "8BITMIME"인수 ""

디버그 SMTP : 확장을 찾을 수 "STARTTLS"인수 ""

DEBUG의 SMTP : 실측치 확장자 "ENHANCEDSTATUSCODES"인수 ""

DEBUG SMTP : 실측치 확장자 "PIPELINING"인수 ""

DEBUG의 SMTP : 실측치 확장자 "CHUNKING"인수 ""

DEBUG의 SMTP : 실측치 확장자 "SMTPUTF8"인수 ""

STARTTLS

220 2.0.0 TLS

EHLO 제이크-yoga3.hitronhub.home 시작할 준비

250 -smtp.gmail.com, [96.49.181.179]

250 SIZE 35,882,577

250-8BITMIME

250 AUTH LOGIN PLAIN XOAUTH2 일반 CLIENTTOKEN OAUTHBEARER XOAUTH

250 ENHANCEDSTATUSCODES

250 PIPELINING

250-CHUNKING

,403,210 250 SMTPUTF8

DEBUG SMTP : 실측치 확장자 "SIZE"인수 "35882577"

DEBUG의 SMTP : 실측치 확장자 "8BITMIME"인수 ""

DEBUG의 SMTP : 확장 발견 ","AUTH, ARG "LOGIN PLAIN XOAUTH2 일반 CLIENTTOKEN OAUTHBEARER XOAUTH"

DEBUG의 SMTP : 실측치 확장자 "ENHANCEDSTATUSCODES"인수 ""

DEBUG SMTP : 실측치 확장자 "PIPELINING"인수 ""0

DEBUG의 SMTP : 실측치 확장자 "CHUNKING"인수 ""

DEBUG SMTP : 실측치 확장자 "SMTPUTF8"인수 ""

DEBUG의 SMTP : 메커니즘을 사용하여 인증을 시도가 로그인 PLAIN DIGEST-MD5 NTLM XOAUTH2

는 는

DEBUG는 SMTP : 사용기구 로그인

DEBUG SMTP

: AUTH 로그인 명령 트레이스

DEBUG SMTP

억압 : AUTH 로그인이 성공한

01 gsmtp -

250 2.1.5 OK s20sm18171725pfg.11 :

RCPT TO를 gsmtp -

250 2.1.0 OK s20sm18171725pfg.11 : 23,516,

DEBUG의 SMTP는 : FROM 거짓

MAIL을 use8bit

디버그 SMTP : 확인 된 주소

디버그 SMTP : JSTONE @ I- KODA.COM

데이터

(354)로 이동 앞서 s20sm18171725pfg.11 - gsmtp

에서

: iKoda 보고서

사람 : [email protected]

메시지 ID : < [email protected]>

제목 :? = UTF-8 B == QnZ4Y2Igw6TCuMKtIMOkwrjCrSDDpMK4wq0gw6TCuMKtIMOkwrjCrQ?=

MIME 버전 : 1.0

Content-Type : multipart/mixed;

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

>

------ = _ Part_0_1855484302.1488002481637

콘텐츠 유형 : 텍스트/일반; 캐릭터 = UTF-8

콘텐츠 전송 인코딩 :베이스 64

>

RGVhciBaeGN2LA0KDQpCdnhjYiDDpMK4wq0gw6TCuMKtIMOkwrjCrSDDpMK4wq0gw6TCuMKtw6TC

uMKtIMOkwrjCrSDDpMK4wq0gw6TCuMKtIMOkwrjCrWh0dHBzOi8vd3d3Lmkta29kYS5jb20vZGVs

aXZlcnkvZHNmcj91ZnQ9MTAxMjc3MCZjPTEwMTI3NjTDpMK4wq0gw6TCuMKtIMOkwrjCr SDDpMK4

wq0gw6TCuMKt

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

.

250 2.0.0 OK 1488002489 s20sm18171725pfg.11 - gsmtp

디버그 SMTP :

가 QUIT 성공적으로 메일 서버로 전달 메시지

221 2.0.0 폐쇄 연결 s20sm18171725pfg.11 - gsmtp

[정보] "jake.app"com.ikoda.service.utilities.EmailOut.send (EmailOut.java:256) 01:27 :

>

보낸 메시지를 성공적으로

은 ....

>

+1

먼저 [common JavaMail mistakes] (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

나는 문제를 발견했다. 이 문제는 Email 클래스에는 없으며 javamail과 접하게 관련된 것입니다. (위의 코드가 올바르므로)

문제점은 내 Controller에서 Spring의 MessageBundle의 핫 와이어 된 인스턴스에서 텍스트를 추출하는 데 있습니다.

로깅 클래스가 메시지 묶음에서 가져온 문자열을 기록 할 수 있도록 다음 코드를 잘못 사용했습니다.

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()) 

지금 내 로거 그냥 ??? 도착하지만 이메일이 잘 보냅니다.

그래서 Keep It Simple Stupid.

+1

??? 한자를 지원하지 않는 콘솔 일 수도 있고, 한자를 대체 할 수있는 콘솔 일 수도 있습니다. 대신. –

+0

그것은 아니기 때문에 ?? getBytes를 사용하여 변환 할 때까지 콘솔과 로그 파일에 나타납니다. 그런 다음 문자가 둘 다 나타납니다. 하지만이 문제에 대해서는 너무 신경 쓰지 않습니다. 필요하다면 로깅하기 전에 변환을위한 유틸리티 메소드를 갖는 것은 사소할 것입니다. – Jake

+1

콘솔에서 중국어 문자를 포함하지 않는 특정 인코딩을 사용하므로 로깅이 기록 될 때 해당 문자가 물음표로 바뀝니다. 이는 시스템의 기본 문자 세트 (UTF-8이 아니기 때문에 Windows에있을 가능성이 있으므로)에서 바이트를 재 해석하기 때문에 'new String (barray)'을 사용하여도 설명됩니다. BTW : 명시 적 문자 집합을 지정하지 않아서 다른 플랫폼에서 실행될 때 응용 프로그램이 다르게 동작 할 수 있기 때문에'new String (barray) '을 사용하는 것이 좋지 않습니다 (Linux에서는 기본 문자 집합이 일반적으로 UTF-8 임) –