如何发送包含纯文本和 HTML 文本的邮件,以便每个邮件阅读器都可以选择适合它的格式?

Posted

技术标签:

【中文标题】如何发送包含纯文本和 HTML 文本的邮件,以便每个邮件阅读器都可以选择适合它的格式?【英文标题】:How do I send mail with both plain text as well as HTML text so that each mail reader can choose the format appropriate for it? 【发布时间】:2011-10-09 00:40:34 【问题描述】:

来自http://www.oracle.com/technetwork/java/faq-135477.html#sendmpa:

您需要发送 MIME 多部分/替代消息。你 构造这样的消息基本上与构造消息的方式相同 多部分/混合消息,使用构造的 MimeMultipart 对象 使用新的 MimeMultipart("alternative")。然后插入文本/纯文本 正文部分作为 multpart 中的第一部分并插入 text/html 身体部分作为多部分中的第二部分。你需要 自己构建plain和html部分以获得适当的 内容。有关此类消息结构的详细信息,请参阅 RFC2046。

有人可以给我看一些示例代码吗?

【问题讨论】:

【参考方案1】:

这是我自己的代码的一部分:

final Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(senderAddress, senderDisplayName));
msg.addRecipient(Message.RecipientType.TO,
        new InternetAddress(m.getRecipient(), m.getRecipientDisplayName()));
msg.setSubject(m.getSubject());
// Unformatted text version
final MimeBodyPart textPart = new MimeBodyPart();
textPart.setContent(m.getText(), "text/plain"); 
// HTML version
final MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent(m.getHtml(), "text/html");
// Create the Multipart.  Add BodyParts to it.
final Multipart mp = new MimeMultipart("alternative");
mp.addBodyPart(textPart);
mp.addBodyPart(htmlPart);
// Set Multipart as the message's content
msg.setContent(mp);
LOGGER.log(Level.FINEST, "Sending email 0", m);
Transport.send(msg);

m 是我自己的类的一个实例。

【讨论】:

请注意,将 textPart 和 htmlPart 添加到 MultiPart 实例的顺序很重要。如果您以相反的方式添加它们,即使 html 可用(至少在 gmail 上),纯文本部分也会显示给用户。

以上是关于如何发送包含纯文本和 HTML 文本的邮件,以便每个邮件阅读器都可以选择适合它的格式?的主要内容,如果未能解决你的问题,请参考以下文章

PhpMailer 发送的电子邮件内容仅显示纯文本,不包含 HTML 样式

如何通过 Celery 发送 HTML 电子邮件?它不断发送文本/纯文本

如何在 perl 中发送 HTML/纯文本邮件

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

flask 电子邮件进阶实践-用模板发送163邮件

如何发送带有 HTML 标签的电子邮件,而不是 C# 中的 HTML 纯文本