java.io.IOException: text/plain DataContentHandler требует объекта String, ему был предоставлен объект класса типа [B

Когда я пытаюсь отправить одно вложение, любой zip-файл или текстовый файл, код работает нормально, но при попытке отправить два вложения, одно из которых является текстовым файлом, а другое - Zip-файлом, возникает ошибка. Я пробовал несколько способов, но все равно не повезло.

MimeMessage msg = new MimeMessage(session){
msg.addHeader("Content-type", directMessage.getBody().getContentType());
msg.addHeader("Content-Transfer-Encoding", "8bit");
msg.setFrom(new InternetAddress(fromaddress));
msg.setSubject(directMessage.getSubject(), "UTF-8");
MimeMultipart mp = new MimeMultipart();
BodyPart bodyPart = null; 
for(int i=0;i<directMessage.getAttachments().size();i++){

    bodyPart = new MimeBodyPart();
    bodyPart.setContent(Base64.decodeBase64(directMessage.getAttachments().get(i).getContent().getBytes()),directMessage.getAttachments().get(i).getContentType());
    bodyPart.setDisposition(decryptedMessage.getBodyPart(0).getDisposition());
    bodyPart.setFileName(directMessage.getAttachments().get(i).getFilename());
    mp.addBodyPart(bodyPart);
    mp.setSubType("multipart/mixed");
}
msg.setContent(mp);
msg.setSentDate(new Date());
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toaddress, false));
Transport.send(msg);   

Исключение:

 javax.mail.MessagingException: IOException while sending message;
  nested exception is:
    java.io.IOException: "text/plain" DataContentHandler requires String object, was given object of type class [B
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1167)
    at javax.mail.Transport.send0(Transport.java:195)
    at javax.mail.Transport.send(Transport.java:124)

person Bobby    schedule 28.03.2018    source источник
comment
Как вы можете отправить вложения с текстовым/простым типом?   -  person Menai Ala Eddine - Aladdin    schedule 28.03.2018
comment
Проверьте этот поток stackoverflow.com/questions/4612673 / может быть полезно для вас.   -  person Menai Ala Eddine - Aladdin    schedule 28.03.2018


Ответы (1)


Если у вас есть данные, хранящиеся в массиве байтов, используйте ByteArrayDataSource, чтобы предоставить его в качестве содержимого части:

bodyPart = new MimeBodyPart();
DataSource ds = new ByteArrayDataSource(
    Base64.decodeBase64(directMessage.getAttachments().get(i).getContent().getBytes()),
    directMessage.getAttachments().get(i).getContentType());
bodyPart.setDataHandler(new DataHandler(ds));
bodyPart.setDisposition(decryptedMessage.getBodyPart(0).getDisposition());
bodyPart.setFileName(directMessage.getAttachments().get(i).getFilename());
person Bill Shannon    schedule 28.03.2018