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

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

注意:阿里云邮箱不支持邮件内容HTML带有URL链接,会被过滤和谐掉!,所以邮件内容有PDF要么:

  • PDF转图片base64,PDF转HTML;
  • 要么附件形式

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*/@Testpublic void t() throws IOException {InputStream inputStream = null;try {//公司阿里云企业邮箱String from = "你的阿里云企业邮箱";// 加载PDF文档URLURL 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*/@Testpublic void t2() throws IOException{InputStream inputStream = null;try {// 加载PDF文档URLURL 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布尔值为truepdf.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*/@Testpublic void t3() throws IOException{InputStream inputStream = null;ByteArrayOutputStream byteArrayOutputStream = null;try {// 加载PDF文档URLURL 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.mzph.cn/pingmian/4517.shtml

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

相关文章

工具:如何在国内高速下载SRA

如何在国内高速下载SRA 下载公共测序数据&#xff0c;一般是通过在NCBI上搜索到study的Run SRA号&#xff0c;然后使用NCBI提供的prefetch下载数据&#xff0c;但因NCBI国内访问较为缓慢导致下载速度巨慢&#xff0c;因此推荐使用EBI提供的enaBrowserToolsAspera的方式从ENA下…

艾体宝案例 | 使用Redis和Spring Ai构建rag应用程序

随着AI技术的不断进步&#xff0c;开发者面临着如何有效利用现有工具和技术来加速开发过程的挑战。Redis与Spring AI的结合为Java开发者提供了一个强大的平台&#xff0c;以便快速构建并部署响应式AI应用。探索这一整合如何通过简化的开发流程&#xff0c;让开发者能够更专注于…

大核注意力 LKA | Visual Attention Network

论文名称&#xff1a;《Visual Attention Network》 论文地址&#xff1a;2202.09741 (arxiv.org) 尽管最初是为自然语言处理任务而设计的&#xff0c;但自注意力机制最近在各个计算机视觉领域迅速崭露头角。然而&#xff0c;图像的二维特性给计算机视觉中的自注意力应用带来了…

生成式人工智能AIGC技术的发展现状和未来趋势

生成式人工智能AIGC技术的发展现状和未来趋势 引言&#xff1a; 生成式人工智能&#xff08;Generative Artificial Intelligence&#xff0c;GAN&#xff09;是人工智能领域的一项重要技术&#xff0c;用于生成逼真的图像、视频和音频等内容。图形计算在游戏、虚拟现实、增强…

【Vue】组件化编程

定义 实现应用中局部功能代码和资源的集合 为什么要用组件化编程? 传统方式编写:依赖关系混乱,不好维护,且代码复用率不高 模块化编写:只关注解决js,复用js,简化js的编写与效率 组件方式编写:好维护、复用率更高、提高运行效率 在组件出现之前,我们开发基本都是用htm…

GD32E103C8T6 封装LQFP-48 GigaDevice(兆易创新) 单片机

GD32E103C8T6 是由GigaDevice&#xff08;兆易创新&#xff09;公司生产的一款基于ARM Cortex-M4内核的32位MCU&#xff08;微控制器&#xff09;。以下是GD32E103C8T6的一些主要功能和参数介绍&#xff1a; 主要功能&#xff1a; 高性能ARM Cortex-M4内核: 采用120MHz的ARM …

修复所有 bug 并不能解决所有问题

原文&#xff1a;jeffpsherman - 2024.04.08 在软件领域&#xff0c;如同在制造业&#xff0c;有些问题是由于 bug 或“特殊原因”引发的&#xff0c;而有些则是“常见原因”&#xff0c;这是由于系统设计和实现的性质所导致的。修复 bug 就是移除特殊原因&#xff0c;消除 bu…

基于SpringBoot的合家云社区物业管理平台 - 项目介绍

合家云社区物业管理平台 2.合家云需求&设计 2.1 项目概述 2.1.1 项目介绍 合家云社区物业管理平台是一个全新的 ”智慧物业解决方案“&#xff0c;是一款互联网的专业社区物业管理系统。平台通过社区资产管理、小区管理、访客管理、在线报修、意见投诉等多种功能模块&a…

指针笔试题模拟

题目一 int main() {int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(&a 1);printf( "%d,%d", *(a 1), *(ptr - 1));return 0; } 1*&#xff08;a1&#xff09;可以等价于a[1],即第一个打印的是数组第二个下标的元素&#xff1a;2 2 而ptr拿到的是整个数组的地…

CentOS上如何自定义开机启动服务

一&#xff1a;简单的例子 在CentOS7之后自定义开机启动服务&#xff0c;可以通过创建一个systemd服务单元文件来实现。以下是创建自定义服务并设置其开机启动的步骤&#xff1a; 1&#xff0c;编辑服务文件&#xff0c;并添加以下内容&#xff1a; [Unit] DescriptionMy cu…

MySQL慢SQL优化技术深度学习指南

引言 在现代数据驱动的应用环境中&#xff0c;MySQL作为广泛应用的关系型数据库管理系统&#xff0c;其性能直接影响着整个系统的响应速度与用户体验。随着数据规模的增长和业务复杂性的提升&#xff0c;一些SQL查询可能会逐渐演变为慢查询&#xff0c;成为系统性能瓶颈。本文旨…

Ubuntu安装中文输入法

Ubuntu默认没有中文输入法&#xff0c; 本文将安装搜狗拼音输入法。 1 安装搜狗拼音输入法 下载安装搜狗拼音输入法&#xff1a; 先去官网下载安装包&#xff0c; 然后执行安装&#xff1a; sudo dpkg -i sogoupinyin_4.0.1.2800_x86_64.deb 2 安装fcitx sudo apt install fci…

SVM中常用的核函数及适用场景

常用的核函数 核函数&#xff08;Kernel functions&#xff09;在机器学习中尤其是在支持向量机&#xff08;SVM&#xff09;中扮演着重要的角色&#xff0c;它们能够将数据映射到高维空间&#xff0c;从而解决非线性问题。以下是一些常用的核函数及其适用场景&#xff1a; 线…

大模型的幻觉---探讨及解决之道

大模型「幻觉」背景 幻觉可以说早就已经是LLM老生常谈的问题了&#xff0c;那为什么会产生这个现象该如何解决这个问题呢&#xff1f;大模型幻觉产生的背景主要涉及人类视觉系统的特性和大规模机器学习模型的复杂性。以下是对大模型幻觉产生背景的详细说明和介绍&#xff1a; …

C语言之详细讲解文件操作

什么是文件 与普通文件载体不同&#xff0c;文件是以硬盘为载体存储在计算机上的信息集合&#xff0c;文件可以是文本文档、图片、程序等等。文件通常具有点三个字母的文件扩展名&#xff0c;用于指示文件类型&#xff08;例如&#xff0c;图片文件常常以KPEG格式保存并且文件…

第5篇:创建Nios II工程之Hello_World<四>

Q&#xff1a;最后我们在DE2-115开发板上演示运行Hello_World程序。 A&#xff1a;先烧录编译Quartus硬件工程时生成的.sof文件&#xff0c;在FPGA上成功配置Nios II系统&#xff1b;然后在Nios II Eclipse窗口右键点击工程名hello_world&#xff0c;选择Run As-->Nios II …

Go语言中,如何做到数据按类别分发给特定的协程处理

在 Go 语言中&#xff0c;如果你想按类别将数据分配给特定的协程&#xff08;goroutine&#xff09;进行处理&#xff0c;可以使用几种策略。下面我将提供一些方法和示例&#xff0c;说明如何根据数据类别将任务分配给不同的协程来处理。 使用通道&#xff08;Channel&#xf…

C#利用IDbCommand实现通用数据库脚本执行程序

目录 关于 ExecuteNonQuery 数据库脚本程序的执行流程 范例运行环境 通用类的设计 引用 DAL类 实现代码 小结 关于 ExecuteNonQuery 在.net 应用中&#xff0c;在数据库中执行脚本程序是经常用到的功能&#xff0c;如数据操作&#xff08;新增、修改、删除等&#xff0…

C语言趣味代码(四)

这一篇主要编写几个打字练习的小程序&#xff0c;然后通过这些小程序的实现来回顾复习我们之前学过的知识&#xff0c;然后通过这写打字练习的小程序来提升我们的打字技术和编程技术。 1. 打字练习 1.1 基本打字练习 1.1.1 基本实现 首先我们来制作一个用于计算并显示输入一…

github two-factor authentication是个啥?

最近在逛github时&#xff0c;总是时不时会弹出一下界面&#xff0c;很烦 看到红框里的文字&#xff0c;这明显是强制要求做这个认证&#xff0c;如果不认证4天后账号将不可访问&#xff0c;所以今天花点时间看看怎么做这个认证&#xff0c;点“Enable 2FA now”进入这个界面&a…