32

javamail を使用してインライン画像付きのメールを送信したいと考えています。

私はこのようなことをしています。

MimeMultipart content = new MimeMultipart("related");

BodyPart bodyPart = new MimeBodyPart();
bodyPart.setContent(message, "text/html; charset=ISO-8859-1");
content.addBodyPart(bodyPart);

bodyPart = new MimeBodyPart();
DataSource ds = new ByteArrayDataSource(image, "image/jpeg");
bodyPart.setDataHandler(new DataHandler(ds));
bodyPart.setHeader("Content-Type", "image/jpeg; name=image.jpg");
bodyPart.setHeader("Content-ID", "<image>");
bodyPart.setHeader("Content-Disposition", "inline");
content.addBodyPart(bodyPart);

msg.setContent(content);

私も試してみました

    bodyPart.setHeader("inline; filename=image.jpg");

    bodyPart.setDisposition("inline");

しかし、何があっても、画像は添付ファイルとして送信され、Content-Dispostion は「添付ファイル」に変わります。

javamail を使用して電子メールで画像をインラインで送信するにはどうすればよいですか?

4

8 に答える 8

36

あなたの問題

私が見る限り、それはあなたがメッセージを作成する方法のように見え、すべてがほとんど正しいです! 適切な MIME タイプとすべてを使用します。

なぜあなたが DataSource と DataHandler を使用し、画像に ContentID を持っているのかわかりませんが、私がさらにトラブルシューティングできるようにするには、質問を完了する必要があります。特に、次の行:

bodyPart.setContent(message, "text/html; charset=ISO-8859-1");

何が入っていmessageますか? 含まれています<img src="cid:image" />か?

String cid = ContentIdGenerator.getContentId();を使用する代わりに、でContentID を生成しようとしましたかimage


ソース

このブログ記事では、適切なメッセージ タイプの使用方法、画像の添付方法、および HTML 本文から添付ファイルを参照する方法を学びました: How to Send Email with Embedded Images Using Java


詳細

メッセージ

MimeMultipartクラスを使用してコンテンツを作成する必要があります。文字列をコンストラクターへのパラメーターとして使用して、パーツが「連携して動作して"related"いる」ことを JavaMail に伝えることが重要です。

MimeMultipart content = new MimeMultipart("related");

コンテンツ識別子

ContentID を生成する必要があります。これは、メールに添付した画像を識別し、メール本文から参照するために使用される文字列です。

String cid = ContentIdGenerator.getContentId();

注: このContentIdGeneratorクラスは架空のものです。コンテンツ ID を作成するか、コンテンツ ID の作成をインライン化できます。私の場合、単純な方法を使用します。

import java.util.UUID;

// ...

String generateContentId(String prefix) {
     return String.format("%s-%s", prefix, UUID.randomUUID());
}

HTML 本文

HTML コードはMimeMultipartコンテンツの一部です。MimeBodyPartそのためにクラスを使用します。その部分のテキストを設定するときは、 encodingandを指定することを忘れないでください!"html"

MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setText(""
  + "<html>"
  + " <body>"
  + "  <p>Here is my image:</p>"
  + "  <img src=\"cid:" + cid + "\" />"
  + " </body>"
  + "</html>" 
  ,"US-ASCII", "html");
content.addBodyPart(htmlPart);

画像のソースとして、cid:生成された ContentID を使用することに注意してください。

画像添付

MimeBodyPart画像の添付用に別のものを作成できます。

MimeBodyPart imagePart = new MimeBodyPart();
imagePart.attachFile("resources/teapot.jpg");
imagePart.setContentID("<" + cid + ">");
imagePart.setDisposition(MimeBodyPart.INLINE);
content.addBodyPart(imagePart);

<と の間で同じ ContentID を使用し>、画像の ContentID として設定することに注意してください。またINLINE、この画像が添付ファイルとしてではなく、電子メールに表示されることを示すように、性質を に設定しました。

終了メッセージ

それでおしまい!適切なセッションで SMTP メッセージを作成し、そのコンテンツを使用すると、メールに画像が埋め込まれます。例えば:

SMTPMessage m = new SMTPMessage(session);
m.setContent(content);
m.setSubject("Mail with embedded image");
m.setRecipient(RecipientType.TO, new InternetAddress("your@email.com"));
Transport.send(m)

それがうまくいくかどうか教えてください!;)

于 2014-01-07T17:51:26.813 に答える
11

このようなことを試してみませんか?

    MimeMessage mail =  new MimeMessage(mailSession);

    mail.setSubject(subject);

    MimeBodyPart messageBodyPart = new MimeBodyPart();

    messageBodyPart.setContent(message, "text/html");

    Multipart multipart = new MimeMultipart();
    multipart.addBodyPart(messageBodyPart);

    messageBodyPart = new MimeBodyPart();
    DataSource source = new FileDataSource(new File("complete path to image.jpg"));
    messageBodyPart.setDataHandler(new DataHandler(source));
    messageBodyPart.setFileName(fileAttachment.getName());
    messageBodyPart.setDisposition(MimeBodyPart.INLINE);
    multipart.addBodyPart(messageBodyPart);

    mail.setContent(multipart);

メッセージに <img src="image.jpg"/> タグがあればOKです。

幸運を

于 2010-09-10T00:20:01.813 に答える
10

これは私のために働いた:

  MimeMultipart rootContainer = new MimeMultipart();
  rootContainer.setSubType("related"); 
  rootContainer.addBodyPart(alternativeMultiPartWithPlainTextAndHtml); // not in focus here
  rootContainer.addBodyPart(createInlineImagePart(base64EncodedImageContentByteArray));
  ...
  message.setContent(rootContainer);
  message.setHeader("MIME-Version", "1.0");
  message.setHeader("Content-Type", rootContainer.getContentType());

  ...


  BodyPart createInlineImagePart(byte[] base64EncodedImageContentByteArray) throws MessagingException {
    InternetHeaders headers = new InternetHeaders();
    headers.addHeader("Content-Type", "image/jpeg");
    headers.addHeader("Content-Transfer-Encoding", "base64");
    MimeBodyPart imagePart = new MimeBodyPart(headers, base64EncodedImageContentByteArray);
    imagePart.setDisposition(MimeBodyPart.INLINE);
    imagePart.setContentID("&lt;image&gt;");
    imagePart.setFileName("image.jpg");
    return imagePart;
于 2011-06-07T19:05:30.907 に答える
1

以下は完全なコードです

    import java.awt.image.BufferedImage;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;

    private BodyPart createInlineImagePart()  {
    MimeBodyPart imagePart =null;
    try
    {

        ByteArrayOutputStream baos=new ByteArrayOutputStream(10000);
        BufferedImage img=ImageIO.read(new File(directory path,"sdf_email_logo.jpg"));
        ImageIO.write(img, "jpg", baos);
        baos.flush();

        String base64String=Base64.encode(baos.toByteArray());
        baos.close();

        byte[] bytearray = Base64.decode(base64String);
        InternetHeaders headers = new InternetHeaders();
        headers.addHeader("Content-Type", "image/jpeg");
        headers.addHeader("Content-Transfer-Encoding", "base64");
        imagePart = new MimeBodyPart(headers, bytearray);
        imagePart.setDisposition(MimeBodyPart.INLINE);
        imagePart.setContentID("&lt;sdf_email_logo&gt;");
        imagePart.setFileName("sdf_email_logo.jpg");
    }
    catch(Exception exp)
    {
        logError("17", "Logo Attach Error : "+exp);
    }

    return imagePart;
}


MimeMultipart mp = new MimeMultipart();
 //mp.addBodyPart(createInlineImagePart());

mp.addBodyPart(createInlineImagePart());

String body="<img src=\"cid:sdf_email_logo\"/>"
于 2013-07-20T07:34:37.073 に答える
0

次のスニペットを使用します。

MimeBodyPart imgBodyPart = new MimeBodyPart();
imgBodyPart.attachFile("Image.png");
imgBodyPart.setContentID('<'+"i01@example.com"+'>');
imgBodyPart.setDisposition(MimeBodyPart.INLINE);
imgBodyPart.setHeader("Content-Type", "image/png");

multipart.addBodyPart(imgBodyPart);

インラインおよびベース エンコードは必要ありません。従来どおりに添付して、タイプのメイン メッセージのテキストへのリンクを追加できますtext/html
ただし、メイン メッセージに追加する直前 (ファイルを添付した後) に、imgBodyPartヘッダーContent-Typeをに設定することを忘れないでください。image/jpg

于 2013-12-17T08:41:35.740 に答える