Отправить электронное письмо через SMTP с вложением, обычным / текстовым и текстовым / hml

Моя цель: отправлять транзакционные электронные письма через SMTP с обычным текстом, текстом или HTML и прикрепленными файлами.

Мой код: реализован с помощью JavaMail

Моя проблема: отлично смотрится в Hotmail или Outlook. Но в gmail он не отображает должным образом тело сообщения, если это электронное письмо с вложением .txt (работает нормально, если вложения представляют собой изображения).

Любая помощь будет высоко ценится.

Вот мой необработанный вывод SMTP:

Subject: ALTERNATIVE | TXT | HTML |ATT.ATTACHMENT | Thu Jun 13 17:48:04 EDT
 2013
MIME-Version: 1.0
Content-Type: multipart/alternative; 
    boundary="----=_Part_0_21791733.1371160084561"

------=_Part_0_21791733.1371160084561
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Body message in text format!
------=_Part_0_21791733.1371160084561
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit

Body message in <b>html</b> format! Sent on Thu Jun 13 17:48:04 EDT 2013<br> to: [email protected]<br> to: [email protected]<br> cc: [email protected]<br> cc: [email protected]
------=_Part_0_21791733.1371160084561
Content-Type: text/plain; charset=us-ascii; name=email_attachment.txt
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=email_attachment.txt

This is a text attachment file!
------=_Part_0_21791733.1371160084561--
.
250 Delivery in progress
QUIT

Несколько скриншотов

Отправлено только с одним вложением .txt. Не отображается тело сообщения и дублируются вложения.

введите описание изображения здесь

То же сообщение, но с другим вложением (.gif). Все выглядит нормально. введите описание изображения здесь

=== РЕШЕНИЕ ДЛЯ РАЗРАБОТЧИКОВ JAVA ====

Общая идея описана здесь: http://www.coderanch.com/t/503380/java/java/Java-Mail-text-html-attachment

Итак, теперь мой код выглядит так:

// contentPart is the content to be sent. It is divided in bodyContent and attachmentContent
            MimeMultipart contentPart = new MimeMultipart("mixed");

            // Message body in txt and html format
            MimeMultipart bodyPart = new MimeMultipart("alternative");
            // Creates plain text message
            BodyPart bodyTxt = new MimeBodyPart();
            bodyTxt.setText(getMessageBodyText());
            // Creates html message
            BodyPart bodyHtml = new MimeBodyPart();
            bodyHtml.setContent(getMessageBodyHtml(), "text/html");
            bodyPart.addBodyPart(bodyTxt);
            bodyPart.addBodyPart(bodyHtml);

            // Wrapper for bodyTxt and bodyHtml
            MimeBodyPart bodyContent = new MimeBodyPart();
            bodyContent.setContent(bodyPart);

            // At this point, contentPart contains bodyTxt and bodyHtml wrapped in a multipart/alternative
            contentPart.addBodyPart(bodyContent);

            // Adds attachments to contentPart
            if (getAttachments() != null) {
                for(File f : getAttachments()) {
                    try {
                        MimeBodyPart attachmentPart = new MimeBodyPart();
                        attachmentPart.attachFile(f);
                        contentPart.addBodyPart(attachmentPart);
                    } catch (IOException e) {
                        logger.severe("Could not attach file to email!" +
                                " TO: "+ getTo().toString() +
                                "; CC: "+ getCc().toString() +
                                "; ExceptionMessage: " + e.getMessage());
                        throw new SmtpRequestException(e.getMessage());
                    }
                }
            }

person Rafa    schedule 13.06.2013    source источник


Ответы (1)


Структура вашего сообщения неправильная. Вам нужны вложенные составные части, чтобы получить правильную структуру, примерно так:

  multipart/mixed
    multipart/alternative (holding the two forms of the body part)
      text/plain
      text/html
    text/plain or image/gif (the attachment)
person Bill Shannon    schedule 14.06.2013
comment
Верно. Собственно, я реализовал решение этой проблемы немного раньше, чем увидел ваш ответ. Большое Вам спасибо. - person Rafa; 15.06.2013
comment
Что, если некоторые из вложений на самом деле являются изображениями, встроенными в текстовую / html-часть? Как же тогда выглядит правильная структура? Можно просто заменить смешанное на родственное? Или мне нужно использовать разные части для связанных вложений с расположением INLINE и смешанные для остальных? Я очень смущен... :( - person snooze92; 08.01.2014
comment
Хранить при смешанном. Представленный здесь ответ отлично работал с текстовыми и двоичными файлами. - person Rafa; 30.01.2014
comment
Если часть text / html ссылается на изображения с помощью cid: links, все они должны быть в multipart / related. Не заменяйте multipart / mixed в приведенном выше примере. Вместо этого замените text / html на multipart / related, который включает текст / html и изображение / jpg, на которое он ссылается. Дайте мне знать, если это непонятно. - person Bill Shannon; 30.01.2014
comment
Ваша иерархия выглядит так, как будто вы присоединяете Multipart к Multipart. В частности, как объект multipart/alternative прикреплен к объекту multipart/mixed? - person theyuv; 07.11.2017