完整目录结构
第一步:依赖
邮箱的依赖主要是
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
其它资源可以根据自己情况修改,不需要可以删除
在这里插入代码片
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<!--邮件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!--邮件-->
<!--junit单元测试 start-->
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--junit单元测试 end-->
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mysql驱动 end-->
<!--数据源驱动-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.25</version>
</dependency>
<!-- 开发热启动 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!-- 集成redis依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--配置后redis生效-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!--数据源驱动结束-->
<!-- mybatis start-->
<!-- Swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<!-- swagger end -->
<!-- mybaits start -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<!-- mybaits end-->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
</plugins>
</build>
第二步:配置邮箱信息
邮箱是放在了yaml文件中配置的,不过这里的邮箱配置是需要授权码的,因此,需要提前获取授权码(注意,这个授权码,要好好保存)
获取授权码的方式:
可以参考我这个博客http://t.csdn.cn/0UT66
##配置服务端口
server:
port: 8888
servlet:
context-path: /app
##配置redis
# #配置邮箱
# mail:
# default-encoding: UTF-8
# host: smtp.163.com
# protocol: stmp
# username: XXX@163.com
# password: BIZDYBTTTNLDYLCG
# from: a2020940170@163.com
#
spring:
redis:
database: 0
host: 127.0.0.1
port: 6379
password:
timeout: 5000
lettuce:
pool:
enabled: true
# 连接池中的最大空闲连接,默认值也是8。
max-idle: 500
# 连接池中的最小空闲连接,默认值也是0。
min-idle: 50
# 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)
max-active: 1000
# 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException
max-wait: 2000
mail:
protocol: smtp
default-encoding: UTF-8
#配置POP3服务器,此处使用网易邮箱 如果是qq邮箱,记得更改成smtp.qq.com
host: smtp.163.com
#发送邮件的用户名(改成你自己的)及授权码,注意不是登陆密码 如果是qq邮箱,记得更改成qq的邮箱和qq的授权码
username: XXXX@163.com
password: XXXXXX
from: XXXXXX@163.com
###原因:swagger jar冲突这是因为Springfox使用的路径匹配是基于AntPathMatcher的,而Spring Boot 2.6.X使用的是PathPatternMatcher。
mvc:
pathmatch:
matching-strategy: ant_path_matcher
第三步:邮箱服务层
MailService.java代码如下:
注意:这个类需要你自己建包,我没把包路径放进来
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.concurrent.ThreadLocalRandom;
/**
* 说明
* Description: <br/>
* date: 2022/7/21 10:41<br/>
*
* @author 哎,就是玩儿<br />
* @since JDK 1.8
*/
@Service
public class MailService {
//定义邮件发送器
@Autowired
private JavaMailSender mailSender;
//定义邮件发送者
@Value("${spring.mail.from}")
private String from;
@Value("${spring.mail.username}")
private String userName;
/**
* @param to 接收者
* @param subject 主题
* @param content 内容
* @Value注解读取配置文件中同名的配置值
*/
public boolean sendSimpleMail(String to, String subject, String content) {
boolean falg = true;
String code= String.valueOf(ThreadLocalRandom.current().nextInt(100000, 1000000));
//创建一个简单文本邮件的对象
try {
SimpleMailMessage message = new SimpleMailMessage();
//赋予相应的内容
message.setTo(to);
// String username = userName;
message.setSubject(subject);
message.setText(content+code);
message.setFrom(from);
message.setSentDate(new Date());
//将邮件对象赋予邮件发送器
mailSender.send(message);
} catch (MailException e) {
falg = false;
e.printStackTrace();
}
return falg;
}
}
第四步:发送短信
这个类中用了swagger,以及自定义的返回类,你可以修改一下代码
import com.emailTest.emailtest.service.MailService;
import com.emailTest.emailtest.util.JsonResult;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
* 说明
* Description: <br/>
* date: 2022/7/21 13:55<br/>
*
* @author 哎,就是玩儿<br />
* @since JDK 1.8
*/
@RestController
@RequestMapping("login")
public class LoginController {
@Autowired
private MailService mailService;
/**
*
* @return
*/
@RequestMapping(value = "/sendEmail", method = RequestMethod.GET)
@ApiOperation(value="发送邮件", notes="发送邮件")
public JsonResult sendEmail(){
String to = "XXXX@163.com";
String subject="测试邮箱功能";
String content = "这是测试邮箱功能是否正常,请您注意查收邮箱验证码";
boolean falg = mailService.sendSimpleMail(to,subject,content);
return JsonResult.ok(falg);
}
}
如果不修改,就引入以下swagger配置类:
import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* 说明
* Description: <br/>
* date: 2022/1/20 14:23<br/>
*
* @author 哎,就是玩儿<br />
* @since JDK 1.8
*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
//是否开启 (true 开启 false隐藏。生产环境建议隐藏)
//.enable(false)
.select()
//扫描的路径包,设置basePackage会将包下的所有被@Api标记类的所有方法作为api
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
//指定路径处理PathSelectors.any()代表所有的路径
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
//设置文档标题(API名称)
.title("SpringBoot中使用Swagger2接口规范")
//文档描述
.description("接口说明")
//服务条款URL
.termsOfServiceUrl("http://localhost:8888/")
//版本号
.version("1.0.0")
.build();
}
}
顺便,把自定义的返回类也放上去吧:
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.lang.Nullable;
/**
* 说明
* Description: <br/>
* date: 2022/7/21 13:57<br/>
* 自定义返回值
* @author 哎,就是玩儿<br />
* @since JDK 1.8
*/
@Data
@AllArgsConstructor
public class JsonResult {
public Integer code;
public Boolean status;
public String message;
public Object data;
private JsonResult(){}
public static JsonResult ok(Object param){
return new JsonResult(
ResultEnum.OK.getCode(),
ResultEnum.OK.getSuccess(),
ResultEnum.OK.getMessage(),
param
);
}
public static JsonResult err(@Nullable String message){
return new JsonResult(
ResultEnum.NOT_FOUND.getCode(),
ResultEnum.NOT_FOUND.getSuccess(),
message != null ? message : ResultEnum.NOT_FOUND.getMessage(),
null
);
}
}
引入的枚举类:
import lombok.Getter;
/**
* 说明
* Description: <br/>
* date: 2022/7/21 14:06<br/>
* 只需要getter即可
* @author 哎,就是玩儿<br />
* @since JDK 1.8
*/
@Getter
public enum ResultEnum {
OK(true,200,"请求成功"),
NOT_FOUND(false,404,"资源不存在");
private Boolean success;
private Integer code;
private String message;
ResultEnum(boolean success,Integer code,String message){
this.success = success;
this.code = code;
this.message = message;
}
}