使用hutool阿里云企业邮箱发送邮件和附件,包含PDF转图片base64,PDF转HTML

请务必开启阿里云服务器465 ssl邮件端口
废话不多,我们直接上代码。

maven添加依赖:

<dependency>
  <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.22</version>
</dependency>

<dependency>
  <groupId>e-iceblue</groupId>
    <artifactId>spire.pdf.free</artifactId>
    <version>4.4.1</version>
</dependency>

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.24</version>
</dependency>


<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>

完整代码:

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.extra.mail.MailAccount;
import cn.hutool.extra.mail.MailUtil;
import com.sun.mail.util.MailSSLSocketFactory;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.junit.jupiter.api.Test;

import java.awt.image.BufferedImage;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;

import com.spire.pdf.*;

import javax.imageio.ImageIO;

/**
 * @author hsj
 * @description:阿里云企业邮箱发送邮件和附件(请开启阿里云服务器465端口)
 * @date 2024-4-25 8:59
 */
@Slf4j
public class Temail {
	/**
	 * @Description:发邮件
	 * @author HeShengjin 2356899074@qq.com
	 * @date 2024-4-25 10:11
	 */
	@Test
	public void t() throws IOException {
		InputStream inputStream = null;
		try {
			//公司阿里云企业邮箱
			String from = "你的阿里云企业邮箱";

			// 加载PDF文档URL
			URL url = new URL("https://jixujiaoyu-test.oss-cn-shenzhen.aliyuncs.com/upload/20240425/1954fae396aa5aa1eb3dbad8edc19547.pdf");
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			inputStream = conn.getInputStream();

//			// 获取字节数组
			byte[] bytesPdf = readInputStream(inputStream);


			MailSSLSocketFactory sf = new MailSSLSocketFactory();
			sf.setTrustAllHosts(true);

			MailAccount account = new MailAccount();
			account.setHost("smtp.mxhichina.com");
			account.setPort(465);
			account.setAuth(true);
			account.setSslEnable(true);
			account.setFrom(from.trim());
			account.setUser(from.trim());
			account.setPass("你的阿里云企业邮箱密码");
			account.setCharset(CharsetUtil.CHARSET_UTF_8);
			account.setCustomProperty("mail.smtp.ssl.socketFactory", sf);
			MailUtil.send(account,
				CollUtil.newArrayList("你的要发送的目标邮箱"),//目标邮箱
				"主题名称",//邮件主题
				"<p>测试发送邮件,使用阿里云云邮箱(发送中文名字附件)。</p>",
				true,//支持HTML内容
				FileUtil.writeBytes(bytesPdf,String.format("%s%s",FileUtil.getTmpDirPath(),"中文名字附件.pdf")));
		} catch (Exception e){
			e.printStackTrace();
			log.error(String.format("发送邮件失败,%s",e.getMessage()));
		} finally {
			if (inputStream != null){
				inputStream.close();
			}
		}
	}

	/**
	 * @Description:PDF转HTML
	 * @author HeShengjin 2356899074@qq.com
	 * @date 2024-4-25 10:11
	 */
	@Test
	public void t2() throws IOException{
		InputStream inputStream = null;
		try {
			// 加载PDF文档URL
			URL url = new URL("https://jixujiaoyu-test.oss-cn-shenzhen.aliyuncs.com/upload/20240425/1954fae396aa5aa1eb3dbad8edc19547.pdf");
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			inputStream = conn.getInputStream();

			// 获取字节数组
			byte[] bytes = readInputStream(inputStream);

			//加载PDF文档
			PdfDocument pdf = new PdfDocument();
			pdf.loadFromBytes(bytes);

			//设置useEmbeddedSvg和 useEmbeddedImg布尔值为true
			pdf.getConvertOptions().setPdfToHtmlOptions(true,true);

			//保存到流
			File outFile = new File("PDFtoHTML.html");
			OutputStream outputStream = new FileOutputStream(outFile);
			pdf.saveToStream(outputStream, FileFormat.HTML);
			pdf.close();

			System.out.println("PDF转换成HTML完成!");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (inputStream != null){
				inputStream.close();
			}
		}
	}
	/**
	 * @Description:PDF转图片base64
	 * @author HeShengjin 2356899074@qq.com
	 * @date 2024-4-25 10:12
	 */
	@Test
	public void t3() throws IOException{
		InputStream inputStream = null;
		ByteArrayOutputStream byteArrayOutputStream = null;
		try {
			// 加载PDF文档URL
			URL url = new URL("https://jixujiaoyu-test.oss-cn-shenzhen.aliyuncs.com/upload/20240425/1954fae396aa5aa1eb3dbad8edc19547.pdf");
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			inputStream = conn.getInputStream();

//			// 获取字节数组
			byte[] bytesPdf = readInputStream(inputStream);
			List<BufferedImage> bufferedImages = pdfToImage(bytesPdf);

			byteArrayOutputStream = new  ByteArrayOutputStream();
			ImageIO.write(bufferedImages.get(0),"jpg",byteArrayOutputStream);//只要PDF第一页的一张图片
			// 清流
			byteArrayOutputStream.flush();
			// 转为byte[]
			byte[] byteImage = byteArrayOutputStream.toByteArray();

			// 将图片数据转换为Base64字符串
			String base64String = Base64.getEncoder().encodeToString(byteImage);
			String html = String.format("<img src=\"data:image/jpg;base64,%s\" />",base64String);
//
			//保存到流
			File outFile = new File("PDFtoIMGBase64.html");
			FileUtils.writeByteArrayToFile(outFile,html.getBytes(StandardCharsets.UTF_8));

			System.out.println("PDF转换成HTML完成!");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (inputStream != null){
				inputStream.close();
			}
			if (byteArrayOutputStream != null){
				// 关流
				byteArrayOutputStream.close();
			}
		}
	}

	/**
	 *
	 * @Description: (InputStream转字节数组)
	 * @author hsj
	 * @date 2019年8月8日
	 */
	public byte[] readInputStream(InputStream inputStream) throws IOException {
		byte[] buffer = new byte[1024];
		int len = 0;
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		while((len = inputStream.read(buffer)) != -1) {
			bos.write(buffer, 0, len);
		}
		bos.close();
		return bos.toByteArray();
	}

	/**
	 * PDF转图片 (一个PDF很多页,所以很多图片)
	 * @param bytes:文件输入流
	 * @return
	 */
	public List<BufferedImage> pdfToImage(byte[] bytes){
		List<BufferedImage> images = new ArrayList<>();
		PDDocument document = null;
		try {
			// 加载PDF文档
			document = PDDocument.load(bytes);
			// 创建PDFRenderer对象
			PDFRenderer renderer = new PDFRenderer(document);

			for (int i = 0; i < document.getNumberOfPages(); i++) {
				/**
				 * 《 72 》 此处设置得越大像素越高,生成得时候也会越久
				 * DPI 的设置一般根据具体的需求和使用场景来决定。DPI 越高,生成的图片分辨率越大,图像质量也越高,
				 * 但同时文件大小也会变得更大。通常情况下,如果需要对生成的图片进行放大、裁剪等操作,建议将 DPI 设置得较高,
				 * 以保证图像质量和细节的清晰度;如果只是需要简单地浏览或共享图片,可以适当降低 DPI 以减小文件大小。在实际开发中,
				 * 可以根据不同的应用场景进行调整。一般来说,72 DPI 是一个比较常见的默认值,可以作为参考。
				 */
				BufferedImage image = renderer.renderImageWithDPI(i, 72, ImageType.RGB);
				images.add(image);
			}
			return images;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			// 关闭文档
			try {
				if (document != null) {
					document.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}


}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IDEA2024最新版的激活与安装-保姆级教学

目录 一、idea 介绍 二、官网下载 2.1 进入官网&#xff0c;下载zip绿色版即可 2.2 输入网址下载jetbra.zip 2.3 执行idea/soft/scripts/install-allusers.vbs文件&#xff08;根据自己安装路径改变&#xff09; 2.4 启动idea/soft/bin/idea64.exe 将事先复制好的码复制进去…

MATLAB线性函数拟合并预测

线性函数拟合&#xff0c;由线性函数很好描述的一个数集,也就是说如果我们所考虑的数据是以y(x)的形式给出&#xff0c;并且其中f(x)满足: 要求得 m 和b的值&#xff0c;我们可以使用一个称为 polyii(x,y,n)的 MATLAB 函数&#xff0c;其中n是我们要 MATLAB 求出的多项式的次数…

Ribbon负载均衡的两种方案

1.服务端负载均衡 在消费者和服务提供方中间使用独立的代理方式进行负载&#xff0c;有硬件的&#xff08;比如 F5&#xff09;&#xff0c;也有软件的&#xff08;比如 Nginx&#xff0c;openResty&#xff09; 例如Nginx&#xff0c;通过Nginx进行负载均衡&#xff0c;先发送…

李沐66_使用注意力机制的seq2seq——自学笔记

加入注意力 1.编码器对每次词的输出作为key和value 2.解码器RNN对上一个词的输出是query 3.注意力的输出和下一个词的词嵌入合并进入RNN 一个带有Bahdanau注意力的循环神经网络编码器-解码器模型 总结 1.seq2seq通过隐状态在编码器和解码器中传递信息 2.注意力机制可以根…

.NET 个人博客-添加RSS订阅功能

个人博客-添加RSS订阅功能 前言 个人博客系列已经完成了 留言板文章归档推荐文章优化推荐文章排序 博客地址 然后博客开源的原作者也是百忙之中添加了一个名为RSS订阅的功能&#xff0c;那么我就来简述一下这个功能是干嘛的&#xff0c;然后照葫芦画瓢实现一下。 RSS简述…

php代码比对工具优化版

下载地址&#xff1a;php代码比对工具优化版.zip 一款强大且专业的文件对比工具(php代码比对)&#xff0c;用户可以直接在线进行两个或多个文件的差异对比&#xff0c;支持用户进行多种格式的问价对比&#xff0c;用户可以在这里轻松查找出相同会不同之处&#xff0c;支持用户…

elementui el-date-picker禁止选择今年、今天、之前、时间范围限制18个月

1、禁止选择今年之前的所有年份 <el-date-pickerv-if"tabsActive 0":clearable"false"v-model"yearValue"change"yearTimeChange"type"year"placeholder"选择年"value-format"yyyy":picker-options…

文化旅游3D数字孪生可视化管理平台推动文旅产业迈向更加美好的未来

随着数字化、智能化管理成为文旅产业发展的必然趋势&#xff0c;数字孪生公司深圳华锐视点创新性地推出了景区三维可视化数字孪生平台&#xff0c;将线下的实体景区与线上的虚拟世界完美融合&#xff0c;引领智慧文旅新潮流。 我们运用先进的数字孪生、web3D开发和三维可视化等…

怎么设置 idea terminal 窗口的编码格式

1 修改Terminal 窗口为 Git bash 窗口 打开 settings 设置界面&#xff0c;选择 Tools 中的 Terminal (File -> settings -> Tools -> Terminal) 修改 Shell path 为你的 Git bash 安装路径&#xff0c;我的在 C:\my_software\java\Git\bin\bash.exe 2 解决中文显示…

高端制造企业生产设备文件管理,怎样保证好用不丢失文件?

高端制造业在市场经济中占据重要角色&#xff0c;在高端制造业企业内部&#xff0c;生产设备又是最关键的一环环&#xff0c;它们不仅负责完成生产任务&#xff0c;同时也会产生大量的文件。这些数据反映了设备的运行状态、生产效率、能源消耗以及产品质量等多个方面&#xff0…

网站内容下载软件有哪些 网站内容下载软件推荐 网站内容下载软件安全吗 idm是啥软件 idm网络下载免费

一招搞定网页内容下载&#xff0c;并且各大网站通用&#xff01;绕过资源审查&#xff0c;所有网站内容随意下载。解锁速度限制&#xff0c;下载即高速无视网站限速。跳过会员充值&#xff0c;所有VIP资源免费下载。有关网站内容下载软件有哪些&#xff0c;网站内容下载软件推荐…

汽车信息安全--如何理解TrustZone(1)

目录 1.车规MCU少见TrustZone 2. 什么是TrustZone 2.1 TrustZone隔离了什么&#xff1f; 2.2 处理器寄存器和异常处理 3.小结 1.车规MCU少见TrustZone 在车规MCU里&#xff0c;谈到信息安全大家想到的大多可能都是御三家的HSM方案&#xff1a;英飞凌的HSM\SHE、瑞萨的ICU…

【【gitlab解决git Clone 出现 Permission denied, please try again.】】

【gitlab解决git Clone 出现 Permission denied, please try again.】 问题解决随便找一个地方 点击右键输入ssh -keygen -C "邮件"显示结果输入 登录gitlab然后再次git Clone就可以了。 问题 git clone的时候出现 Permission denied, please try again 解决 随便…

跨语言指令调优深度探索

目录 I. 介绍II. 方法与数据III. 结果与讨论1. 跨语言迁移能力2. 问题的识别3. 提高跨语言表现的可能方向 IV. 结论V. 参考文献 I. 介绍 在大型语言模型的领域&#xff0c;英文数据由于其广泛的可用性和普遍性&#xff0c;经常被用作训练模型的主要语料。尽管这些模型可能在英…

jar依赖批量上传Nexus服务器(二)

jar依赖批量上传Nexus服务器&#xff08;二&#xff09; 批量上传脚本 #!/bin/bash # copy and run this script to the root of the repository directory containing files # this script attempts to exclude uploading itself explicitly so the script name is important…

华为数字化转型与数据管理实践介绍(附PPT下载)

华为作为全球领先的信息与通信技术&#xff08;ICT&#xff09;解决方案提供商&#xff0c;在数字化转型和数据管理领域拥有丰富的实践经验和技术积累。其数字化转型解决方案旨在帮助企业通过采用最新的ICT技术&#xff0c;实现业务流程、组织结构和文化的全面数字化&#xff0…

电子工艺卡在汽车制造流程中的应用

在当今高度发达的汽车工业中&#xff0c;电子工艺卡作为一种重要的工具&#xff0c;在汽车制造流程中发挥着至关重要的作用。它不仅是汽车生产的指导手册&#xff0c;更是确保汽车质量和性能的关键因素。 汽车制造是一个复杂而精密的过程&#xff0c;涉及众多的零部件和系统。电…

云LIS系统概述JavaScript+前端框架JQuery+EasyUI+Bootstrap医院云HIS系统源码 开箱即用

云LIS系统概述JavaScript前端框架JQueryEasyUIBootstrap医院云HIS系统源码 开箱即用 云LIS&#xff08;云实验室信息管理系统&#xff09;是一种结合了计算机网络化信息系统的技术&#xff0c;它无缝嵌入到云HIS&#xff08;医院信息系统&#xff09;中&#xff0c;用于连…

粘合/胶合/粘接/聚酰亚胺PI材料使用UV胶,具有高强度粘接的优势,这一点具体要如何操作?(三十五)

前面文章说明使用UV胶粘合聚酰亚胺PI材料时&#xff0c;有一点优势是&#xff1a;具有高强度粘接&#xff0c;UV胶粘剂对聚酰亚胺PI材料具有良好的附着性&#xff0c;能够提供高强度的粘接。这对于需要承受重负载或高应力的应用来说尤为重要。 这一点提到UV胶在粘合聚酰亚胺&am…

03-JAVA设计模式-状态模式

状态模式 什么是状态模式 Java中的状态模式&#xff08;State Pattern&#xff09;是一种行为型设计模式&#xff0c;主要用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。状态模式允许一个对象在其内部状态改变时改变它的行为&#xff0c;使得对象看起来似乎…
最新文章