2010-04-16 12 views
5

비 ASCII 이름을 가진 사용자에게 메일을 보내야하는 Java 코드를 작성 중입니다. 본문, 제목 줄 및 일반 머리글에 UTF-8을 사용하는 방법을 알아 냈지만 받는 사람에 여전히 붙어 있습니다.javax.mail.internet.MimeMessage를 비 ASCII 이름의 수신자에게 보냅니 까?

"받는 사람 :"입력란에 다음과 같이 입력하십시오 : "ウィキペディアにようこそ" <[email protected]>. 이것은 recip이라는 문자열로 오늘 (우리의 목적으로) 살아 간다.

  • msg.addRecipients(MimeMessage.RecipientType.TO, recip)"忙俾ェ▎S]" <[email protected]>
  • msg.addHeader("To", MimeUtility.encodeText(recip, "utf-8", "B"))은 도대체가 나는이 메시지를 보낼 수 있다고 생각 할수 있습니까 AddressException: Local address contains control or whitespace in string ``=?utf-8?B?IuOCpuOCo+OCreODmuODh+OCo+OCouOBq+OCiOOBhuOBk+OBnSIgPA==?= =?utf-8?B?Zm9vQGV4YW1wbGUuY29tPg==?=''

을 던져 준다?

  • 바디 HTML : msg.setText(body, "UTF-8", "html");
  • 헤더 : 여기


    내가 다른 구성 요소를 처리하는 방법 msg.addHeader(name, MimeUtility.encodeText(value, "utf-8", "B"));

  • 제목 : msg.setSubject(subject, "utf-8");
+0

관련 질문 및 솔루션 : http://stackoverflow.com/a/5650455/923560 – Abdull

답변

5

헉,이 바보를 사용하여있어 해킹 :

/** 
* Parses addresses and re-encodes them in a way that won't cause {@link MimeMessage} 
* to freak out. This appears to be the only robust way of sending mail to recipients 
* with non-ASCII names. 
* 
* @param addresses The usual comma-delimited list of email addresses. 
*/ 
InternetAddress[] unicodifyAddresses(String addresses) throws AddressException { 
    InternetAddress[] recips = InternetAddress.parse(addresses, false); 
    for(int i=0; i<recips.length; i++) { 
     try { 
      recips[i] = new InternetAddress(recips[i].getAddress(), recips[i].getPersonal(), "utf-8"); 
     } catch(UnsupportedEncodingException uee) { 
      throw new RuntimeException("utf-8 not valid encoding?", uee); 
     } 
    } 
    return recips; 
} 

저는 이것이 누군가에게 유용하기를 바랍니다.

1

나는 이것이 오래되었음을 알고 있지만 다른 사람에게 도움이 될 수 있습니다. 어떻게 해결/해킹이 문제를 해결할 수 있었는지 이해할 수 없습니다.

InternetAddress[] recips = InternetAddress.parse(addresses, false); 

부호화 (이 경우 널) 개인 이름에 적용이 생성자 여기 아무것도 변화하지 아닌 주소 :

이 선 여기 왕복동 [0]의 어드레스를 설정할 것 .

new InternetAddress(recips[i].getAddress(), recips[i].getPersonal(), "utf-8"); 

그러나 메일 서버가 인코딩 된 수신자를 처리 할 수 ​​있다면 아래와 같이하면됩니다. (모든 아직 일반적인 보이지 않는 ....)

recip = MimeUtility.encodeText(recip, "utf-8", "B"); 
InternetAddress[] addressArray = InternetAddress.parse(recip , false); 
msg.addRecipients(MimeMessage.RecipientType.TO, addressArray); 
관련 문제