2016-10-20 40 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()を使用すると、image/jpegではなくtext/plainが表示されます。

答えて

0

イメージがテキスト部分のイメージとまったく同じものでない限り、イメージは同じマルチパート/代替の一部であることは望ましくありません。代わりに、外側のmultipart/mixedが必要です。最初の部分はmultipart/alternativeで、2番目の部分はimage/jpegです。

画像の文字列がすでにbase64でエンコードされている場合は、マルチパート/混合に追加するときにPreencodedMimeBodyPartを使用することをお勧めします。しかし、まずそれをデコードしているように見えます。そうすれば、JavaMailはそれを再エンコードすることができます。それはうまくいくはずですが、それほど効率的ではありません。

これをすべて修正してもイメージの正しいコンテンツタイプが得られない場合は、Message.writeToを使用してイメージをFileOutputStreamに書き込んだ後、ここに出力を投稿してください。

関連する問題