2016-10-20 4 views
0

Я пытаюсь отправить изображение с помощью Javamail в качестве вложения без фактического изображения, сохраненного в файловой системе. Вместо этого у меня есть кодировка Base64.Отправка изображения в виде прикрепленного файла с помощью Javamail

public void sendMultiPartMailWithAttachments(final String[] recipient, final String from, 
     @Nullable final String replyTo, @Nullable final String replyToName, final String subject, 
     final String plainText, final String html, String image) 
     throws MessagingException, AddressException, UnsupportedEncodingException { 
    Message msg = this.setupMessage(recipient, from, replyTo, replyToName, subject); 

    // Create the text part 
    MimeBodyPart textPart = new MimeBodyPart(); 
    textPart.setText(plainText, "utf-8"); 

    MimeBodyPart htmlPart = new MimeBodyPart(); 
    htmlPart.setContent(html, "text/html; charset=utf-8"); 

    byte[] bytes = Base64.getMimeDecoder().decode(image); 
    MimeBodyPart imagePart = new MimeBodyPart(); 
    // imagePart.setDataHandler(new DataHandler(imageObject, "image/jpeg")); 
    imagePart.setDataHandler(new DataHandler(new ByteArrayDataSource(bytes, MediaType.JPEG.toString()))); 
    imagePart.setFileName("proof_test.jpg"); 

    Multipart multiPart = new MimeMultipart("alternative"); 
    multiPart.addBodyPart(textPart); 
    multiPart.addBodyPart(htmlPart); 
    multiPart.addBodyPart(imagePart); 

    msg.setContent(multiPart); 

    msg.saveChanges(); 

    Transport.send(msg); 
} 

Я могу получить письмо по электронной почте, но когда я делаю вложение, его невозможно открыть.

Также, когда я использую getContentType(), он отображает text/plain в отличие от image/jpeg.

ответ

0

Если изображение не является изображением того, что находится в текстовой части, вы не хотите, чтобы оно было частью одного и того же многочастного/альтернативного. Вместо этого вы хотите использовать внешнюю многочастную/смешанную, первая часть которой является множественной/альтернативной, а вторая часть - изображением/jpeg.

Если строка изображения уже закодирована base64, вы захотите использовать PreencodedMimeBodyPart при добавлении ее в multipart/mixed. Но похоже, что вы сначала декодируете его, а затем разрешите JavaMail перекодировать его. Это должно работать, но оно менее эффективно.

Если вы исправите все это и до сих пор не получили правильный тип контента для изображения, используйте Message.writeTo для записи изображения в FileOutputStream, а затем опубликуйте вывод здесь.