Изпращайте имейл чрез 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
Какво става, ако някои от прикачените файлове всъщност са снимки, вградени в частта text/html? Тогава как изглежда правилната структура? Мога ли просто да заменя смесени със свързани? Или трябва да използвам различни подчасти за свързаните прикачени файлове с INLINE разположение и смесени за останалите? МНОГО съм объркан... :( - person snooze92; 08.01.2014
comment
Съхранявайте със смесени. Представеният тук отговор работи отлично с текстови и двоични файлове. - person Rafa; 30.01.2014
comment
Ако частта text/html препраща към изображенията с помощта на cid: препратки, всички те трябва да бъдат в multipart/related. Не замествайте multipart/mixed в горния пример. Вместо това заменете text/html с multipart/related, който включва text/html и изображението/jpg, към които препраща. Уведомете ме, ако това не е ясно. - person Bill Shannon; 30.01.2014
comment
Вашата йерархия изглежда така, сякаш прикачвате Multipart към Multipart. По-конкретно, как multipart/alternative обект се прикачва към multipart/mixed обект? - person theyuv; 07.11.2017