快捷搜索: 王者荣耀 脱发

一篇就懂SpringBoot邮箱功能

最近项目上做邮箱发送功能,学习了公司已经实现邮箱功能,和结合自己实际上线操作经验,记录我一路走来那些坑。

这个功能可能可以其他需求,比如要构造一个非常好看的正文内容,又比如添加一些附件等,这时候你又要重复修改你的工具类代码,这样代码的可维护性和稳定性难以保证,其实SpringBoot早就对这个高热点功能做了集成。

SpringBoot邮箱集成

导入依赖

<!-- 发送邮箱 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

编写配置文件

spring:
  mail:
    host: smtp.163.com
    port: 465
    protocol: smtps
    username: xxxxxxxxxxxxx@163.com
    password: xxxxxxxxxxxxx

编写实现(这里只实现发纯文本)

@Slf4j
@Service
public class SendMailServiceImpl implements SendMailService {
          
   
    @Autowired
    private JavaMailSender javaMailSender;
    @Value("${spring.mail.username}")
    private String from;
    @Override
    public void sentMail(String sendTo, String subject, String text) {
          
   
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(from);
        message.setTo(sendTo);
        message.setSubject(subject);
        message.setText(text);
        try {
          
   
            javaMailSender.send(message);
            log.info("邮件已发送。");
        } catch (Exception e) {
          
   
            log.error("发送邮件时发生异常了!", e);
        }
    }

}

测试

第一个坑

上线部署后会发现这样报错现象 后续怀疑服务器没有开25端口,我找技术总监开一下端口,结果还是一样报错问题,经过网上查询后发现25端口发邮箱,在云服务器上是不允许的,运营商会把25端口封杀掉,所有会一直导致超时。

解决办法

所以邮箱应用请不要走25端口,除了25端口还有465端口走smtps协议,这样完美解决线上超时问题

第二个坑

像这样的功能,一般会很费时因为你要发请求到邮箱服务器,然后邮箱服务器执行你的请求把结果返回,如果途中出现意外,不小心这个请求阻塞了,或者其他怎么了情况太多了。而我们程序不可能只发一条信息,如果直接调用这个发邮箱方法,会出现这样情况,一个阻塞,其他就都进不来情况。

解决办法

    异步处理 这需要消息队列支撑,才能实现异步处理。一般看项目大小,中大型项目推荐使用 线程池 我这是在公司项目中看到做法,其实思路非常清晰,而且不需要额外框架支撑,非常适合小公司小项目使用。 1.写一个线程用于执行发送邮箱方法 2.写一个Service用于创建线程池和创建线程放入线程池执行方法 3.调用创建线程放入线程池执行方法即可
经验分享 程序员 微信小程序 职场和发展