springboot 收取邮件带有图片处理

1.遇到的问题

邮件中带有图片的,part中含有cid的,可以从party下载,图片和附件要保存到自己的存储服务器。

邮件获取图片MailUtil 工具类 

package com.esoon.cat.cc.email.utils.common;import com.alibaba.fastjson.JSONObject;
import jakarta.mail.MessagingException;
import jakarta.mail.Part;
import org.apache.commons.io.IOUtils;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.*;
import java.util.List;/*** @ClassName MailUtil* @Description TODO* @Author Jiangnan Cui* @Date 2024-09-12 19:03* @Version 1.0*/
public class MailUtil {private static final Logger logger = LoggerFactory.getLogger(MailUtil.class);/*** 邮件拿到Cid*/public static String getCid(Part p) throws MessagingException {String[] headers = p.getHeader("Content-ID");String content;if ((headers != null) && (headers.length > 0))content = headers[0];elsereturn null;String cid;if ((content.startsWith("<")) && (content.endsWith(">")))cid = "cid:" + content.substring(1, content.length() - 1);else {cid = "cid:" + content;}return cid;}/*** 判断是否包含"<img src=\"cid:"*/public static boolean  isCidImgAndReplace(String text) {if (StringUtils.isBlank(text)) {return false;}return text.contains("<img src=\"cid:");}/*** 邮件将Cid替换为Url*/public static String replaceImgPathByCid(String content, List<String> cidList, List<String> attachments) {logger.info("#####判断正文是否含有<img src>" + isCidImgAndReplace(content));if (isCidImgAndReplace(content)) {for (int i = 0; i < cidList.size(); i++) {logger.info("#####邮件mail content cidList:"+ cidList);String oldSrc = cidList.get(i);logger.info("#####邮件mail content attachments:"+attachments.toString());String newSrc = attachments.get(i);logger.info("#####邮件mail content oldSrc:{},attachments newSrc:{}",oldSrc,newSrc);content = content.replace(oldSrc, newSrc);}}return content;}
}

2.邮件处理

StringBuffer content = new StringBuffer(30);
//处理邮件内容信息
//邮件中带图片Idlist
List<String> cidList=new ArrayList<>();
//邮件中带图片转化后的实际路径
List<String> attachmentsList = new ArrayList<>();getMailTextContent(msg, content,cidList,attachmentsList);
String mailAllContent;
if(cidList!=null && cidList.size()>0 && !attachmentsList.isEmpty()){List<String> attachmentsListNew = new ArrayList<>();for(String attach:attachmentsList){attachmentsListNew.add(storageDownLoadUrl+attach);}mailAllContent = MailUtil.replaceImgPathByCid(content.toString(),cidList,attachmentsListNew);

}

3.解析邮件内容 

/*** 获得邮件文本内容** @param part    邮件体* @param content 存储邮件文本内容的字符串* @throws MessagingException* @throws IOException*/
public  void getMailTextContent(Part part, StringBuffer content,List<String> cidList,List<String> attachList) throws MessagingException, IOException {//如果是文本类型的附件,通过getContent方法可以取到文本内容,但这不是我们需要的结果,所以在这里要做判断boolean isContainTextAttach = part.getContentType().indexOf("name") > 0;if (part.isMimeType("text/*") && !isContainTextAttach) {content.append(part.getContent().toString());String cid=MailUtil.getCid(part);logger.info("#####getMailTextContent text/* cid:{} part MimeType:{}",cid);if(StringUtils.isNotEmpty(cid)) {cidList.add(cid);saveImageFile(part, attachmentDirectory, attachList);}} else if (part.isMimeType("message/rfc822")) {String cid=MailUtil.getCid(part);logger.info("#####getMailTextContent message/rfc822 cid:{}",cid);if(StringUtils.isNotEmpty(cid)) {cidList.add(cid);saveImageFile(part, attachmentDirectory, attachList);}getMailTextContent((Part) part.getContent(), content,cidList,attachList);} else if (part.isMimeType("multipart/*")) {Multipart multipart = (Multipart) part.getContent();int partCount = multipart.getCount();for (int i = 0; i < partCount; i++) {BodyPart bodyPart = multipart.getBodyPart(i);String cid=MailUtil.getCid(bodyPart);logger.info("#####getMailTextContent multipart/* cid:{}",cid);if(StringUtils.isNotEmpty(cid)) {cidList.add(cid);saveImageFile(bodyPart, attachmentDirectory, attachList);}getMailTextContent(bodyPart, content, cidList, attachList);}}
}

4.存储图片到自己的服务器

/*** 保存正文中有图片的** @param part    邮件中多个组合体中的其中一个组合体* @param destDir 附件保存目录* @throws UnsupportedEncodingException* @throws MessagingException* @throws IOException*/
public List<String> saveImageFile(Part part, String destDir, List<String> fileNames) {try {String fileName = part.getFileName();logger.info("######saveImageFile fileName={}", fileName);if (StringUtils.isNotEmpty(fileName)) {logger.info("######saveImageFile fileName={},decodeText={}", fileName, decodeText(part.getFileName()));InputStream is = part.getInputStream();if (fileName.toLowerCase().endsWith(".jpg") || fileName.toLowerCase().endsWith(".jpeg") || fileName.toLowerCase().endsWith(".png")) {String type = FilenameUtils.getExtension(decodeText(part.getFileName()));String fileKey = createFileKey() + (StringUtils.isEmpty(type) ? "" : "." + type);String filePath = destDir + File.separator + fileKey.substring(0, 10) + File.separator + fileKey;logger.info("######saveImageFile fileKey={},filePath={}", fileKey, filePath);try {createFileToNas(filePath, is);} catch (IOException e) {createFileToNas(filePath, is);logger.error("######createFileToNas error:{}", e);}fileNames.add(fileKey);}}}catch (Exception ex){logger.error("#####saveImageFile error:{}",ex);}return fileNames;
}

5.总结

邮件解析的方式差不多,需要根据实际情况出发做解析。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/53434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebLogic命令执行漏洞CVE-2019-2725

1.环境搭建 cd vulhub-master/weblogic/weak_password docker-compose up -d 2.漏洞验证 http://47.121.211.205:7001/_async/AsyncResponseService 说明存在漏洞 3.在当前页面抓包 修改请求包 写入shell wget http://47.121.211.205/1.txt -O servers/AdminServer/tmp/_W…

1.量化第一步,搭建属于自己的金融数据库!

数据是一切量化研究的前提。 做量化没有数据&#xff0c;就相当于做饭时没有食材。 很多时候&#xff0c;我们需要从大量的数据中寻找规律&#xff0c;并从中开发出策略。如果我们每次使用的时候&#xff0c;都从网上去找数据&#xff0c;一方面效率低下&#xff0c;另一方面短…

Redis详细解析

Redis 什么是Redis?关系型与非关系型数据库Redis可以做什么Redis入门安装在Windows系统上安装在Linux系统上安装 Redis在Linux系统上启动运行如何设置redis-server后台运行与关闭如何设置redis客户端登录时需要验证密码**设置允许远程连接redis服务**Redis数据类型Redis常用命…

Spring Boot管理用户数据

目录 学习目标前言Thymeleaf 模板JSON 数据步骤 1: 创建 Spring Boot 项目使用 Spring Initializr 创建项目使用 IDE 创建项目 步骤 2: 添加依赖步骤 3: 创建 Controller步骤 4: 新建index页面步骤 5: 运行应用程序 表单提交步骤 1: 添加 Thymeleaf 依赖在 Maven 中添加依赖 步…

LLM安全风险及应对

LLM安全风险主要从四个维度分析&#xff1a;用户输入、训练数据、模型本身以及工具和插件。 风险类别具体风险风险解释应对措施具体举例用户输入相关风险提示注入&#xff08;Prompt Injection&#xff09;攻击者通过设计特定输入&#xff0c;使模型生成恶意或不安全的输出。- …

Docker torchserve workflow部署流程

1. 先部署相关模型, 步骤见&#xff1a; Docker torchserve 部署模型流程 搭建涉及到的模型&#xff0c;如ocr_detection&#xff0c;ocr_judge&#xff0c;ocr_text, xxx_detection … 2. workflow文件 2.1 串行执行&#xff0c;示例1 &#xff08;1&#xff09;xxx_workf…

基于Ambari搭建hadoop生态圈+Centos7安装教程V2.0优化版(本篇博客写的较为详细,可能比较多,请耐心看)

当我们学习搭建hadoop的时候&#xff0c;未免也会遇见很多繁琐的事情&#xff0c;比如很多错误&#xff0c;需要解决。在以后公司&#xff0c;也不可能让你一个一个搭建hadoop&#xff0c;成千上万的电脑&#xff0c;你再一个个搭建&#xff0c;一个个报错&#xff0c;而且每台…

宿舍管理系统的设计与实现 (含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 宿舍管理系统拥有三个角色&#xff0c;分别为系统管理员、宿舍管理员以及学生。其功能如下&#xff1a; 管理员&#xff1a;宿舍管理员管理、学生管理、宿舍楼管理、缺勤记录管理、个人密…

C++ 落地AI项目教程:以libtorch实现DGA恶意域名的检测

# C++ 落地AI项目教程:以libtorch实现DGA恶意域名的检测 1. DGA域名 域名的生成方式域名生成算法(DGA) 是一个可以生成大量新域名的程序。 网络犯罪分子和僵尸网络运营者会使用域名生成算法来频繁更改所使用的域名,从而花样翻新地发起各种恶意软件攻击。 利用这项技术,黑客可…

Unity 设计模式 之 创建型模式 -【单例模式】【原型模式】 【建造者模式】

Unity 设计模式 之 创建型模式 -【单例模式】【原型模式】 【建造者模式】 目录 Unity 设计模式 之 创建型模式 -【单例模式】【原型模式】 【建造者模式】 一、简单介绍 二、单例模式 (Singleton Pattern) 1、什么时候使用单例模式 2、单例模式的好处 3、使用单例模式的…

Android平台Unity3D下如何同时播放多路RTMP|RTSP流?

技术背景 好多开发者&#xff0c;提到希望在Unity的Android头显终端&#xff0c;播放2路以上RTMP或RTSP流&#xff0c;在设备性能一般的情况下&#xff0c;对Unity下的RTMP|RTSP播放器提出了更高的要求。实际上&#xff0c;我们在前几年发布Unity下直播播放模块的时候&#xf…

9.20日学习记录及相关问题解答

部分一 今天看了一本古老的书。学到了一些有关计算机的远古的知识。弥补了一些之前没有意识到的空白点。 原来上个世纪就有AI这个东西了 现阶段的主流模式&#xff0c;在许多年前其实是将来要发展的对象。 B/S指的是客户机/服务器结构模式 C/S是在B/S基础上发展过来的。三层结…

大数据技术原理与应用

第一章、大数据概述 1、大数据时代的特征,并结合生活实例谈谈带来的影响。 (一)特征 1、Volume 规模性:数据量大。 2、Velocity高速性:处理速度快。数据的生成和响应快 摩尔定律:每两年,数据量增加一倍 1秒定律:响应时间时间控制在1秒以内 3、Variety多样化:数…

网络安全-LD_PRELOAD,请求劫持

目录 一、环境 二、开始做题 三、总结原理 四、如何防护 一、环境 我们这里用蚁剑自带的靶场第一关来解释 docker制作一下即可 二、开始做题 首先环境内很明显给我们已经写好了webshell 同样我们也可以访问到 我们使用这个蚁剑把这个webshell连上 我们发现命令不能执行&am…

Dockerfile全面指南:从基础到进阶,掌握容器化构建的核心工具

目录 Dockerfile全面指南&#xff1a;从基础到进阶&#xff0c;掌握容器化构建的核心工具 引言 一、什么是 Dockerfile 二、Dockerfile 的基本结构 三、Dockerfile 的常见配置项 1、多阶段构建 (Multi-stage Builds) 2、缓存优化 3、合并 RUN 命令 四、Dockerfile 使用…

Python知识点:如何使用Python进行医学图像处理

开篇&#xff0c;先说一个好消息&#xff0c;截止到2025年1月1日前&#xff0c;翻到文末找到我&#xff0c;赠送定制版的开题报告和任务书&#xff0c;先到先得&#xff01;过期不候&#xff01; 在Python中进行医学图像处理是一个涉及多个步骤的过程&#xff0c;包括图像的读…

Ruby-SAML CVE-2024-45409 漏洞解决方案

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

从数据仓库到数据中台再到数据飞轮:我了解的数据技术进化史

这里写目录标题 前言数据仓库&#xff1a;数据整合的起点数据中台&#xff1a;数据共享的桥梁数据飞轮&#xff1a;业务与数据的双向驱动结语 前言 在当今这个数据驱动的时代&#xff0c;企业发展离不开对数据的深度挖掘和高效利用。从最初的数据仓库&#xff0c;到后来的数据…

基于SpringBoot+Vue+MySQL的校园一卡通系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着现代社会的快速发展&#xff0c;校园一卡通已成为大学生活中不可或缺的一部分。它不仅承载着校园消费的功能&#xff0c;还集成了学生身份证明、图书馆借阅、门禁系统等多种服务。然而&#xff0c;传统的一卡通管理系统往往…

OpenCL 学习(2)---- OpenCL Platform 和 Device

目录 OpenCL PlatformOpenCL Device参考代码 OpenCL Platform opencl 支持的 Platform 可以使用 clGetPlatformIDs 函数查询&#xff0c;函数原型如下&#xff1a; clGetPlatformIDs(cl_uint /* num_entries */,cl_platform_id * /* platforms */,cl_uint * …