2011-01-27 47 views
10

Deseo enviar un PDF como archivo adjunto de correo electrónico (estoy usando la API de JavaMail). Tengo el Pdf (generado por jasper) como byte[].Enviar correo electrónico en PDF adjunto como secuencia

public InputStream exportPdfToInputStream(User user) throws ParseErrorException, MethodInvocationException, ResourceNotFoundException, JRException, IOException{ 
     JasperPrint jasperPrint = createJasperPrintObject(user); 
     byte[] pdfByteArray = JasperExportManager.exportReportToPdf(jasperPrint); 
     return new ByteArrayInputStream(pdfByteArray); 
    } 

Aquí está el código que estoy usando para construir el MimeBodyPart que será el archivo adjunto:

if (arrayInputStream != null && arrayInputStream instanceof ByteArrayInputStream) { 
     MimeBodyPart attachment = new MimeBodyPart(arrayInputStream); 
     attachment.setHeader("Content-Type", "application/pdf"); 
     mimeMultipart.addBodyPart(attachment); 
    } 

Este código me da este error:

javax.mail.MessagingException: IOException while sending message; 
    nested exception is: 
    java.io.IOException: Error in encoded stream: needed at least 2 valid base64 characters, but only got 1 before padding character (=), the 10 most recent characters were: "\24\163\193\n\185\194\216#\208=" 

Respuesta

5

El constructor es que utilizó para analizar una parte MIME del transporte.

Su segundo ejemplo debería funcionar bien. Usted puede considerar

  • no convertir a InputStream y la espalda, esto hará que las copias innecesarias
  • añadir una disposición (por ejemplo bp.setDisposition (Part.ATTACHMENT);)
+0

@mtraut: dijiste que no lo convirtieras a InputStream y volvieras, pero ¿cómo puedo hacerlo sin un InputStream? – Atticus

+1

use el constructor ** ByteArrayDataSource (byte [] data, String type) ** y el "pdfByteArray" – mtraut

+0

@mtraut: Gracias, eso es lo que ya he enviado en mi respuesta. Pero gracias de cualquier manera. ¡Pensé que hay otra forma aún más simple de hacerlo! – Atticus

20

he encontrado una solución como se sugiere en el hilo this. Parece que hay una clase DataSource creada solo para este propósito. Espero que este ejemplo ayude a otros también.

if (arrayInputStream != null && arrayInputStream instanceof ByteArrayInputStream) { 
     // create the second message part with the attachment from a OutputStrean 
     MimeBodyPart attachment= new MimeBodyPart(); 
     ByteArrayDataSource ds = new ByteArrayDataSource(arrayInputStream, "application/pdf"); 
     attachment.setDataHandler(new DataHandler(ds)); 
     attachment.setFileName("Report.pdf"); 
     mimeMultipart.addBodyPart(attachment); 
    } 
+0

utilizamos esta manejador de datos también. – halil

Cuestiones relacionadas