springboot实现邮件发送、异步功能

邮件发送

创建一个springboot项目

用IDEA创建springboot项目。

之后可以一直next,依赖之后说。

添加依赖

打开pom.xml,添加如下依赖:

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

修改配置文件

打开application.properties,添加如下内容:

1
2
3
4
5
6
7
// 网易邮箱测试
spring.mail.username=xxxxxx@163.com
spring.mail.password=网易账号授权码
spring.mail.host=smtp.163.com

// 如果是QQ邮箱,则需要加一行,网易邮箱不用
##spring.mail.properties.mail.smtp.ssl.enable=true // 开启加密验证

关于授权码,注意不是你的邮箱密码,位置如下所示。

只要选择开启之后发个短信即可获取。

测试类

首先在测试类要注入JavaMailSenderImpl

1
2
@Autowired
private JavaMailSenderImpl mailSender;

运行测试类进行邮件发送

1
2
3
4
5
6
7
8
9
@Test
void contextLoads() {
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setSubject("主题");
simpleMailMessage.setText("内容");
simpleMailMessage.setFrom("xxxxxx@163.com"); // 发件人邮箱
simpleMailMessage.setTo("xxxxxx@163.com"); // 收件人邮箱
mailSender.send(simpleMailMessage);
}

或许你可能一次成功,或许你失败了,失败的原因80%都是这个。

1
org.springframework.mail.MailAuthenticationException: Authentication failed; nested exception is javax.mail.AuthenticationFailedException: 535 Error: xxxxxxx: http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256

说明你的授权码不对,那就再试试吧。

到这一步,你已经实现了一封由springboot发送的邮件。


实现异步

需要提前添加web依赖。

修改启动类

添加@EnableAsync注解,开启异步操作

1
2
3
4
5
6
7
@EnableAsync // 开启异步操作
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}

创建Controller层和Service层

Service层

创建一个AsyncService类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package Service;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class AsyncService {
@Async // Spring看到这个就知道是一个异步操作了
public void async() {
try {
Thread.sleep(10000); // 停止10秒
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("数据正在处理");
}
}

Controller层 创建一个AsyncController类: 页面访问,当我们请求服务器时,遇到线程方法会停止10秒。

随便玩玩,不要求获取方式了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package Controller;

import Service.AsyncService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class AsyncController {
@Autowired
AsyncService asyncService;

@RequestMapping("/async")
public String async() {
asyncService.async();
return "yes";
}
}

添加@Async注解,实现异步操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package Controller;

import Service.AsyncService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class AsyncController {
@Autowired
AsyncService asyncService;

@Async
@RequestMapping("/async")
public String async() {
asyncService.async();
return "yes";
}
}

本文作者:jujimeizuo
本文地址https://blog.jujimeizuo.cn/2021/02/17/springboot-realize-mail-sending-asynchronous-function/
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0 协议。转载请注明出处!