2016-10-20 121 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

除非圖像恰好是什麼在文字部分的圖像,你不希望它是相同的multipart /替代的一部分。相反,想要的外多部分/混合,其中第一部分是多部分/替代,並且其第二部分是圖像/ JPEG。

如果圖像的字符串已Base64編碼,你會想要將它添加到多/混合時使用PreencodedMimeBodyPart。但它看起來像你第一次對其進行解碼,然後將允許JavaMail來重新編碼。這應該也可以,但效率較低。

如果你解決這一切,仍然沒有得到的圖像正確的內容類型,使用Message.writeTo將圖像寫入到一個FileOutputStream,然後在這裏發表的輸出。