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


    前言

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

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

    环境配置

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

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

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

    集成

    maven:

    
        io.quarkus
        quarkus-mailer
    
    
        com.alibaba
        easyexcel
        3.1.2
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    项目中增加 以下以来,因为我们需要进行操作表格,所以我这里加入了阿里的表格工具类: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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    引入 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 list) {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        EasyExcel.write(outputStream, User.class).sheet("测试").doWrite(list);
        return outputStream.toByteArray();
    }
    
    
    private List getUsers() {
        List 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    启动应用服务访问: 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 list) {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        EasyExcel.write(outputStream, User.class).sheet("测试").doWrite(list);
        return outputStream.toByteArray();
    }
    
    
    private List data() {
        List 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

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

    遇到的问题

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

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

  • 相关阅读:
    Java Objects类中的 equals方法分析
    【华为机试真题 JAVA】找出符合要求的字符串子串-100
    《NFT区块链进阶指南二》Etherscan验证Solidity智能合约(Remix插件验证)
    1500*C. Kefa and Park(dfs&tree)
    国内项目管理中级证书CSPM-3正在报名!
    “再谈”协议
    设置按键中断,按键1按下,LED亮,再按一次,灭按键2按下,蜂鸣器响。再按一次,不响按键3按下,风扇转,再按一次,风扇停
    uView Collapse 折叠面板
    2023-mac brew安装python最新版本,遇见的问题和处理方式
    ubuntu 安装redis详细教程
  • 原文地址:https://blog.csdn.net/qq_41971087/article/details/128034686