Как добавлять встроенные изображения и прикреплять файлы в Java mail

#java #jakarta-mail

#java #джакарта-почта

Вопрос:

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

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

 MimeMultipart multipartInline = new MimeMultipart(?);
  

Комментарии:

1. MimeMultipart multipartInline = новый MimeMultipart(?); какой тип я должен поместить в.

Ответ №1:

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

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

Комментарии:

1. 1, спасибо за это очень четкое и понятное объяснение.

Ответ №2:

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

Если это обычное вложение:

  • Расположение содержимого: вложение; имя файла=…

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

  • Расположение содержимого: встроенное
  • Идентификатор содержимого: произвольныйидентификатор

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

bodyPart является MimeBodyPart .

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

В нем: disp имеет inline or 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
  

Комментарии:

1. Ups, я понял, что вы хотите знать тип содержащей части… Я отредактирую свой ответ.

2. Обратите внимание, что mainmultipart имеет «текстовую версию» и «html-версию». Ваша текстовая версия может быть пустой, если вы хотите. После этого обычные вложения добавляются к основной части, в то время как встроенные вложения добавляются к related-multipart (html). Эту структуру я изучил некоторое время назад, когда мне пришлось программировать обычного отправителя почты.