「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!」
前言:
最近有个需求,当用户在系统留言后,需要系统使用邮件通知下管理员,决定采用设计模式中的观察者模式来实现。 本篇主讲关于邮件的实现
1. SpringBoot中观察者模式的实现
2. SpringBoot集成邮件
(1)先去注册个邮箱
这里是去163注册了邮箱,注册后登录进去,按照下图,开启对应配置,然后会获取到一个“授权码”,在后面配置要用到
题外话:调用163邮箱来发邮件,很容易被识别为垃圾邮件 T_T.......我换了两个163邮箱,最后都是一开始还能发邮件,后面都被认为是垃圾邮件导致发送邮件失败........于是改为了QQ邮箱 QAQ
(2)在pom中引入依赖
<!--邮件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
(3)在application.yml写上配置
- host:邮件服务器地址,这里因为用到是163邮箱,所以写上163邮件的地址
- username:邮箱登录账号
- password:授权码,需要登录邮箱去配置获得
- default-encoding:编码方式
(4)新建邮件信息类 MailTextTemplate.java
@Data
public class MailTextTemplate {
/**
* 收件方邮箱
*/
String to;
/**
* 邮件标题
*/
String subject;
/**
* 邮件内容
*/
String text;
}
(5)新建MailService
public interface MailService{
/**
* 文本邮件
* @param data 邮件信息
*/
void textMail(MailTextTemplate data);
}
(6)新建MailServiceImpl
@Service
@Slf4j
public class MailServiceImpl implements MailService {
@Autowired
private JavaMailSender jms;
@Value("${spring.mail.username}")
private String from;
@Override
public void textMail(MailTextTemplate data) {
if(StringUtils.isNullOrEmpty(data.getTo()) ){
log.error("接收方邮箱为NUll或者空");
return ;
}
SimpleMailMessage message = new SimpleMailMessage();
//邮件发送者
message.setFrom(from);
//邮件接收者
message.setTo(data.getTo());
//邮件标题
message.setSubject(data.getSubject());
//邮件内容
message.setText(data.getText());
//发送邮件
jms.send(message);
}
}
(7)客户留言后,发送邮件
这里使用@EventListener实现监听客户留言事件,然后在里面写业务逻辑
@Service
@Slf4j
public class CustomerLeaveMessageEventListener {
@Resource
MailService mailService;
@EventListener
public void sendEmail(CustomerLeaveMessageEvent event){
CustomerLeaveMessage customerLeaveMessage = event.getCustomerLeaveMessage();
log.info("客户留言,系统发送邮件给管理员");
MailTextTemplate data= new MailTextTemplate();
data.setTo("XXX@qq.com"); //管理员邮箱
data.setSubject("官网有新的留言,请尽快处理,留言人:"+customerLeaveMessage.getName());
StringBuilder content= new StringBuilder();
content.append("留言人电话:").append(customerLeaveMessage.getPhone())
.append(",留言人邮箱:").append(customerLeaveMessage.getEmail())
.append(",留言内容:").append(customerLeaveMessage.getContent());
data.setText(content.toString());
mailService.textMail(data);
}
}