0
点赞
收藏
分享

微信扫一扫

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

酷子腿长一米八 2021-09-21 阅读 65

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("发送成功!");
  • 在发送过程中可以随意访问网站,如同瞬间发送完成
举报

相关推荐

0 条评论