Как добавить встроенные изображения и прикрепить файлы в почте Java - PullRequest
4 голосов
/ 14 ноября 2011

Я использую почтовый API Java для электронной почты.Мне нужно отправить электронное сообщение, содержащее как встроенные изображения, указанные в теге HTML <img>, так и некоторые вложенные файлы.

Какой тип содержимого следует использовать для MimeMultipart, который содержит части для встроенных изображений и вложенияфайлы?

MimeMultipart multipartInline = new MimeMultipart(?);

Ответы [ 2 ]

5 голосов
/ 15 ноября 2011

Здесь можно рассмотреть три различных типа многокомпонентного контента:

  • multipart / mixed - обычно используется для содержания основного тела сообщения с «вложениями»
  • multipart / alternative - usedдля отправки одних и тех же данных в разных форматах, например, в виде обычного текста и HTML
  • multipart / related - обычно используется для содержания части тела html и изображений, на которые ссылается этот HTML

Youможет вкладывать эти различные типы во все виды интересных способов.

Чтобы ответить на исходный вопрос, вам нужно сообщение с такой структурой:

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-часть будет ссылаться на изображениечасть с использованием URL-ссылки "cid:", а части изображения потребуется соответствующий заголовок Content-ID. RFC2387 содержит более подробную информацию.Вероятно, вы можете найти некоторые примеры, выполнив поиск по форуму JavaMail .

0 голосов
/ 14 ноября 2011

Вы должны использовать один или два заголовка для каждого вложения:

Если это нормальное вложение:

  • Content-Disposition: приложение; имя файла = ...

Если это встроенное вложение (изображение для вашей почты)

  • Содержание-Диспозиция: встроенная
  • Идентификатор контента: произвольный идентификатор

Это извлечено для небольшой программы отправки, которую я запрограммировал некоторое время назад:

bodyPart - это MimeBodyPart.

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 имеет inline или attachment, а att.getContextId() имеет произвольный идентификатор для встроенного вложения.

Мой рецепт для письма 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
...