首先介绍下 multipart 这个邮件内容的类型,
multipart翻译为中文就是‘多部件的’,可以理解为里面有多种类型的信息
而multipar解析后(Content-Type),会有三种情况
1、multipart/mixed 类型 带有附件
2、multipart/alternative 类型 带有超文本内容
3、multipart/related 类型 存在内嵌资源,例如文本中有图片资源,没有以附件形式发送

一般解析邮件内容,可以通过以下代码
public void getMailContent(StringBuffer sb, Map<String, String> imgs, Part p) throws Exception {
if (p.isMimeType("text/plain")) {// 检查内容是否为纯文本
LoggerUtils.warn(getClass().getName(), "skip text plain");
} else if (p.isMimeType("text/html")) {// 检查内容是否为html
sb.append(p.getContent());
} else if (p.isMimeType("multipart/*")) {// 检查内容是否含有附件
Multipart mp = (Multipart) p.getContent();
int count = mp.getCount();
for (int i = 0; i < count; i++) {
getMailContent(sb, imgs, mp.getBodyPart(i));
}
} else if (p.isMimeType("message/rfc822")) {// 检查内容是否含有嵌套消息
getMailContent(sb, imgs, (Part) p.getContent());
// 检查内容是否为内嵌图片,企业微信邮件内容有png类型图片时,type为“application/octet-stream”未知文件类型,所以还需要多一个判断
} else if (p.isMimeType("image/*" ) || (p.isMimeType("application/octet-stream" ) && p.getFileName().contains(".png"))) {
String fileName = IdUtils.getId() + ".png";
Object content = p.getContent();
String contentID = null;
try {
contentID = ((String[]) p.getHeader("Content-ID"))[0];
} catch (Exception e) {
e.printStackTrace();
LoggerUtils.error(getClass().getName(), e.getMessage());
}
InputStream in = (InputStream) content;
// 文件下载开始
//先将图片资源上传阿里云,将邮件中内嵌图片的src,替换为阿里云中的地址
String endpoint = "xxxxxxx";
String accessKeyId = "xxxxxxx";
String accessKeySecret = "xxxxxxx";
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
String bucketName = "yihe-upload";
ossClient.putObject(bucketName, "email/img/" + fileName, in);//, metadata
//ossClient.shutdown();
int buckeIndex = endpoint.indexOf("//") + 2;
String httpFile = endpoint.substring(0, buckeIndex);
String fileUrc = httpFile + bucketName + "." + endpoint.substring(buckeIndex, endpoint.length()) + "/email/img/" + fileName;
imgs.put(contentID, fileUrc);
// 文件下载结束
in.close();
}else{
LoggerUtils.warn(getClass().getName(), "This is an unknown type:" + p.getContentType());
}
}
经过测试发现,qq邮件的内嵌图片可以正常显示,而企业微信的图片就无法显示

一步步打印文件类型发现,企业微信邮箱发送邮件时,如果内嵌图片为png类型,javamail解析时并不能识别为图片资源,而其他的图片类型,如jpg,则没有此问题。
所以在上面的代嘛中,判断是否为图片类型时,多加了一个判断,解决了这个问题
参考文章:JavaMail实战——内容解析(包含文本、图片)_无意摘花的博客-CSDN博客_javamail 解析邮件内容
本文探讨了在使用JavaMail接收邮件时遇到的内嵌图片无法显示的问题。内容涉及multipart邮件类型的三种分类,包括mixed(附件)、alternative(超文本)和related(内嵌资源)。在实际操作中,发现QQ邮件的内嵌图片能正常显示,但企业微信邮件的png图片不能。通过详细检查文件类型,发现在解析时javamail未能正确识别png为图片资源。通过在代码中增加判断,成功解决了这个问题。
3193

被折叠的 条评论
为什么被折叠?



