当前位置: 首页 > 面试题库 >

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

缪英锐
2023-03-14
问题内容

下面的程序显示了HTML多部分mime类型的意外返回值。为什么该程序打印“文本/纯文本”而不​​是“文本/ 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()对您的身体部位的调用来更新标头。正是此updateHeaders调用将内容类型从传输DataHandler到了部分的MIME
Content-Type标头。

当设置a的内容时MimeBodyPart,JavaMail会在内部(并且不是很明显)创建一个DataHandler对象,该对象包装了传入的对象。部件的Content- Type不会 立即更新。

在您的测试程序中,没有直接的方法可以执行此操作,因为您没有包含MimeMessageMimeBodyPart.updateHeaders()is
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() );
  }
}


 类似资料:
  • 问题内容: 我尝试过这种方式,但是它没有改变吗? 问题答案: 最好使用.png文件;.ico是Windows特定的。最好不要使用文件,而是使用类资源(可以包装在应用程序的jar中)。 尽管您甚至可能考虑将setIconImages用于多种尺寸的图标。

  • 我使用的是Spring Kafka 2.2.7,我已经将配置为,并使用消费消息,一切都按预期运行。 我想添加一个来记录所有消耗的消息,但发现很难配置它。留档指出可以在容器上设置RecordInterceptor,但我不确定如何获取容器的实例。 从版本2.2.7开始,您可以向侦听器容器添加RecordInterceptor;它将在调用允许检查或修改记录的侦听器之前被调用。 我查阅了Spring文档,

  • 我是Sublime Text的新用户。我花了很多时间来弄清楚如何运行我的Python代码,它使用Tensorflow库。终端出现了一个错误,显示“重要性错误:没有名为ensorflow的模块”。但是我已经在几周前安装了Anaconda和tenorflow,它使用Gedit运行得很好。如何解决这个问题?

  • 我将一个字符串设置为activeElement.value,一切正常。现在,我想为activeElement.value设置一个变量,我得到了以下错误代码: 线程“main”中的异常 org.openqa.selenium.WebDriver异常:未定义患者 ID 命令持续时间或超时:66 毫秒 构建信息:版本:“2.45.0”,修订版:“5017cb8”,时间:“2015-02-26 23:59

  • 问题内容: 我想设置progressDialog的主题。要创建它,我使用以下代码: 我不能只是写 因为show()方法是静态的,并且我收到编译器警告。有没有办法使用可用的常量,例如 设置对话框主题? 我还想更改Dialog的背景并弄个圆角(我不想使用progressDialog内的progressBar进行任何更改。这里有许多教程,但是它们通常描述了如何创建扩展progressDialog类的新类

  • 如何将样式仅设置为之一(而不是自定义)?我是否必须创建2个和一个自定义ImageView,因为我必须传递样式抛出它们的?