Подтвердить что ты не робот

Как установить MimeBodyPart ContentType в "text/html"?

В приведенной ниже программе показано неожиданное возвращаемое значение для типа multipart mime HTML. Почему эта программа печатает "текст/обычная", а не "текст/html"?

public class Main {
  public static void main(String[] args) throws javax.mail.MessagingException, java.io.IOException {
    javax.mail.internet.MimeBodyPart mime_body_part = new javax.mail.internet.MimeBodyPart();
    mime_body_part.setContent("<h1>foo</h1>", "text/html");
    System.out.println(mime_body_part.getContentType());
  }
}

Я пробовал множество альтернативных способов, включая установку ByteArrayDataSource, завернутого в DataHandler, но безрезультатно. То же самое происходит, когда я пытаюсь использовать MimeMessage вместо MimeBodyPart.

Скомпилировать и запустить в Linux:

javac -classpath .:activation.jar:mail.jar Main.java
java -classpath .:activation.jar:mail.jar Main
4b9b3361

Ответ 1

Вызовите MimeMessage.saveChanges() в прилагаемом сообщении, которое обновит заголовки, каскадируя структуру MIME в вызов MimeBodyPart.updateHeaders() on ваше тело часть. Это вызов updateHeaders, который передает тип содержимого из DataHandler в заголовок части MIME Content-Type.

Когда вы устанавливаете содержимое MimeBodyPart, JavaMail внутренне (и не явно) создает объект DataHandler, который обертывает объект, который вы передали. Заголовок части Content-Type не обновляется немедленно.

Нет простого способа сделать это в вашей тестовой программе, так как у вас нет MimeMessage и MimeBodyPart.updateHeaders() не public.


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

public class MailTest {

  public static void main( String[] args ) throws Exception {
    Session mailSession = Session.getInstance( new Properties() );
    Transport transport = mailSession.getTransport();

    String text = "Hello, World";
    String html = "<h1>" + text + "</h1>";

    MimeMessage message = new MimeMessage( mailSession );
    Multipart multipart = new MimeMultipart( "alternative" );

    MimeBodyPart textPart = new MimeBodyPart();
    textPart.setText( text, "utf-8" );

    MimeBodyPart htmlPart = new MimeBodyPart();
    htmlPart.setContent( html, "text/html; charset=utf-8" );

    multipart.addBodyPart( textPart );
    multipart.addBodyPart( htmlPart );
    message.setContent( multipart );

    // Unexpected output.
    System.out.println( "HTML = text/html : " + htmlPart.isMimeType( "text/html" ) );
    System.out.println( "HTML Content Type: " + htmlPart.getContentType() );

    // Required magic (violates principle of least astonishment).
    message.saveChanges();

    // Output now correct.    
    System.out.println( "TEXT = text/plain: " + textPart.isMimeType( "text/plain" ) );
    System.out.println( "HTML = text/html : " + htmlPart.isMimeType( "text/html" ) );
    System.out.println( "HTML Content Type: " + htmlPart.getContentType() );
    System.out.println( "HTML Data Handler: " + htmlPart.getDataHandler().getContentType() );
  }
}

Ответ 2

Не знаю, почему (метод не документирован), но, посмотрев исходный код, эта строка должна это сделать:

mime_body_part.setHeader("Content-Type", "text/html");

Ответ 3

Попробуйте следующее:

msg.setContent(email.getBody(), "text/html; charset=ISO-8859-1");

Ответ 4

Как насчет использования:

mime_body_part.setHeader("Content-Type", "text/html");

В документации getContentType говорится, что возвращаемое значение найдено с помощью getHeader (name). Поэтому, если вы установите заголовок с помощью setHeader, я думаю, все должно быть хорошо.

Ответ 5

Существует метод setText(), который принимает 3 аргумента:

public void setText(String text, String charset, String subtype)
    throws MessagingException

Параметры:

text - the text content to set
charset - the charset to use for the text
subtype - the MIME subtype to use (e.g., "html")

ПРИМЕЧАНИЕ. Подтип принимает текст после/в MIME-типах, поэтому для ex.

  • text/html будет html
  • text/css будет css
  • и т.д.

Ответ 6

Используя "<h1>STRING<h1>".getBytes();, вы можете создать ByteArrayDataSource с типом контента и установить setDataHandler в MimeBodyPart

попробовать:

String html "Test JavaMail API example. <br><br> Regards, <br>Ivonei Jr"
byte[] bytes = html.getBytes(); 
DataSource dataSourceHtml= new ByteArrayDataSource(bytes, "text/html");
MimeBodyPart bodyPart = new MimeBodyPart();
bodyPart.setDataHandler(new DataHandler(dataSourceHtml));

MimeMultipart mimeMultipart = new MimeMultipart();
mimeMultipart.addBodyPart(bodyPart);

Ответ 7

Для меня я установил два раза:

(MimeBodyPart)messageBodyPart.setContent(content, text/html)
(Multipart)multipart.addBodyPart(messageBodyPart)
(MimeMessage)msg.setContent(multipart, text/html)

и он отлично работает.

Ответ 8

Я использовал приведенный ниже код в своем приложении SpringBoot.

MimeMessage message = sender.createMimeMessage();
message.setContent(message, "text/html");
MimeMessageHelper helper = new MimeMessageHelper(message);

helper.setFrom(fromAddress);
helper.setTo(toAddress);
helper.setSubject(mailSubject);
helper.setText(mailText, true);

sender.send(message);