SpringBoot 观察者模式+发送邮件

1,288 阅读2分钟

「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!

前言:

最近有个需求,当用户在系统留言后,需要系统使用邮件通知下管理员,决定采用设计模式中的观察者模式来实现。 本篇主讲关于邮件的实现

1. SpringBoot中观察者模式的实现

参考本人写的另一篇文章:SpringBoot实践——观察者模式

2. SpringBoot集成邮件

(1)先去注册个邮箱

这里是去163注册了邮箱,注册后登录进去,按照下图,开启对应配置,然后会获取到一个“授权码”,在后面配置要用到 image.png

题外话:调用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:编码方式

image.png

(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);
    }
}
(8)测试结果

image.png

3.参考:

juejin.cn/post/684490…