Mi aplicación debe enviar un archivo de texto, que primero debe generar como una cadena. El texto contiene símbolos que no son ASCII, por lo que me gustaría que fuera UTF-8. He intentado muchas variantes, pero todo lo que recibo como archivo adjunto son algunos signos de interrogación. Y, cuando envío el mismo texto como el cuerpo del mensaje, funciona bien.JavaMail enviando archivos adjuntos de correo de cadena de caracteres UTF-8
Aquí está la línea de código que genera el MimeBodyPart con el accesorio:
String attachment = "Привет";
messageBodyPart.setContent(new String(attachment.getBytes("UTF-8"),
"UTF-8"),"text/plain; charset=UTF-8");
También probé utilizando la cadena sin ninguna transformación, utilizando sólo los bytes, ahora, como ves, estoy tratando de generar una cadena a partir de los bytes ...
¿Qué estoy haciendo mal? (Y recuerdo haberlo hecho en otro proyecto, que funciona, pero ya no tengo acceso a su código fuente).
Gracias de antemano. Timofey.
ACTUALIZACIÓN
Después de leer sus respuestas, y después de un poco más de éxito experimentar pensé que lo mejor para publicar el código de mi cosa correo. Tengo la clase Mailer
, que hace el envío de correos, y otras clases pueden simplemente llamar a su método estático sendMessage()
para enviar un mensaje. Y todo se ejecuta en Google App Engine.
public static void sendMessage(String to, String subject, String msgBody,
String attachment) throws AddressException, MessagingException {
Properties props = new Properties();
Session mailSession = Session.getDefaultInstance(props, null);
Message msg = new MimeMessage(mailSession);
String email = "bla-bla-bla"; // userService.getCurrentUser().getEmail();
msg.setFrom(new InternetAddress(email));
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
InternetAddress[] addresses = { new InternetAddress("bla-bla-bla") };
msg.setReplyTo(addresses);
msg.setSubject(subject);
Calendar cal = Calendar.getInstance();
String fileName = cal.get(Calendar.YEAR) + "_"
+ cal.get(Calendar.MONTH) + "_"
+ cal.get(Calendar.DAY_OF_MONTH) + "_"
+ cal.get(Calendar.HOUR_OF_DAY) + "_"
+ cal.get(Calendar.MINUTE) + "_" + cal.get(Calendar.SECOND)
+ "_" + cal.get(Calendar.MILLISECOND) + ".txt";
// create the message part
MimeBodyPart messageBodyPart = new MimeBodyPart();
// fill message
// Here we should have the msgBody.
// Sending attachment contents for debugging only.
messageBodyPart.setText(attachment + " - 4", "UTF-8", "plain");
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
MimeBodyPart att = new MimeBodyPart();
att.setText(attachment, "UTF-8", "plain");
att.addHeader("Content-Type", "text/plain; charset=UTF-8");
att.setFileName(fileName);
multipart.addBodyPart(att);
// Put parts in message
msg.setContent(multipart);
Transport.send(msg);
}
Y la línea que llama a esta cosa en otra clase es:
Mailer.sendMessage("[email protected]", "Test", "No body", "Привет, Я кусок текста");
Y la fuente prima del correo, por extraño que parezca, es (dejando de lado los encabezados aparentemente irrelevantes):
Message-ID: <[email protected]>
Date: Sat, 12 Feb 2011 11:21:01 +0000
Subject: Pages
From: [email protected]
To: [email protected]
Content-Type: multipart/mixed; boundary=00163662e7107ccbd4049c1402fa
--00163662e7107ccbd4049c1402fa
Content-Type: text/plain; charset=KOI8-R; format=flowed; delsp=yes
Content-Transfer-Encoding: base64
8NLJ18XULCDxIMvV08/LINTFy9PUwSAtIDQNCg==
--00163662e7107ccbd4049c1402fa
Content-Type: text/plain; charset=US-ASCII; name="2011_1_12_11_21_1_691.txt"
Content-Disposition: attachment; filename="2011_1_12_11_21_1_691.txt"
Content-Transfer-Encoding: base64
Pz8/Pz8/LCA/ID8/Pz8/ID8/Pz8/Pw==
--00163662e7107ccbd4049c1402fa--
Simplemente no lo entiendo, por qué los conjuntos de caracteres son diferentes de lo que estoy tratando de establecer, y de dónde vienen.
¿Ves correcta codificación de carbón en el archivo que ha generado? – JSS
No. En el archivo generado, solo veo los signos de interrogación. – Ibolit