You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Java Mail发送的Multipart邮件在Outlook中HTML内容显示为附件?

解决Outlook中HTML邮件内容显示为附件的问题

这个问题我之前也碰到过,根源是多部分邮件的MIME类型配置错误:如果默认使用multipart/mixed类型,Outlook会把HTML部分识别为附件;而正确的做法是使用multipart/alternative类型,它会告诉邮件客户端这是同一内容的不同格式版本,客户端会自动选择合适的版本(纯文本/HTML)显示在正文里,不会把HTML当成附件。

关键修改步骤

  • 创建MimeMultipart时指定alternative类型,而非默认的mixed
  • 分别构建纯文本和HTML的BodyPart,并正确设置对应MIME类型
  • 将两个BodyPart添加到MimeMultipart对象中,再将其设为邮件内容

修改后的完整Java代码示例

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Properties;

public class MultipartEmailSender {
    public static void main(String[] args) throws Exception {
        // 配置SMTP服务器属性
        Properties props = new Properties();
        props.put("mail.smtp.host", "your-smtp-server"); // 例如 smtp.gmail.com
        props.put("mail.smtp.port", "587");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");

        // 创建带认证的会话
        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("your-email@example.com", "your-password");
            }
        });

        // 构建邮件对象
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress("your-email@example.com"));
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("recipient@example.com"));
        message.setSubject("Test Multipart Email (Plain + HTML)");

        // 核心:创建multipart/alternative类型的多部分对象
        Multipart multipart = new MimeMultipart("alternative");

        // 纯文本内容部分
        BodyPart plainTextPart = new MimeBodyPart();
        plainTextPart.setText("This is the plain text version of your email.\nIt will be shown if HTML is not supported.", "UTF-8");

        // HTML内容部分
        BodyPart htmlTextPart = new MimeBodyPart();
        String htmlContent = """
                <h1>Hello there!</h1>
                <p>This is the <strong>HTML version</strong> of your email.</p>
                <p>It will be displayed in clients that support HTML rendering.</p>
                """;
        htmlTextPart.setContent(htmlContent, "text/html; charset=UTF-8");

        // 将两个内容部分添加到多部分对象
        multipart.addBodyPart(plainTextPart);
        multipart.addBodyPart(htmlTextPart);

        // 设置邮件内容为多部分对象
        message.setContent(multipart);

        // 发送邮件
        Transport.send(message);
        System.out.println("Multipart email sent successfully!");
    }
}

关于依赖版本的建议

你当前使用的javax.mail:mail:1.4.2版本较为老旧,可能存在兼容性问题,建议升级到更稳定的版本:

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.6.2</version>
</dependency>

如果你的项目已迁移到Jakarta EE规范,可使用最新的Jakarta Mail依赖:

<dependency>
    <groupId>jakarta.mail</groupId>
    <artifactId>jakarta.mail-api</artifactId>
    <version>2.1.2</version>
</dependency>
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>jakarta.mail</artifactId>
    <version>2.1.2</version>
</dependency>

内容的提问来源于stack exchange,提问作者Ajeet Singh Palsaniya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:44:28