0
点赞
收藏
分享

微信扫一扫

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

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

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 条评论