【问题标题】:How to set MimeBodyPart ContentType to "text/html"?如何将 MimeBodyPart ContentType 设置为“text/html”?
【发布时间】:2011-06-29 01:23:45
【问题描述】:

下面的程序显示了 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());
  }
}

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

在 Linux 上编译和运行:

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

【问题讨论】:

    标签: java mime jakarta-mail mime-types


    【解决方案1】:

    我在我的 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);
    

    【讨论】:

    • 添加 "message.setContent(message, "text/html");"和“helper.setText(mailText, true);”为我工作。
    【解决方案2】:

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

    当您设置 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() );
      }
    }
    

    【讨论】:

    • 更新 - 这对我的测试程序来说很好,但在我的真实代码中却没有。不同之处在于,真正的代码是获取邮件系统创建的 MimeMessage 对象,然后更新一部分,然后调用 MimeMessage.saveChanges()。这仍然没有改变 mimetype(尽管在调用 .saveChanges() 之前内容已经改变)。解决方案:我从旧对象创建了一个新的 MimeMessage(old_mime_message) 对象,更改了内容和类型,然后调用了 .saveChanges() ,它对我来说很好。
    • MimeMessage.saveChanges() 是让我们的 junit 测试通过所需的魔法。
    【解决方案3】:

    使用"&lt;h1&gt;STRING&lt;h1&gt;".getBytes();,您可以创建一个带有内容类型的ByteArrayDataSource,并在您的MimeBodyPart 中设置setDataHandler

    尝试:

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

    【讨论】:

      【解决方案4】:

      对我来说,我设置了两次:

      (MimeBodyPart)messageBodyPart.setContent(content, text/html)
      (Multipart)multipart.addBodyPart(messageBodyPart)
      (MimeMessage)msg.setContent(multipart, text/html)
      

      它运行良好。

      【讨论】:

        【解决方案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 类型中采用 / 之后的文本,因此例如。

        • text/html 将是 html
        • text/css 将是 css
        • 等等..

        【讨论】:

        【解决方案6】:

        试试这个:

        msg.setContent(email.getBody(), "text/html; charset=ISO-8859-1");
        

        【讨论】:

          【解决方案7】:

          如何使用:

          mime_body_part.setHeader("Content-Type", "text/html");
          

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

          【讨论】:

          • 谢谢你 - 我很感激你的帮助。我在上面选择了一个不同的答案,因为它更符合图书馆的预期使用方式。但你的回答对我在完成一项紧急任务方面取得即时进展很有价值。再次感谢。
          【解决方案8】:

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

          mime_body_part.setHeader("Content-Type", "text/html");
          

          【讨论】:

          • 谢谢你 - 我很感激你的帮助。我在上面选择了一个不同的答案,因为它更符合图书馆的预期使用方式。但你的回答对我在完成一项紧急任务方面取得即时进展很有价值。再次感谢。
          猜你喜欢
          • 2015-04-21
          • 2012-09-20
          • 1970-01-01
          • 2021-05-02
          • 2020-01-12
          • 2017-04-20
          • 2021-05-02
          • 1970-01-01
          • 2018-07-11
          相关资源
          最近更新 更多