Как установить 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
Ответы
Ответ 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);