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

nec*_*cer 32 java mime jakarta-mail mime-types

下面的程序显示HTML multipart 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());
  }
}
Run Code Online (Sandbox Code Playgroud)

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

要在Linux上编译和运行:

javac -classpath .:activation.jar:mail.jar Main.java
java -classpath .:activation.jar:mail.jar Main
Run Code Online (Sandbox Code Playgroud)

dka*_*arp 51

调用MimeMessage.saveChanges()封闭消息,它将通过将MIME结构级联到MimeBodyPart.updateHeaders()您身体部位的调用来更新标头.正是这个updateHeaders调用将内容类型从DataHandler部分的MIME Content-Type头传递到部分.

当您设置a的内容时MimeBodyPart,JavaMail会在内部(而不是显然)创建一个DataHandler包装您传入的对象的对象.该部分的Content-Type标题不会立即更新.

在测试程序中没有直接的方法,因为你没有包含MimeMessageMimeBodyPart.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() );
  }
}
Run Code Online (Sandbox Code Playgroud)


JB *_*zet 24

不知道为什么(该方法没有记录),但通过查看源代码,这一行应该这样做:

mime_body_part.setHeader("Content-Type", "text/html");
Run Code Online (Sandbox Code Playgroud)

  • 谢谢 - 我很感谢你的帮助.我之所以选择了不同的答案,因为它更符合图书馆的使用方式.但是你的答案对于我在完成紧急任务方面立即取得进展非常有价值.再次感谢. (4认同)

小智 6

试试这个:

msg.setContent(email.getBody(), "text/html; charset=ISO-8859-1");
Run Code Online (Sandbox Code Playgroud)


foe*_*ens 5

使用怎么样:

mime_body_part.setHeader("Content-Type", "text/html");
Run Code Online (Sandbox Code Playgroud)

getContentType 的文档中,它说返回的值是使用 getHeader(name) 找到的。因此,如果您使用 setHeader 设置标头,我想一切都应该没问题。