美文网首页Spring Cloud
SpringBoot:网站的邮件发送与异步任务

SpringBoot:网站的邮件发送与异步任务

作者: 掌灬纹 | 来源:发表于2020-11-25 17:06 被阅读0次

    前言:网站的异步任务常常应用在耗时的请求中,像邮件发送这种需要网络请求的都属于耗时任务,应当开启多线程处理而不是让客户等待---最终目的实现个人网站的异步发送邮件效果

    1.准备工作SpringBoot项目

    • 导入相关启动器 web,thymeleaf,mail...
       <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
            <dependency>
                <groupId>org.thymeleaf.extras</groupId>
                <artifactId>thymeleaf-extras-java8time</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!--邮件发送-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-mail</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
    

    2.配置SpringBoot mail相关属性

    spring.mail.username=xxxxx 邮箱
    spring.mail.password=xxxxxxx 开启POP3/SMTP服务 密码
    spring.mail.host=smtp.qq.com
    
    #开启加密验证
    spring.mail.properties.mail.smtp.enable=true
    

    3.测试发送邮件的相关接口

    • 自动装配获取 JavaMailSenderImpl实例
    • 尝试发送简单邮件
    • 尝试方法带附件和富文本的复杂邮件
      @Autowired
        JavaMailSenderImpl mailSender;
        @Test
        void contextLoads() {
    
            SimpleMailMessage mailMessage = new SimpleMailMessage();
    
            // 主题
            mailMessage.setSubject("你好呀");
    
            // 内容
            mailMessage.setText("Java从入门到精通");
    
            // 收件人
            mailMessage.setTo("邮箱");
    
            // 发送人
            mailMessage.setFrom("邮箱");
            mailSender.send(mailMessage);
        }
    
        @Test
        public void mailF() throws MessagingException {
            // 复杂的邮件
            MimeMessage mimeMessage = mailSender.createMimeMessage();
    
            // 组装
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);
    
            helper.setSubject("xxx你好~");
            helper.setText("<h3 style=\"color: cyan\">Hello HT</h3>",true);
    
            // 添加附件
            helper.addAttachment("1.jpg",new File("C:\\Users\\lenovo\\Desktop\\截图\\1.jpg"));
    
            // 收件人
            helper.setTo("邮箱");
    
            // 发送人
            helper.setFrom("邮箱");
    
            mailSender.send(mimeMessage);
    
        }
    

    4.重构自己的邮件服务类(可直接拷贝用于自己的项目中)

    @Service
    public class SendMailService {
    
        @Autowired
        JavaMailSenderImpl mailSender;
    
        /**
         * 重构的邮件发送方法
         * @param multipartOpen 是否开启复杂邮件支持:如果为true 支持备选文本,行内元素和附件
         * @param subject 邮件主题
         * @param hText 邮件内容 富文本或文本
         * @param htmlOpean 内容支持富文本识别
         * @param attachmentFileName 附件名
         * @param pathname 附件路径
         * @param from 发送者
         * @param to 收件者
         * @throws MessagingException
         */
        public void sendmimeMail(Boolean multipartOpen,String subject,String hText,Boolean htmlOpean,
                             String attachmentFileName,String pathname,String from,String to)
                throws MessagingException {
            // 复杂的邮件
            MimeMessage mimeMessage = mailSender.createMimeMessage();
            // 组装
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,multipartOpen);
            helper.setSubject(subject);
            helper.setText(hText,htmlOpean);
            // 添加附件
            helper.addAttachment(attachmentFileName,new File(pathname));
            // 发送人
            helper.setFrom(from);
            // 收件人
            helper.setTo(to);
            mailSender.send(mimeMessage);
        }
    
    
        /**
         * 发送简单邮件
         * @param subject 主题
         * @param text 文本
         * @param from 发送者
         * @param to 收件人
         */
        public void sendMailMessage(String subject,String text,String from,String to){
            SimpleMailMessage mailMessage = new SimpleMailMessage();
            // 主题
            mailMessage.setSubject(subject);
            // 内容
            mailMessage.setText(text);
            // 发送人
            mailMessage.setFrom(from);
            // 收件人
            mailMessage.setTo(to);
    
            mailSender.send(mailMessage);
        }
    }
    
    

    5.简单的前端页面准备(BootStrap组件)

        <div style="position: center">
            <form th:action="@{/mail/send}">
                <div class="form-group">
                    <label for="from">发件人(邮箱)</label>
                    <input type="text" class="form-control" name="from" id="from" placeholder="Email">
                </div>
                <div class="form-group">
                    <label for="to">收件人(邮箱)</label>
                    <input type="text" class="form-control" name="to" id="to" placeholder="Email">
                </div>
    
                <div class="form-group">
                    <label for="subject">邮件主题: </label>
                    <input type="text" class="form-control" name="subject" id="subject" placeholder="主题...">
                </div>
    
                <div class="form-group">
                    <label for="text">邮件内容:</label>
                    <textarea class="form-control" id="text" name="text" rows="10"></textarea>
                </div>
                <div class="form-group">
                    <label for="exampleInputFile">附件</label>
                    <input type="file" id="exampleInputFile">
                    <p class="help-block">Example block-level help text here.</p>
                </div>
    
                <div class="checkbox">
                    <label>
                        <input type="checkbox" name="multipartOpen" value="open"> 上传附件
                    </label>
                </div>
    
                <button type="submit" class="btn btn-primary">发送邮件</button>
            </form>
        </div>
    

    6.发送邮件相关Controller

    • 注入邮件服务实例
    • 响应表单发送邮件请求
    @Controller
    @RequestMapping("/mail")
    public class SendMailController {
        @Autowired
        SendMailService mailService;
    
        @ResponseBody
        @RequestMapping("/send")
        public String sendMail(@RequestParam("from") String from,
                               @RequestParam("to") String to,
                               @RequestParam("subject") String subject,
                               @RequestParam("text") String text,
                               HttpServletRequest request){
            String open = request.getParameter("multipartOpen");
    
            if (null != open){
               // mailService.sendmimeMail(multipartOpen);
                System.out.println(open);
            }else {
                // 简单邮件处理
                mailService.sendMailMessage(subject, text, from, to);
            }
    
            return "Send Email OK!";
        }
    }
    

    7.展示效果

    编写邮件 发送成功

    8.聊聊异步任务与实现

    • 异步任务的本质:调用线程池,多线程后台处理任务

    • 优势:在处理耗时任务时,可让用户先做其它请求而非等待

    • SpringBoot处理异步任务很简单:
      1.注解标记任务为异步 @Async 2. 开启异步任务处理@EnableAsync // 开启异步任务

    • 标记异步处理任务,调用时自动开启多线程

     @Async
        public void sendmimeMail(Boolean multipartOpen,String subject,String hText,Boolean htmlOpean,
                             String attachmentFileName,String pathname,String from,String to)
                throws MessagingException {
            // 复杂的邮件
            MimeMessage mimeMessage = mailSender.createMimeMessage();
            // 组装
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,multipartOpen);
            helper.setSubject(subject);
            helper.setText(hText,htmlOpean);
            // 添加附件
            helper.addAttachment(attachmentFileName,new File(pathname));
            // 发送人
            helper.setFrom(from);
            // 收件人
            helper.setTo(to);
            mailSender.send(mimeMessage);
        }
    
    
        /**
         * 发送简单邮件
         * @param subject 主题
         * @param text 文本
         * @param from 发送者
         * @param to 收件人
         */
        @Async
        public void sendMailMessage(String subject,String text,String from,String to){
            SimpleMailMessage mailMessage = new SimpleMailMessage();
            // 主题
            mailMessage.setSubject(subject);
            // 内容
            mailMessage.setText(text);
            // 发送人
            mailMessage.setFrom(from);
            // 收件人
            mailMessage.setTo(to);
    
            mailSender.send(mailMessage);
        }
    
    • 主函数入口处开启异步处理
    @EnableAsync // 开启异步任务
    @SpringBootApplication
    public class SpringbootSwaggerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringbootSwaggerApplication.class, args);
        }
    
    }
    

    9.体验异步邮件发送

                System.out.println("开始异步发送邮件...");
                mailService.sendMailMessage(subject, text, from, to);
                System.out.println("发送成功!");
    
    • 在发送过程中可以随意访问网站,如同瞬间发送完成

    相关文章

      网友评论

        本文标题:SpringBoot:网站的邮件发送与异步任务

        本文链接:https://www.haomeiwen.com/subject/bpuniktx.html