gpt4 book ai didi

java - 如何将 MimeBodyPart ContentType 设置为 "text/html"?

转载 作者:IT老高 更新时间:2023-10-28 20:59:27 25 4
gpt4 key购买 nike

下面的程序显示了 HTML 多部分 MIME 类型的意外返回值。为什么这个程序打印的是 text/plain 而不是 text/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());
}
}

我尝试了许多替代方法,包括设置一个包装在 DataHandler 中的 ByteArrayDataSource,但无济于事。当我尝试使用 MimeMessage 而不是 MimeBodyPart 时,也会发生同样的事情。

在 Linux 上编译和运行:

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

最佳答案

调用 MimeMessage.saveChanges()在封闭的消息上,它将通过将 MIME 结构级联到对您的正文部分的 MimeBodyPart.updateHeaders() 的调用来更新 header 。正是这个 updateHeaders 调用将内容类型从 DataHandler 传输到部件的 MIME Content-Type header 。

当您设置 MimeBodyPart 的内容时,JavaMail 在内部(并不明显)会创建一个 DataHandler 对象来包装您传入的对象。该部分的 Content -Type header 不会立即更新。

在您的测试程序中没有直接的方法可以做到这一点,因为您没有包含 MimeMessage 并且 MimeBodyPart.updateHeaders() 不是 公开.


这是一个说明预期和意外输出的工作示例:

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() );
}
}

关于java - 如何将 MimeBodyPart ContentType 设置为 "text/html"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5028670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com