如何在Java邮件中添加内嵌图像和附加文件

时间:2011-11-14 14:31:44

标签: java javamail

我正在使用Java邮件API进行电子邮件发送。我必须通过电子邮件发送包含HTML <img>标记和一些附加文件指定的内嵌图像的消息。

我应该为包含内嵌图片和附件文件的部分的MimeMultipart使用哪种内容类型?

MimeMultipart multipartInline = new MimeMultipart(?);

2 个答案:

答案 0 :(得分:5)

这里要考虑三种不同类型的多部分内容:

  • multipart / mixed - 常用于包含主消息体 “附件”
  • multipart / alternative - 用于发送相同的数据 不同的格式,例如纯文本和HTML
  • multipart / related - 常用于包含html正文部分和引用的图像 通过那个html

你可以用各种有趣的方式嵌套这些不同的类型。

要回答原始问题,您需要具有此结构的消息:

main message
  multipart/mixed
    multipart/related
      text/html - main html content
      image/jpg - an image referenced by the html
    application/pdf - or whatever, for the first attachment

html部分将要使用“cid:”URL引用引用图像部分, 并且图像部分将需要相应的Content-ID标头。 RFC2387有更多详情。你可以通过搜索找到一些例子 JavaMail forum

答案 1 :(得分:0)

您必须为每个附件使用一个或两个标头:

如果这是正常的附件:

  • 内容 - 处理:附件;文件名= ...

如果是内联附件(邮件图片)

  • 内容 - 处置:内联
  • Content-ID: arbitrary-id

这是为我前段时间编写的小型发送程序提取的:

bodyPartMimeBodyPart

bodyPart.setHeader("Content-Disposition", disp + "; filename=" + encodedFileName);
bodyPart.setHeader("Content-Transfer-Encoding", "base64");
if (att.getContextId() != null && att.getContextId().length() > 0)
    bodyPart.setHeader("Content-ID", "<" +  att.getContextId() + ">");

其中:disp包含inlineattachmentatt.getContextId()有内联附加的任意ID。

我的HTML邮件食谱

message has via .setContent(...)
    mainMultipart is a MimeMultiPart("alternative")
                  and has via .addBodyPart(...)
        textBodyPart is a MimeBodyPart with content-type "text/plain"
        relatedMultipart is a MimeMultipart("related")
                         and has via .addBodyPart(...)
            htmlBodyPart "text/html; charset=utf-8"
            INLINED-ATTACH1
            INLINED-ATTACH2
        NORMAL-ATTACH1
        NORMAL-ATTACH2