如何将MimeBodyPart内容类型设置为“text / html”?

时间:2011-02-17 12:03:20

标签: java mime javamail 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());
  }
}

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

要在Linux上编译和运行:

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

8 个答案:

答案 0 :(得分:49)

在封闭消息上调用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() );
  }
}

答案 1 :(得分:22)

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

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

答案 2 :(得分:6)

试试这个:

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

答案 3 :(得分:4)

如何使用:

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

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

答案 4 :(得分:3)

有一个方法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
  • 依旧......

答案 5 :(得分:1)

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

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

它一直很好。

答案 6 :(得分:1)

使用"<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 :(得分:0)

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