下面的程序显示了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
答案 0 :(得分:49)
在封闭消息上调用MimeMessage.saveChanges()
,该消息将通过将MIME结构级联到您身体部位的MimeBodyPart.updateHeaders()
调用来更新标头。这是updateHeaders
调用,将内容类型从DataHandler
转移到部分的MIME Content-Type
标题。
当您设置MimeBodyPart
的内容时,JavaMail会在内部(而不是显而易见)创建一个包裹您传入的对象的DataHandler
对象。该部分的Content-Type
标题是不立即更新。
在测试程序中没有直接的方法,因为您没有包含MimeMessage
且MimeBodyPart.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。
答案 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);