云e办(后端)——邮件发送(员工入职时发送邮件)
邮件服务的业务逻辑:
例如:新员工入职时,会填写个人信息。当添加成功后,系统会给该员工发送一封欢迎邮件。包含:工号、职称、职位等信息。
一、前提准备:开通smtp
MAP是什么?
IMAP,即Internet Message Access Protocol(互联网邮件访问协议),您可以通过这种协议从邮件服务器上获取邮件的信息、下载邮件等。IMAP与POP类似,都是一种邮件获取协议
我是通过网易邮箱进行注册办理。
二、在yeb-project中搭建邮件项目:
1、创建module
2.创建springboot Application
package com.xxxx.mail;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MailApplication {
public static void main(String[] args) {
SpringApplication.run(MailApplication.class,args);
}
}
3、yml文件
在main下创建resources /conf/application.yml
server:
# 端口
port: 8082
spring:
# 邮件配置
mail:
# 邮件服务器地址
host: smtp.163.com
# 协议
protocol: smtp
# 编码格式
default-encoding: utf-8
# 授权码(在邮箱开通服务时获取)
password: meqxqfgkoowh*agd
# 发送者邮箱地址
username:
# 端口(不同邮箱端口号不同)
port: 22
# rabbitmq配置
rabbitmq:
# 用户名
username: guest
# 密码
password: guest
# 服务器地址
host:
# 端口
port: 5672
4、邮件模板:resources/templates/mail.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.theymeleaf.org">
<head>
<meta charset="UTF-8">
<title>入职欢迎邮件</title>
</head>
<body>
欢迎 <span th:text="${name}"></span> 加入 XXXX 大家庭,您的入职信息如下:
<table border="1">
<tr>
<td>姓名</td>
<td th:text="${name}"></td>
</tr>
<tr>
<td>职位</td>
<td th:text="${posName}"></td>
</tr>
<tr>
<td>职称</td>
<td th:text="${joblevelName}"></td>
</tr>
<tr>
<td>部门</td>
<td th:text="${departmentName}"></td>
</tr>
</table>
<p>我们公司的工作忠旨是严格,创新,诚信,您的加入将为我们带来新鲜的血液,带来创新的思维,以及为
我们树立良好的公司形象!希望在以后的工作中我们能够齐心协力,与时俱进,团结协作!同时也祝您在本公
司,工作愉快,实现自己的人生价值!希望在未来的日子里,携手共进!</p>
</body>
</html>
三、yeb-server邮件发送的功能:
1、yeb-server添加依赖 / 修改配置文件
<!--rabbitmq 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
---
spring:
# rabbitmq配置
rabbitmq:
# 用户名
username: guest
# 密码
password: guest
# 服务器地址
host: 192.168.10.100
# 端口
port: 5672
2、添加员工成功后,发送邮件:
package com.xxxx.server.service.impl;
/**
* 添加员工
* @param employee
* @return
*/
@Override
public RespBean insertEmployee(Employee employee) {
//处理合同期限,保留2位小数
//获取合同开始的时间
LocalDate beginContract = employee.getBeginContract();
//获取合同结束的时间
LocalDate endContract = employee.getEndContract();
//计算有多少天
long days = beginContract.until(endContract, ChronoUnit.DAYS);
// 将天数保留两位小数点
DecimalFormat decimalFormat = new DecimalFormat("##.00");
employee.setContractTerm(Double.parseDouble(decimalFormat.format(days/365.00)));
//判断 数据是否添加成功
if (1==employeeMapper.insert(employee)) {
/**
* 添加数据成功后,获取新增用户的完整信息:
* getEmployee.getId() 根据刚新增的id号,进行查询该用户的所有信息
* getEmployee这个方法是“分批导出”时遗留的:根据Id可以导入,List<Employee> getEmployee(Integer id);
* mapperxml:<if test="null!=id">AND e.id = #{id}</if>
* * 虽然查询后只有一条数据,但是由于返回的是List列表形式,所以得需要 .get(0)
*/
//2.发送消息(路由key,emp:新插入这个人的用户信息)
rabbitTemplate.convertAndSend("mail.welcome",emp);
return RespBean.success("添加成功!");
}
return RespBean.error("添加失败!");
}
四、yeb-serve将用户信息发给yeb-mail,yeb-mail负责发送邮件功能
1、消息接收者,然后发送邮件
package com.xxxx.mail;
import com.xxxx.server.pojo.Employee;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.mail.MailProperties;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.util.Date;
/**
* 消息接收者
*
*/
//component 被spring容器进行管理
@Component
public class MailReceiver {
//logger进行打印日志
private static final Logger LOGGER = LoggerFactory.getLogger(MailReceiver.class);
@Autowired
private JavaMailSender javaMailSender;
// 邮件配置
@Autowired
private MailProperties mailProperties;
//模板 引擎---->//templateEngine会从下面的context拿相应的数据。(从context拿到相应内容,放到mail)
// 从而前端会拿到相应的数据。
@Autowired
private TemplateEngine templateEngine;
/**
* 接收发送命令:
* 邮件发送
*/
// 有了这个RabbitListener注解后,会根据路由,会将接收到发送端的消息“给该用户发送邮件的信息”
//employee就是需要发送邮件的信息
@RabbitListener(queues = "mail.welcome")
public void handler(Employee employee){
//创建消息
MimeMessage msg = javaMailSender.createMimeMessage();
System.out.println("创建消息:====》"+msg);
//
MimeMessageHelper helper = new MimeMessageHelper(msg);
try {
//发件人
helper.setFrom(mailProperties.getUsername());
//收件人
helper.setTo(employee.getEmail());
//主题
helper.setSubject("入职欢迎邮件");
//发送日期
helper.setSentDate(new Date());
//邮件内容
Context context= new Context();
context.setVariable("name",employee.getName());
context.setVariable("posName",employee.getPosition().getName());
context.setVariable("joblevelName",employee.getJoblevel().getName());
context.setVariable("departmentName",employee.getDepartment().getName());
//templateEngine会从context拿相应的数据。(从context拿到相应内容,放到mail)
String mail = templateEngine.process("mail", context);
helper.setText(mail,true);
//发送邮件
javaMailSender.send(msg);
} catch (MessagingException e) {
LOGGER.error("邮件发送失败=====>{}", e.getMessage());
}
}
}
2、启动类:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MailApplication {
public static void main(String[] args) {
SpringApplication.run(MailApplication.class,args);
}
@Bean
public Queue queue(){
return new Queue("mail.welcome");
}
}