#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). Эту структуру я изучил некоторое время назад, когда мне пришлось программировать обычного отправителя почты.