Quarkus 集成 mailer 使用 easyexcel 发送表格邮件

news2025/7/18 23:02:22

前言

在quarkus 项目开发中,需要实现一个把用户数据写入到excel 表格中,然后发送邮件给到对应的用户邮箱上,在查找了Quarkus 官方文档后发现,Quarkus 对于发送邮箱的服务是天然支持的.

官方文档: https://cn.quarkus.io/guides/mailer

环境配置

首先发送邮箱服务,那么就需要有一个邮箱的配置,并且需要开启 smtp 服务才能进行发送邮箱,
这里我使用的是 网易邮箱,其他的邮箱应该也是同理.
在这里插入图片描述

进入到页面后,选择设置,点击smtp 按钮,然后开启
在这里插入图片描述

记住一定要保持密钥,这是后面发送消息的密码.环境配置好了,那么接下来就是集成了.

集成

maven:

<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-mailer</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.1.2</version>
</dependency>

项目中增加 以下以来,因为我们需要进行操作表格,所以我这里加入了阿里的表格工具类:easyexcel,可以很方便的操作.

application.properties

quarkus.mailer.from=miraitowa1796@163.com
quarkus.mailer.host=smtp.163.com
quarkus.mailer.port=465
quarkus.mailer.ssl=true
quarkus.mailer.username=miraitowa1796@163.com
quarkus.mailer.password=xxxxxxxx //请修改为自己的密码
%dev.quarkus.mailer.mock=false

quarkus.mailer.mock : 是否开启mock ,默认在正式环境下是false,所以我们在其他环境上需要手动指定为不开启

代码示例

增加一个表格实体类:

public class User {

    @ExcelProperty("字符串标题")
    private String string;
    @ExcelProperty("数字标题")
    private Double doubleData;

    public String getString() {
        return string;
    }

    public void setString(String string) {
        this.string = string;
    }

    public Double getDoubleData() {
        return doubleData;
    }

    public void setDoubleData(Double doubleData) {
        this.doubleData = doubleData;
    }
}

引入 Mailer 类即可实现发送邮箱服务:

/**
 * 测试邮箱发送:
 */
@Path("/contextLoads")
@GET
@Blocking
public  void contextLoads() {
    Mail mail = Mail.withText("1796789910@qq.com", "测试邮件服务", "这是一封用来测试邮件的服务");
    mailer.send(mail);
}

@Path("/contextFileXlisLoads")
@GET
@Blocking
public  void contextFileXlisLoads() {
    Mail mail = Mail.withText("1796789910@qq.com", "测试发送表格文件", "这是一个带附件的html文件")
            .addAttachment("测试.xlsx", excelToByteArray(getUsers()),"text/plain");
    mailer.send(mail);
}

/**
 * 将 Excel 写入 ByteArrayOutputStream
 */
private byte[] excelToByteArray(List<User> list) {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    EasyExcel.write(outputStream, User.class).sheet("测试").doWrite(list);
    return outputStream.toByteArray();
}


private List<User> getUsers() {
    List<User> list = ListUtils.newArrayList();
    for (int i = 0; i < 10; i++) {
        User data = new User();
        data.setString("字符串" + i);
        data.setDoubleData(0.56);
        list.add(data);
    }
    return list;
}

启动应用服务访问: curl http://localhost:8080/contextFileXlisLoads, 查看邮箱即可发送成功.

以响应式的方式发送邮件服务

疑问

上面那种方式是以同步发送邮件,在请求多的情况下,会出现阻塞,接收邮件慢点问题,那么我们 如何以非阻塞,响应式发送邮件呢?

解决方案

Quarkus 已经为我们提供了解决方案,想以响应性的方式去发送邮件只需要注入ReactiveMailer 使用它,方法是一样,只是该方法返回了响应式副本,而不是同步式副本.

@Inject
ReactiveMailer mailer;


/**
 * 测试邮箱发送:
 */
@Path("/contextLoads")
@GET
@Blocking
public  void contextLoads() {
    Mail mail = Mail.withText("1796789910@qq.com", "测试邮件服务", "这是一封用来测试邮件的服务");
    mailer.send(mail);
}

@Path("/contextFileXlisLoads")
@GET
@Blocking
public  void contextFileXlisLoads() {
    Mail mail = Mail.withText("1796789910@qq.com", "测试发送表格文件", "这是一个带附件的html文件")
            .addAttachment("测试.xlsx", excelToByteArray(data()),"text/plain");
    mailer.send(mail);
}

/**
 * 将 Excel 写入 ByteArrayOutputStream
 */
private byte[] excelToByteArray(List<User> list) {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    EasyExcel.write(outputStream, User.class).sheet("测试").doWrite(list);
    return outputStream.toByteArray();
}


private List<User> data() {
    List<User> list = ListUtils.newArrayList();
    for (int i = 0; i < 10; i++) {
        User data = new User();
        data.setString("字符串" + i);
        data.setDoubleData(0.56);
        list.add(data);
    }
    return list;
}

与上面的例子基本一致,只是把同步邮箱组件,改为响应式组件.

遇到的问题

发送邮件,没有报错,为什么没有收到邮件呢?
在最开始的时候,我没有加入quarkus.mailer.mock=false 这一行配置,导致出现了上面疑问的问题,在查找了官方文档后,发现了答案.
官网配置文档: https://cn.quarkus.io/guides/mailer-reference
quarkus.mailer.mock
启用模拟模式。启用后,邮件不会发送,而是存储在内存邮箱中。电子邮件的内容也打印在控制台上。在 PROD 模式下默认禁用,在 DEV
修改为false 即可.

项目源码:
https://gitee.com/QuRenNen/quarkus-integrate 如果有帮助请一键三连…

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

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

相关文章

CAS:89485-61-0,mPEG-N3,mPEG-Azide,甲氧基-peg-叠氮试剂供应

mPEG-N3&#xff08;mPEG-Azide&#xff09;中文名为甲氧基-聚乙二醇-叠氮&#xff0c;它所属分类为Azide PEG Methoxy PEG。CAS编号为89485-61-0。 peg试剂的分子量均可定制&#xff0c;有&#xff1a;甲氧基-聚乙二醇-叠氮 5k、甲氧基-PEG-叠氮 10k、mPEG-Azide 2k、甲氧基-…

error20221125--ssm项目用maven打包报错“找不到程序包 java.lang”或者“程序包javax.crypto不存在”,以及解决方案

从svn拉的ssm项目&#xff0c;写完代码准备发测试&#xff1b;结果用maven打war包的时候报错了 这个时候在控制台找到报错信息如下图 说“在类路径或引导类路径中找不到程序包 java.lang”&#xff1b; 我寻思着&#xff0c;java.lang不是jdk中基础的包吗&#xff1f;不应该有…

c盘哪些文件可以删除?正确答案在这里!

当我们使用电脑时&#xff0c;经常下意识把各种文件数据保存在c盘&#xff0c;导致c盘的空间越来越小。想要清理电脑缓存&#xff0c;c盘哪些文件可以删除&#xff1f;注意&#xff0c;清理文件之前&#xff0c;记得要备份好重要的数据&#xff01;下面一起来看看哪些c盘文件可…

PyQt5 QDockWidget

PyQt5 QDockWidget方法描述setWidget()在Dock窗口区域设置QWidgetsetFloating()设置Dock窗口是否可以浮动&#xff0c;如果设置为True&#xff0c;则表示可以浮动setAllowedAreas()设置窗口可以停靠的区域 ●LeftDockWidgetArea:左边停靠区域●RightDockWidgetArea:右边停靠区域…

kafka消息的序列化与反序列化

一、前言 在使用kafka发送消息时&#xff0c;producer端需要序列化&#xff0c;在大多数场景中&#xff0c; 需要传输的是与业务规则相关的复杂类型&#xff0c; 这就需要自定义数据结构。 Avro是一种序列化框架&#xff0c; 使用JSON来定义schema&#xff0c; sh cema由原始类…

若依前后端分离发布富文本框内容 | uni-app微信小程序展示富文本框内容

微信小程序端引入富文本样式 富文本提交图片json error 一、展示示例&#xff1a; 1.PC端前端发布界面 可以设置文字大小&#xff0c;居中&#xff0c;可以插入图片&#xff0c;设置图片大小&#xff0c;居中。 2.小程序端展示 二、基于若依框架踩坑和实现 1.数据库字段设…

RabbitMQ【直连、主题、扇形交换机实战】

目录 1. 直连交换机&#xff08;Direct实战&#xff09; provider生产者&#xff08;publisher&#xff09; consumer消费者 2. 主题交换机&#xff08;Topic实战&#xff09; provider生产者&#xff08;publisher&#xff09; consumer消费者 3. 扇形交换机&#xff08;Fa…

3.71 OrCAD新建原理图时,每一个类目的含义是什么?OrCAD软件怎么显示元器件的封装名称?

笔者电子信息专业硕士毕业&#xff0c;获得过多次电子设计大赛、大学生智能车、数学建模国奖&#xff0c;现就职于南京某半导体芯片公司&#xff0c;从事硬件研发&#xff0c;电路设计研究。对于学电子的小伙伴&#xff0c;深知入门的不易&#xff0c;特开次博客交流分享经验&a…

第四章:Java琐事

乐观锁和悲观锁悲观锁乐观锁八种案例演示synchronized到底锁的是什么字节码角度分析 Synchronizedsynchronized 同步代码块synchronized 同步方法为什么任意一个对象都可以是锁&#xff1f;公平锁和非公平锁为什么会有公平锁/非公平锁的设计&#xff1f;为什么默认是非公平&…

计算机毕业设计jspKTV点歌系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP KTV点歌系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开 发&#xff0c;数据库为Mysql&#xff0c;使用jav…

Transformer Fusion for Indoor RGB-D Semantic Segmentation非官方自己实现的代码

声明&#xff1a;文章没有官方的代码&#xff0c;这里自己浅显的分析一下。 首先看一下encoder&#xff0c;就是swin transformer&#xff0c;假设RGB的维度为(1,3,480,480),Depth维度为(1,1,480,480)。维度分别变为**(1,64,120,120)—>(1,64,120,120)—>(1,128,60,60)—…

关于conda、虚拟环境、镜像通道、pip、pycharm解释器配置的一些总结

目录conda与虚拟环境相关命令查看当前存在哪些虚拟环境创建虚拟环境克隆虚拟环境删除指定虚拟环境删除指定虚拟环境中某个包设置国内镜像添加Anaconda的TUNA镜像添加USTC仓库镜像设置搜索时显示通道地址Conda 附加库查看channels恢复默认镜像&#xff08;即删除手动配置的全部镜…

TCP/IP五层协议栈(1)

1.应用层协议 应用层协议相对来说比较简单,因为其他层的协议属于硬件上的.相对程序员来说已经固定了.不需要自己设计和实现了. 设计应用层协议有两个要点 要约定好传输的数据还要约定好数据的格式 1.1.协议模板 虽说可以自己设计,不过当前已经有很多模板被大佬设计好了.这…

51单片机语音进店迎宾器统计进店人数可定制播报铃声(可选PCB)

实践制作DIY- GC0115-语音进店迎宾器统计进店人数 一、功能说明&#xff1a; 基于51单片机设计-语音进店迎宾器统计进店人数 功能介绍&#xff1a; 硬件组成&#xff1a;STC89C52&#xff08;AT89C51/52&#xff09;单片机串口语音播报模块2个红外对射传感器一个按键&#x…

C++不知算法系列之高精度数值处理算法

1. 前言 什么是高精度数值处理算法&#xff1f; 高精度数值指因受限于计算机硬件的制约&#xff0c;超过计算机所能存储范围的数值。既然不能存储&#xff0c;更谈不上运算。 对此类数值的加、减、乘、除运算需要提供针对性的算法方能获取到结果。此类算法的设计思路因有别于…

VMware环境配置

文章目录一、环境配置1、修改主机名&#xff0c;然后切换到root用户2、确认主机网关a.确认windows主机网关b.确认虚拟机主机网关3、修改网络配置4、设置DNS域名解析的配置文件resolv.conf。5、修改hosts文件6、重启网络服务7、验证网络服务a.虚拟机ping百度b.主机ping虚拟机二、…

vscode使用restClient实现各种http请求

vscode使用restClient实现各种http请求 一&#xff0c;安装插件 首先&#xff0c;我们要在vscode的扩展中&#xff0c;搜索rest Client&#xff0c;然后安装它&#xff0c;这里我已经安装过了。 安装后&#xff0c;我们就可以使用rest client插件进行http各种操作了。 二&a…

MySQL---权限控制和用户、角色管理详解

目录 一、MySQL用户登录 二、用户管理 三、权限控制 四、角色管理 一、MySQL用户登录 一般在本机上我们的登录命令&#xff1a; mysql -u root -p密码这里介绍命令的作用&#xff1a; -u 指定用户名 -h 指定主机地址&#xff08;默认为localhost&#xff09; -p 指定用…

CHRONY - 时钟同步

一、同步公网时间源 安装chrony: yum install chrony -y 查看chrony的重要配置文件:rpm -ql chrony 修改chrony配置文件: vim /etc/chrony.conf 查看修改了的配置文件 egrep -v "^#|^$" /etc/chrony.conf

Baklib知识库|为什么知识共享工具对减少内部知识缺口至关重要

你的企业是否存在知识缺口&#xff1f; 知识缺口——没有对关键知识进行研究和记录&#xff0c;以有效地传播信息&#xff0c;并教育企业内外的用户——可能是寻求生产率最大化并最终实现利润增长的公司的一个关键缺陷。知识&#xff08;或数据、关键信息等&#xff09;是你的…