所需maven依赖
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
1.配置文件:
使用前要先去开启POP3/SMTP服务,这里我用的是qq邮箱,操作如下:
开启这个服务之后,会生成一个授权码。记住这个授权码。
配置application.properties:
#邮件发送邮箱地址
spring.mail.username=你的邮箱地址
#邮箱授权码或密码
spring.mail.password=你的授权码(或者密码)
#服务主机(这里我使用的是qq邮箱)
spring.mail.host=smtp.qq.com
2.开启异步功能
在主程序类加上@EnableAsync,这样就可以使用异步方法了
3.创建发送邮件服务
EmailService:
public interface EmailService {
String sentSimpleMailMessage(String mailPath);
}
EmailServiceImpl:
@Service("emailService")
public class EmailServiceImpl implements EmailService{
@Autowired
JavaMailSenderImpl javaMailSender;
@Value("${spring.mail.username}")
private String sentMailPath;
@Async //设置为异步方法
//发送简单邮件
public String sentSimpleMailMessage(String mailPath){
//创建一个简单的邮件
SimpleMailMessage message=new SimpleMailMessage();
//设置发出邮件地址
message.setFrom(sentMailPath);
//设置接收邮件地址
message.setTo(mailPath);
//随机生成一个六位的验证码
String code = RandomStringUtils.random(6, "0123456789");
message.setText("您的验证码是:"+code);
message.setSubject("验证码信息");
javaMailSender.send(message);
System.out.println("发送完成");
return "发送完毕";
}
@Async //设置为异步方法
//发送复杂邮件
public String sent(String mailPath) throws MessagingException {
//创建一个复杂的邮件
MimeMessage mimemessage=javaMailSender.createMimeMessage();
//创建 MimeMessageHelper,设置能够解析html
MimeMessageHelper helper=new MimeMessageHelper(mimemessage,true);
helper.setFrom(sentMailPath);
helper.setTo(mailPath);
//插入html语句
helper.setText("<p style='color: red'>你好啊</p> ",true);
//添加附件
helper.addAttachment("art.jpg",new File("images/art.jpg"));
javaMailSender.send(mimemessage);
return "发送完毕";
}
}
4.创建测试controller和页面
EmailController:
@Controller
public class EmailController {
@Autowired
private EmailService emailService;
@RequestMapping("/")
public String to(){
return "test";
}
@ResponseBody
@RequestMapping("/sent")
public String sent(String mailPath){
emailService.sentSimpleMailMessage(mailPath);
System.out.println("已经发送");
return "信息已发送,请稍等。";
}
}
test.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/sent" method="post">
请输入邮箱:<input type="text" name="mailPath"><br>
<input type="submit" value="发送验证码">
</form>
</body>
</html>
5.测试:
输入要接收的邮件的地址,点击发送。
成功接收。
再看一下控制台输出:
这里EmailController的sent()方法,在sentSimpleMailMessage()方法输出“发送完成”之前,就输出了“已经发送”,说明是异步进行的。