多部分消息以文本/纯文本而不是 java 中的多部分/替代形式发送

Posted

技术标签:

【中文标题】多部分消息以文本/纯文本而不是 java 中的多部分/替代形式发送【英文标题】:Multipart message sent as text/plain instead multipart/alternative in java 【发布时间】:2018-07-17 23:26:54 【问题描述】:

我以多部分形式发送消息,下面是我的代码:

Message message = new MimeMessage(session);
Multipart multiPart = new MimeMultipart("alternative");

try 

MimeBodyPart textPart = new MimeBodyPart();
textPart.setText(text, "utf-8");

MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent(html, "text/html; charset=utf-8");

multiPart.addBodyPart(htmlPart);
multiPart.addBodyPart(textPart);
message.setContent(multiPart);
transport.send(message);

 catch (AddressException e) 
    e.printStackTrace();
    System.out.println("Error: "+e.getMessage());


现在当我在 Outlook 中收到它时,它显示为 text/plain

有什么想法吗?

【问题讨论】:

它在 Thunderbird 等其他邮件中如何显示?如果在 transport.send 调用之前添加 message.writeTo(System.out),消息会是什么样子? 如果我 System.out.println(message.getContentType()); 它显示 text/plain 您需要先致电message.saveChanges() 才能获得有效结果。 我昨天找到了它,今天看到你的评论也差不多。谢谢@BillShannon 成功了。 【参考方案1】:

我终于找到了解决这个问题的方法。显然,有时您需要保存更改以使您的消息作为多部分/替代发送。我指的是:

https://docs.oracle.com/javaee/6/api/javax/mail/Message.html#saveChanges()

所以现在我的代码是:

Message message = new MimeMessage(session);
Multipart multiPart = new MimeMultipart("alternative");

try 

MimeBodyPart textPart = new MimeBodyPart();
textPart.setText(text, "utf-8");

MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent(html, "text/html; charset=utf-8");

multiPart.addBodyPart(htmlPart);
multiPart.addBodyPart(textPart);
message.setContent(multiPart);
message.saveChanges();
transport.send(message);

 catch (AddressException e) 
    e.printStackTrace();
    System.out.println("Error: "+e.getMessage());


【讨论】:

除非您使用的是 非常 旧版本的 JavaMail,否则不需要调用 saveChanges。你用的是什么版本?另外,请注意您的 transport instance is not being used.

以上是关于多部分消息以文本/纯文本而不是 java 中的多部分/替代形式发送的主要内容,如果未能解决你的问题,请参考以下文章

纯文本电子邮件和仅包含纯文本的多部分电子邮件之间有区别吗?

如何编写多部分 MIME 混合消息以在 Outlook 中正确显示

带有文本和日历的多部分电子邮件:Outlook 无法识别 ics

使用 mailkit 发送的多部分电子邮件的文本/纯文本版本未正确接收

使用 perl 发送带有文件附件的多部分文本/html 替代消息,

如何强制eJabberd将加密的消息存储到数据库(mod_mam)而不是将消息存储为纯文本?