控制用于MimeMessage附件的DataContentHandler是什么?

时间:2016-07-25 14:51:18

标签: java email-attachments mime-message javax.activation

我正在为MimeMessage创建一个带有字节数组的Tiff图像的附件。

ByteArrayOutputStream out = new ByteArrayOutputStream();
MimeBodyPart body = new MimeBodyPart();
body.setContent(tiffByteArray, "image/tiff");
body.setDisposition("attachment");
body.setFileName(filename);
MimeMultipart multipart = new MimeMultipart();
multipart.addBodyPart(body);
MimeMessage message = new MimeMessage(Session.getDefaultInstance(System.getProperties()));
message.setContent(multipart);
message.writeTo(out);
String mimeContent = out.toString();

这通常有效。图像将在消息中转换为base64字符串。但是,在某些时候系统上出现了一些问题,这段代码开始使用com.sun.xml.internal.messaging.saaj.soap.ImageDataContentHandler。此特定转换需要java.awt.Image对象而不是字节数组(relevant source)。我收到以下错误:

  

无法将图像编码为流ImageDataContentHandler需要Image对象,给出类型为[B

的对象

我可以看到您可以在javax.activation.DataHandler上设置javax.mail.internet.MimeMessage,在DataHandler设置javax.activation.DataContentHandlerFactory,但我不确定是什么将其设置为。

有没有办法强制将字节数组转换为base64编码的字符串,而不管mime类型如何?

1 个答案:

答案 0 :(得分:1)

javax.mail为您可以明确使用的字节提供DataSource实现。

ByteArrayDataSource dataSource = new ByteArrayDataSource(tiffByteArray, "image/tiff");
DataHandler byteDataHandler = new DataHandler(dataSource);
body.setDataHandler(byteDataHandler);
body.setDisposition("attachment");
body.setFileName(filename);