前言:网站的异步任务常常应用在耗时的请求中,像邮件发送这种需要网络请求的都属于耗时任务,应当开启多线程处理而不是让客户等待---最终目的实现个人网站的异步发送邮件效果
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("发送成功!");
- 在发送过程中可以随意访问网站,如同瞬间发送完成
网友评论