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

EML转JSON含附件时邮件体为空的问题排查求助

EML转JSON时含附件邮件体为空的问题排查与修复

核心原因

带附件的EML通常采用multipart/mixed或multipart/alternative的多部分结构,邮件正文是其中一个独立的MIME Part,而非直接从邮件对象的getContent()获取。如果代码仅在非多部分场景下提取正文,遇到多部分结构就会跳过,导致有附件时正文为空。

排查与修复步骤

1. 区分多部分与单部分邮件结构

先判断邮件是否为多类型结构,再针对性处理:

String emailBody = "";
if (message.isMimeType("multipart/*")) {
    Multipart multipart = (Multipart) message.getContent();
    // 遍历所有MIME Part
    for (int i = 0; i < multipart.getCount(); i++) {
        BodyPart bodyPart = multipart.getBodyPart(i);
        // 判断当前Part是否为附件
        boolean isAttachment = Part.ATTACHMENT.equalsIgnoreCase(bodyPart.getDisposition()) 
                || (bodyPart.getFileName() != null && !bodyPart.getFileName().isEmpty());
        
        if (isAttachment) {
            // 执行你的附件处理逻辑
            handleAttachment(bodyPart);
        } else {
            // 提取正文内容
            String partContent = extractBodyContent(bodyPart);
            if (partContent != null && !partContent.trim().isEmpty()) {
                emailBody = partContent;
            }
        }
    }
} else {
    // 无附件时直接提取正文
    emailBody = message.getContent().toString();
}

2. 处理嵌套多部分与多种正文类型

部分邮件会嵌套multipart/alternative结构(同时存纯文本和HTML正文),需递归提取:

private String extractBodyContent(BodyPart bodyPart) throws Exception {
    if (bodyPart.isMimeType("text/plain")) {
        return bodyPart.getContent().toString();
    } else if (bodyPart.isMimeType("text/html")) {
        // 可选择返回HTML或转换为纯文本
        return bodyPart.getContent().toString();
    } else if (bodyPart.isMimeType("multipart/alternative")) {
        Multipart altMultipart = (Multipart) bodyPart.getContent();
        // 优先取HTML格式,若没有则取纯文本
        for (int i = 0; i < altMultipart.getCount(); i++) {
            BodyPart altPart = altMultipart.getBodyPart(i);
            String content = extractBodyContent(altPart);
            if (content != null) {
                return content;
            }
        }
    }
    return null;
}

3. 常见错误点修正

  • 避免直接用message.getContent()获取正文,忽略多部分结构的处理
  • 遍历Part时不要漏判非附件的正文Part
  • 必须处理嵌套的multipart/alternative结构,否则会丢失正文内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:08:16