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

JavaMail技术问题:邮件文本正文被识别为附件,需正常显示

解决JavaMail中文本正文被识别为附件的问题

我来帮你搞定这个问题!你遇到的情况是因为邮件的Multipart结构设置不符合MIME规范——不同类型的Multipart有明确分工,搞混嵌套逻辑就会导致文本正文被当成附件处理。

问题根源分析

你原来的代码把文本正文和HTML正文放在了"mixed"类型的子Multipart里,再嵌套进"alternative"的父Multipart,最后添加附件。但"mixed"类型是用来容纳正文+附件的组合,而"alternative"才是专门用来存放**不同格式的正文(text/plain和text/html)**的容器,让邮件客户端自行选择显示格式。你的结构颠倒后,邮件客户端会把"mixed"里的每个BodyPart都当成独立的内容块,自然就把文本正文识别成附件了。

修正后的代码

下面是调整后的正确实现,我标注了关键修改点:

final String subject = "Automation Execution Report";
// 待发送的消息文本
StringBuilder msg = new StringBuilder();
msg.append("Hi All"+"\n");
msg.append("We have executed the Automation Suite in current build."+"\n");
msg.append("Please find the automation report in the attachment");

try {
    Message message = new MimeMessage(session);
    message.setFrom(new InternetAddress(from));
    message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
    message.setSubject(subject);

    File dir = new File(System.getProperty("user.dir")+ File.separator+"test_reports");
    File[] files = dir.listFiles();
    File lastModifiedFile = files[0];
    for (int i = 1; i < files.length; i++) {
        if (lastModifiedFile.lastModified() < files[i].lastModified()) {
            lastModifiedFile = files[i];
        }
    }
    String attach = lastModifiedFile.toString();

    // 1. 顶层用mixed类型,用来包含正文组和附件(这是带附件邮件的标准顶层容器)
    Multipart multipart = new MimeMultipart("mixed");

    // 2. 创建alternative类型的Multipart,专门存放不同格式的正文
    Multipart contentMultipart = new MimeMultipart("alternative");

    // 文本正文:添加到alternative容器中
    MimeBodyPart txtpart = new MimeBodyPart();
    txtpart.setContent(msg.toString(), "text/plain");
    contentMultipart.addBodyPart(txtpart);

    // HTML正文:同样添加到alternative容器中
    MimeBodyPart htmlpart = new MimeBodyPart();
    StringWriter writer = new StringWriter();
    IOUtils.copy(new FileInputStream(new File("D:\\SVN CODE\\test-output\\customized-emailable-report.html")), writer);
    htmlpart.setContent(writer.toString(), "text/html");
    contentMultipart.addBodyPart(htmlpart);

    // 3. 把正文组包装成一个BodyPart,加到顶层mixed容器中
    MimeBodyPart contentPart = new MimeBodyPart();
    contentPart.setContent(contentMultipart);
    multipart.addBodyPart(contentPart);

    // 4. 把附件单独加到顶层mixed容器中
    BodyPart attachPart = new MimeBodyPart();
    DataSource source = new FileDataSource(attach);
    attachPart.setDataHandler(new DataHandler(source));
    attachPart.setFileName("Test Automation report.html");
    multipart.addBodyPart(attachPart);

    // 设置邮件内容
    message.setContent(multipart);

    System.out.println("Sending");
    Transport transport = session.getTransport("smtp");
    transport.connect(host,25,from, password);
    transport.sendMessage(message, message.getAllRecipients());
    transport.close();
    System.out.println("Done");
} catch (Exception e) {
    // 记得补上异常捕获,避免代码报错崩溃
    e.printStackTrace();
}

核心修改说明

  • 顶层容器用"mixed":这是带附件邮件的标准结构,负责容纳正文块和附件
  • 用"alternative"管理双格式正文:邮件客户端会自动选择显示text或HTML版本,不会把它们识别为附件
  • 结构层级清晰:正文组作为一个整体放到顶层容器,附件单独添加,完全符合MIME邮件规范

这样调整后,你的文本正文就能正常显示在邮件正文中,HTML正文和附件也能正常工作啦!

内容的提问来源于stack exchange,提问作者testergirl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:38:39