• javamail——邮件发送


    最近都在熟悉先前学习的一系列知识,感觉需要加强巩固。
    最近实现了邮件发送的业务,这是我的记录。

    分析

    javamail是用来发送邮件的。我们在代码里操作他来实现邮件发送。
    我们使用qq邮箱作为案例

    设置

    首先,我们需要去qq邮箱里面开smtp服务,具体的操作看这里qq邮箱smtp服务开通
    然后,我们需要先在pom中添加依赖

    
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-mailartifactId>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    然后,我们需要在application.yml中配置smtp(这里由于想好要部署到服务器上所以预先设置好了smtps,本地照样可用)

    # java mail
      mail:
        host: smtp.qq.com
        protocol: smtps
        username: 你的/你公司的邮箱地址@qq.com
        password: 去邮箱获取
        port: 465
        properties:
          mail:
            smtp:
              socketFactort:
                port: 465
                class: javax.net.ssl.SSLSocketFactory
                fallback: false
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    我们将使用R作为结果集响应,并使用MailFileDTO作为data传回的数据的javabean:

    R

    package cn.calendo.common;
    
    import lombok.Data;
    
    import java.io.Serializable;
    import java.util.Date;
    
    /**
     * 前后端协议联调 结果集R
     */
    @Data
    public class R<T> implements Serializable {
        /**
         * 状态码
         * 200: 成功
         * 400: 请求语法错误
         * 403: 服务器拒绝请求
         * 404: 服务器未响应
         * 500: 服务器内部错误
         */
        private Integer code;
        /**
         * 返回信息
         */
        private String msg;
        /**
         * 返回时间戳
         */
        private Date timestamp;
        /**
         * 返回的数据
         */
        private T data;
    
        /**
         * 响应成功
         *
         * @param code      状态码 200: 成功
         * @param object    任意对象
         * @param timestamp 时间戳
         * @param        返回类型任意
         * @return R结果集
         */
        public static <T> R<T> success(Integer code, Date timestamp, T object) {
            R<T> r = new R<T>();
            r.code = code;
            r.timestamp = timestamp;
            r.data = object;
            return r;
        }
    
        /**
         * 响应成功
         *
         * @param code      状态码 200: 成功
         * @param msg       返回的消息
         * @param timestamp 时间戳
         * @param        返回类型任意
         * @return R结果集
         */
        public static <T> R<T> success(Integer code, String msg, Date timestamp) {
            R<T> r = new R<T>();
            r.code = code;
            r.msg = msg;
            r.timestamp = timestamp;
            return r;
        }
    
        /**
         * 响应成功
         *
         * @param code      状态码 200: 成功
         * @param msg       返回的消息
         * @param timestamp 时间戳
         * @param object    返回的数据
         * @param        返回类型任意
         * @return R结果集
         */
        public static <T> R<T> success(Integer code, String msg, Date timestamp, T object) {
            R<T> r = new R<T>();
            r.code = code;
            r.msg = msg;
            r.timestamp = timestamp;
            r.data = object;
            return r;
        }
    
        /**
         * 响应失败
         *
         * @param code      状态码 400: 请求语法错误 403: 服务器拒绝请求 404: 服务器未响应 500: 服务器内部错误
         * @param msg       返回给前端的错误信息
         * @param timestamp 时间戳
         * @param        返回类型任意返回类型任意
         * @return R结果集
         */
        public static <T> R<T> error(Integer code, String msg, Date timestamp) {
            R<T> r = new R<>();
            r.code = code;
            r.msg = msg;
            r.timestamp = timestamp;
            return r;
        }
    
        /**
         * 响应失败
         *
         * @param code      状态码 400: 请求语法错误 403: 服务器拒绝请求 404: 服务器未响应 500: 服务器内部错误
         * @param msg       返回给前端的错误信息
         * @param timestamp 时间戳
         * @param object    任意对象
         * @param        返回类型任意返回类型任意
         * @return R结果集
         */
        public static <T> R<T> error(Integer code, String msg, Date timestamp, T object) {
            R<T> r = new R<>();
            r.code = code;
            r.msg = msg;
            r.timestamp = timestamp;
            r.data = object;
            return r;
        }
    
    }
    
    
    • 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
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125

    MailFileDTO

    package cn.calendo.dto.fileDTO;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    /**
     * 邮件文件dto
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class MailFileDTO {
        /**
         * 文件名(业务层设为原始文件名)
         */
        private String fileName;
        /**
         * 是否为空(true:空;false:非空)
         */
        private boolean isEmpty;
        /**
         * 文件大小(B)
         */
        private long fileSize;
    }
    
    • 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

    使用

    首先我们需要知道,一个邮件由发送者from,接收者to,抄送cc,密送bcc,主题subject,正文text组成,更多的例如上传的文件file,而在javamail中,需要我们传入的参数也是这些。
    而发送不同格式的邮件是有不同的操作的,但是被操作对象只有一个:javaMailSender,因此,我们首先去建一个业务类,将其自动装配进来

    @Autowired
    private JavaMailSender javaMailSender;
    
    • 1
    • 2

    然后,我们先实现一个简单类型的邮件发送功能。

    public R sendSimpleMail(String from, String to, String cc, String bcc, String subject, String text) {
    	return R.success(200, "发送成功", new Date());
    }
    
    • 1
    • 2
    • 3

    我们需要知道,当JavaMailSender 注入后,我们可以new一个SimpleMailMessage

    SimpleMailMessage message = new SimpleMailMessage();
    
    • 1

    接下来再设置传进来的请求参数

    message.setFrom(from);
            message.setTo(to);
            //抄送可以不填
            if (cc != null) {
                message.setCc(cc);
            }
            //密送可以不填
            if (bcc != null) {
                message.setBcc(bcc);
            }
            message.setSubject(subject);
            message.setText(text);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    最后,sender来发送即可

    javaMailSender.send(message);
    
    • 1

    简单邮件代码

    @Autowired
        private JavaMailSender javaMailSender;
    
        /**
         * 简单邮件发送
         *
         * @param from    发送者
         * @param to      接收者(多人用,隔开)
         * @param cc      抄送
         * @param bcc     密送
         * @param subject 邮件主题
         * @param text    邮件内容
         * @return R对象
         */
        @Override
        public R sendSimpleMail(String from, String to, String cc, String bcc, String subject, String text) {
            SimpleMailMessage message = new SimpleMailMessage();
            message.setFrom(from);
            message.setTo(to);
            if (cc != null) {
                message.setCc(cc);
            }
            if (bcc != null) {
                message.setBcc(bcc);
            }
            message.setSubject(subject);
            message.setText(text);
            javaMailSender.send(message);
            return R.success(200, "发送成功", new Date());
        }
    
    • 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

    由于我们是前端设置了请求,所以我们需要编写控制层

    
    /**
     * 邮件发送测试控制层,以test开头
     */
    @RestController
    @RequestMapping("/test/mail")
    public class Mail {
    
        @Autowired
        private IMailService mailService;
    
        /**
         * 简单邮件发送
         *
         * @param from    发送者
         * @param to      接收者(多人用,隔开)
         * @param cc      抄送
         * @param bcc     密送
         * @param subject 邮件主题
         * @param text    邮件内容
         * @return R对象
         */
        @PostMapping("/send_simple_mail")
        public R sendSimpleMail(@RequestParam(value = "from") String from,
                                @RequestParam(value = "to") String to,
                                @RequestParam(value = "cc", required = false) String cc,
                                @RequestParam(value = "bcc", required = false) String bcc,
                                @RequestParam(value = "subject") String subject,
                                @RequestParam(value = "text") String text) {
            return mailService.sendSimpleMail(from, to, cc, bcc, subject, text);
        }
    }
    
    • 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

    接下来,我们去postman里面测试一波
    在这里插入图片描述
    也确实收到了
    在这里插入图片描述

    至此,简单邮件传输完成。

    链接邮件

    链接邮件是可以在正文里面写html代码的,也就是说,可以生成链接,图片等
    与上面一样,需要编写控制层与业务层

    控制层

    
        /**
         * 链接邮件发送(支持多人接收)
         *
         * @param from    发送者
         * @param to      接收者(多人用,隔开)
         * @param cc      抄送
         * @param bcc     密送
         * @param subject 邮件主题
         * @param text    邮件内容(动态链接在内)
         * @return R对象
         */
        @PostMapping("/send_link_mail")
        public R sendLinkMail(@RequestParam(value = "from") String from,
                              @RequestParam(value = "to") String to,
                              @RequestParam(value = "cc", required = false) String cc,
                              @RequestParam(value = "bcc", required = false) String bcc,
                              @RequestParam(value = "subject") String subject,
                              @RequestParam(value = "text") String text) {
            return mailService.sendLinkMail(from, to, cc, bcc, subject, text);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    然后我们需要注意的是我们要通过注入的sender来生成一个mimeMessage进行助理发送

    
        /**
         * 链接邮件发送(支持多人接收)
         *
         * @param from    发送者
         * @param to      接收者(多人用,隔开)
         * @param cc      抄送
         * @param bcc     密送
         * @param subject 邮件主题
         * @param text    邮件内容(动态链接在内)
         * @return R对象
         */
        @Override
        public R sendLinkMail(String from, String to, String cc, String bcc, String subject, String text) {
            try {
                MimeMessage mimeMessage = javaMailSender.createMimeMessage();
                MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);
                message.setFrom(from);
                message.setTo(to);
                if (cc != null) {
                    message.setCc(cc);
                }
                if (bcc != null) {
                    message.setBcc(bcc);
                }
                message.setSubject(subject);
                message.setText(text);
                javaMailSender.send(mimeMessage);
            } catch (MessagingException e) {
                e.printStackTrace();
                return R.error(500, "发送失败", new Date());
            }
            return R.success(200, "发送成功", new Date());
        }
    
    • 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

    文件邮件

    首先,我们都知道,上传与下载文件,都是通过MultipartFile格式进行的,这里也不例外

    控制层

    
        /**
         * 单文件邮件发送
         *
         * @param from    发送者
         * @param to      接收者(多人用,隔开)
         * @param cc      抄送
         * @param bcc     密送
         * @param subject 邮件主题
         * @param text    邮件内容
         * @param file    单文件
         * @return R对象
         */
        @PostMapping("/send_file_mail")
        public R sendFileMail(@RequestParam(value = "from") String from,
                              @RequestParam(value = "to") String to,
                              @RequestParam(value = "cc", required = false) String cc,
                              @RequestParam(value = "bcc", required = false) String bcc,
                              @RequestParam(value = "subject") String subject,
                              @RequestParam(value = "text", required = false) String text,
                              @RequestParam(value = "file") MultipartFile file) {
            return mailService.sendFileMail(from, to, cc, bcc, subject, text, file);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    业务层

    与链接邮件一样,需要使用助理去发送邮件
    在业务层内我们使用先前写好的dto进行装载返回对象

    /**
         * 单文件邮件发送
         *
         * @param from    发送者
         * @param to      接收者(多人用,隔开)
         * @param cc      抄送
         * @param bcc     密送
         * @param subject 邮件主题
         * @param text    邮件内容
         * @param file    单文件
         * @return R对象
         */
        @Override
        public R sendFileMail(String from, String to, String cc, String bcc, String subject, String text, MultipartFile file) {
            MailFileDTO mailFileDTO = new MailFileDTO();
            try {
                MimeMessage mimeMessage = javaMailSender.createMimeMessage();
                MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);
                message.setFrom(from);
                message.setTo(to);
                if (cc != null) {
                    message.setCc(cc);
                }
                if (bcc != null) {
                    message.setBcc(bcc);
                }
                message.setSubject(subject);
                message.setText(text);
                message.addAttachment(file.getName(), file);
                //装载dto
                mailFileDTO.setFileName(file.getOriginalFilename());//获取原始文件名
                mailFileDTO.setEmpty(file.isEmpty());//判断是否为空
                mailFileDTO.setFileSize(file.getSize());//获取文件大小
                javaMailSender.send(mimeMessage);
            } catch (MessagingException e) {
                e.printStackTrace();
                return R.error(500, "发送失败", new Date());
            }
            return R.success(200, "发送成功", new Date(), mailFileDTO);
        }
    
    • 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

    测试

    我们在postman里面测试时需要添加请求头
    在这里插入图片描述在请求体内添加文件
    在这里插入图片描述
    返回即是json
    在这里插入图片描述

    总结

    如果你想用简单的邮件发送的话,就直接这样即可

    SimpleMailMessage message = new SimpleMailMessage();
    message.setFrom(from);
            message.setTo(to);
                message.setCc(cc);
                message.setBcc(bcc);
            message.setSubject(subject);
            message.setText(text);
    javaMailSender.send(message);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    若你想发送文件或者链接,就这样

    try {
                MimeMessage mimeMessage = javaMailSender.createMimeMessage();
                MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);
                message.setFrom(from);
                message.setTo(to);
                message.setSubject(subject);
                message.setText(text);
                message.addAttachment(file.getName(), file);
                } catch (MessagingException e) {
                e.printStackTrace();
                return R.error(500, "发送失败", new Date());
    }
            return R.success(200, "发送成功", new Date(), mailFileDTO);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    整理的最新版的K8S安装教程,看完还不会,请你吃瓜
    Qt 数据库的注册和登录功能
    动态规划篇——线性DP
    java内存泄漏和内存溢出oom排查思路
    git常用操作
    电源差异。
    Python找不到其他文件夹下的py文件并提示ModuleNotFoundError: No module named ‘xxx‘
    一键生成PDF即刻呈现:轻松创建无忧体验
    Ajax和axios基础
    面试题-React(十九):React Hook
  • 原文地址:https://blog.csdn.net/qq_52480906/article/details/127731623