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

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

maven添加依赖:

java 复制代码
<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>

完整代码:

java 复制代码
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();
			}
		}
	}


}
相关推荐
CESS_Cloud20 小时前
CESS 出席华盛顿区块链政策峰会:参与国家安全与数据隐私保护专题讨论
安全·阿里云·web3·去中心化·区块链
HaoHao_0101 天前
云消息队列 Kafka 版
分布式·阿里云·kafka·云计算·云服务器
HaoHao_0102 天前
云消息队列 RabbitMQ 版
阿里云·云计算·云服务器
HaoHao_0102 天前
应用实时监控服务ARMS
阿里云·云计算·云服务器
Cachel wood2 天前
Vue.js前端框架教程10:Vue生命周期钩子onBeforeMount 和onMounted
linux·前端·javascript·vue.js·阿里云·前端框架·ecmascript
松垮的屁兜2 天前
【OSS】php使用oss存储
阿里云·php
Pocker_Spades_A2 天前
阿里云-通义灵码:在 PyCharm 中的强大助力(上)
阿里云·开源软件
船长@2 天前
python快速接入阿里云百炼大模型
阿里云·云计算
ezreal_pan2 天前
基于阿里云日志服务的程序优化策略与实践
阿里云·性能优化·阿里云日志