2010-04-16 18 views
5

Estoy escribiendo una parte de código Java que necesita enviar correo a usuarios con nombres que no sean ASCII. He descubierto cómo usar UTF-8 para el cuerpo, la línea de asunto y los encabezados genéricos, pero todavía estoy atascado en los destinatarios .¿Enviar javax.mail.internet.MimeMessage a un destinatario con nombre no ASCII?

Esto es lo que me gustaría en el campo "Para:": "ウィキペディアにようこそ" <[email protected]>. Esto vive (para nuestros propósitos hoy) en una cadena llamada recip.

  • msg.addRecipients(MimeMessage.RecipientType.TO, recip) da "忙俾ェ▎S]" <[email protected]>
  • msg.addHeader("To", MimeUtility.encodeText(recip, "utf-8", "B")) tiros AddressException: Local address contains control or whitespace in string ``=?utf-8?B?IuOCpuOCo+OCreODmuODh+OCo+OCouOBq+OCiOOBhuOBk+OBnSIgPA==?= =?utf-8?B?Zm9vQGV4YW1wbGUuY29tPg==?=''

¿Cómo diablos se supone que voy a enviar este mensaje?


Así es como he manejado los demás componentes:

  • cuerpo HTML: msg.setText(body, "UTF-8", "html");
  • Cabeceras: msg.addHeader(name, MimeUtility.encodeText(value, "utf-8", "B"));
  • Asunto: msg.setSubject(subject, "utf-8");
+0

preguntas relacionadas y solución: http://stackoverflow.com/a/5650455/923560 – Abdull

Respuesta

5

Uf, lo consiguió utilizando una estúpida hackear:

/** 
* 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; 
} 

Espero que esto sea útil para alguien.

1

Sé que esto es viejo, pero esto podría ayudar a otra persona. No entiendo cómo esa solución/hack podría haber hecho algo por el problema.

Esta línea aquí sería establecer la dirección de recips [0]:

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

y este constructor aquí no cambia nada como la codificación se aplica al nombre personal (que es nula en este caso) y no la dirección .

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

Pero algo como esto a continuación funcionaría, ¡siempre que el servidor de correo pueda manejar destinatarios codificados! (que no parece común en absoluto aún ...)

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