SpringBoot 完成邮件的投递
本工程使用了SpringBoot+RabbitMQ+Dubbo+ZooKeeper技术栈
准备工作:
登录自己的开通邮件的 以163为例
单独演示邮件发送代码实现:
生成自己唯一的授权码
然后创建如下工程
email-servcie:负责发送邮件相关
user-api:存放项目的公共代码
user-consumer:存放controller层,用于调用service相关方法
user-service:生产者提供接口给消费者user-consumer调用
父工程的pom.xml
<modules>
<module>user-consumer</module>
<module>user-service</module>
<module>user-api</module>
</modules>
编写email-service
工程结构如下
在pom.xml中引入spring-boot-starter-amqp和spring-boot-starter-mail的依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.itheima</groupId>
<artifactId>email-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>email-service</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
在application.yml配置文件中配置
server:
port: 8082
spring:
application:
name: mqemail
mail:
username: xxxx@163.com
password: XXXXXXXXXXXXXXX
host: smtp.163.com
properties:
mail:
smtp:
ssl:
enable: true
#配置mq
rabbitmq:
virtual-host: email
username: guest
password: guest
addresses: 127.0.0.1:5672
编写发送邮件类SendEmail 完成邮件发送
@Component
public class SendEmail {
@Resource
private JavaMailSenderImpl javaMailSender;
@Value("${spring.mail.username}")
private String sender;
public void sendEmail(String email) {
try {
SimpleMailMessage message = new SimpleMailMessage();
message.setSubject("帅哥认证官方");
message.setText("你好,你是官方认证的大帅哥!");
message.setTo(email);
message.setFrom(sender);
javaMailSender.send(message);
} catch (MailException e) {
e.printStackTrace();
}
}
}
编写测试类EmailController,测试邮件是否能发送成功
@RestController
public class EmailController {
@Resource
private SendEmail sendEmail;
@GetMapping("/sendEmail/{email}")
public String sendEmail(@PathVariable("email") String email){
sendEmail.sendEmail(email);
return "ok";
}
启动EmailServiceApplication类,在浏览器中输入:http://localhost:8082/sendEmail/邮箱号
说明邮件发送成功!
然后再mq包中编写EmailConsumer类,监听mq队列
@Component
public class EmailConsumer {
@Resource
private SendEmail sendEmail;
@RabbitListener(queues = "email_queue")
public void reveice(String email){
sendEmail.sendEmail(email);
System.out.printf("已发送到%s邮箱",email);
}
}
此时email-service模块编写完毕。
编写user-api
此模块用于存放项目的公共类
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>04usermanager_email</artifactId>
<groupId>com.itheima</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>user-api</artifactId>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mybatis-plus 启动器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<!--mybatis-plus依赖包-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.3.2</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--光速连接池-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!--<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
</project>
在application.yml配置文件中配置数据源和mybatis-plus配置
spring:
#配置数据源
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/heimassm?characterEncoding=utf-8&serverTimezone=UTC
data-username: root
data-password: 123456
#mybatis-plus
mybatis-plus:
type-aliases-package: com.itheima.pojo
configuration:
# 数据库中如果有类似 如 user_name 等命名,会将 _后的字母大写,这里是为了和实体类对应
map-underscore-to-camel-case: true
创建表的SQL语句
CREATE TABLE `sp_day01_tb_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_name` varchar(100) DEFAULT NULL COMMENT '用户名',
`password` varchar(100) DEFAULT NULL COMMENT '密码',
`name` varchar(100) DEFAULT NULL COMMENT '姓名',
`age` int(10) DEFAULT NULL COMMENT '年龄',
`sex` tinyint(1) DEFAULT NULL COMMENT '性别,1男性,2女性',
`birthday` date DEFAULT NULL COMMENT '出生日期',
`email` varchar(100) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8
User.java
package com.itheima.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
@Data
//实体类和表建立映射关系
@TableName(value = "sp_day01_tb_user")
public class User implements Serializable {
@TableId(value = "id",type = IdType.AUTO)
private Long id;
// 用户名
private String userName;
// 密码
private String password;
// 姓名
private String name;
// 年龄
private Integer age;
// 性别,1男性,2女性
private Integer sex;
// 出生日期
private String birthday;
// 邮箱
private String email;
}
UserService.java
public interface UserService extends IService<User> {
boolean register(User user);
}
编写user-service
模块结构如下:
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.itheima</groupId>
<artifactId>user-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>user-service</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.itheima</groupId>
<artifactId>user-api</artifactId>
<version>1.0-SNAPSHOT</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-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!--mybatis-plus 启动器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<!--mybatis-plus依赖包-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.3.2</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--光速连接池-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--springboot 整合dubbo 开始 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.5</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--springboot 整合dubbo 结束-->
</dependencies>
</project>
在application.yml中配置
server:
port: 8081 # 修改 服务tomcat默认端口号
spring:
#配置数据源
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/heimassm?characterEncoding=utf-8&serverTimezone=UTC
data-username: root
data-password: 123456
#配置项目热部署
devtools:
restart:
enabled: true
#配置mq
rabbitmq:
virtual-host: email
username: guest
password: guest
addresses: 127.0.0.1:5672
dubbo:
application:
name: service
registry:
address: zookeeper://127.0.0.1:2181
protocol:
name: dubbo
port: 20880
scan:
base-packages: com.itheima.service.impl
UserMapper.java
public interface UserMapper extends BaseMapper<User> {
}
UserServiceImpl.java:
Spring为AMQP提供了统一的消息处理模板:AmqpTemplate,非常方便的发送消息,其发送方法:convertAndSend()
第一个参数是交换机名称
第二个参数是路由规则名
第三个参数是要发送的数据
@Service
@Transactional
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
private UserMapper userMapper;
@Override
public boolean register(User user) {
this.save(user);
// 直接向指定的队列投递消息
rabbitTemplate.convertAndSend("emailExchange","email",user.getEmail());
return true;
}
}
需要在UserServiceApplication启动类中,扫描Mapper所在的包
@SpringBootApplication
@MapperScan(basePackages = "com.itheima.mapper")
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
编写user-consumer
模块结构如下:
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.itheima</groupId>
<artifactId>user-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>user-consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--引入上述api模块坐标-->
<dependency>
<groupId>com.itheima</groupId>
<artifactId>user-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mybatis-plus 启动器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<!--mybatis-plus依赖包-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!--springboot 整合dubbo 开始 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.5</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--springboot 整合dubbo 结束-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!--SpringBoot热部署配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!--<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
</project>
application.yml
server:
port: 8088 # 修改 服务tomcat默认端口号
spring:
#配置数据源
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/heimassm?characterEncoding=utf-8&serverTimezone=UTC
data-username: root
data-password: 123456
#配置项目热部署
devtools:
restart:
enabled: true
#配置日志
logging:
level:
com.itheima: debug # 日志级别 debug
#mybatis-plus
mybatis-plus:
configuration:
# sql日志显示,这里使用标准显示
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
dubbo:
application:
name: consumer
registry:
address: zookeeper://127.0.0.1:2181
consumer:
check: false
UserController.java
@RestController
@RequestMapping("/user")
public class UserController {
@Reference
private UserService userService;
@PostMapping("register")
public void register(User user){
//入库,并发送邮件
userService.register(user);
System.out.println("入库操作...");
System.out.println("发送提示邮件给用户");
}
}
此时项目代码编写完毕
打开http://localhost:15672/#/users/guest这个rabbitmq管理,创建如上图
- 创建email虚拟机
- 常见email_queue队列
- 创建emailExchange交换机
- 点击emailExchange,使用路由规则:email,绑定email_queue队列
- 绑定完成
测试
- 打开zkserver.cmd服务
- 依次运行项目的3个启动类
- 打开postman测试
- 测试结果
SQL表中添加了这条数据,并且也收到了邮件