Marek Raki
Marek Raki

Reputation: 3146

GAE attaching PNG image to an email

I would like to attach a png image file to an email message on GAE. At the beginning I started from:

MimeMessage msg = new MimeMessage(session);
... 
MimeBodyPart imagePart = new MimeBodyPart();
imagePart.attachFile("/templates/header_nr1.png");
...
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textPart);
multipart.addBodyPart(htmlPart);
multipart.addBodyPart(imagePart); 

But this caused

pl.insert.services.ExceptionHandler handleUnknownException:java.security.AccessControlException:access denied ("java.io.FilePermission" "/templates/header_nr1.png" "read")

and many other variations about that which I was not able to solve by using any of the available solutions.

According to https://developers.google.com/appengine/docs/java/mail/usingjavamail#Multi_Part_Messages I have changed the way of retrieving the file to:

InputStream fileIs = MailServiceImpl.class.getResourceAsStream("/templates/header_nr1.png");
byte[] headerImage = IOUtils.toByteArray(fileIs);

String cid = "header_nr1";
MimeBodyPart imagePart = new MimeBodyPart();
imagePart.setFileName("header_nr1.png");
DataSource src = new ByteArrayDataSource(headerImage, "image/png");
imagePart.setDataHandler(new DataHandler(src));
imagePart.setContent(headerImage, "image/png");
imagePart.setContentID("<" + cid + ">");
imagePart.setDisposition(MimeBodyPart.INLINE);

Now I have

javax.mail.SendFailedException: Send failure (javax.mail.MessagingException: Converting attachment data failed)
at javax.mail.Transport.send(Transport.java:163)
at javax.mail.Transport.send(Transport.java:48)

Could anyone help me with the problem ? :(

Upvotes: 0

Views: 497

Answers (1)

Marek Raki
Marek Raki

Reputation: 3146

Oki, finally I have resolved the problem. That is the prescription for a MultiPart email message on GAE having attached inline PNG image:

String headerImageCid = "header";
InputStream pngInputStream = MailServiceImpl.class.getResourceAsStream("/images/" +     headerImageCid + ".png");
DataSource ds = new ByteArrayDataSource(pngInputStream, "image/png");
MimeBodyPart imagePart = new MimeBodyPart();
imagePart.setDataHandler(new DataHandler(ds));
imagePart.setFileName(headerImageCid + ".png");
imagePart.setHeader("Content-Type", "image/png");
imagePart.addHeader("Content-ID", "<" + headerImageCid + ">");

final Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textPart);
multipart.addBodyPart(htmlPart);
multipart.addBodyPart(imagePart);

msg.setContent(multipart);
msg.saveChanges();

Transport.send(msg);

Upvotes: 1

Related Questions