记录下javaMail接收邮件遇到的问题-(内嵌图片无法展示)

本文探讨了在使用JavaMail接收邮件时遇到的内嵌图片无法显示的问题。内容涉及multipart邮件类型的三种分类,包括mixed(附件)、alternative(超文本)和related(内嵌资源)。在实际操作中,发现QQ邮件的内嵌图片能正常显示,但企业微信邮件的png图片不能。通过详细检查文件类型,发现在解析时javamail未能正确识别png为图片资源。通过在代码中增加判断,成功解决了这个问题。

首先介绍下 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 解析邮件内容

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值