Вызовите MimeMessage.saveChanges()
во вложенном сообщении, которое обновит заголовки путем каскадного преобразования структуры MIME в вызов MimeBodyPart.updateHeaders()
в вашей части тела.Именно этот вызов 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() );
}
}