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
相关产品推荐
相关产品推荐

