背景
邮件使用的Ofiice365
工单系统,会频繁的发送邮件。
有用户反馈说没有收到邮件,查询了邮件的发送记录,发现从某一天开始,邮件就没有开始发送了。
进入服务器,查看当前的线程状况
[root@prod ~]# jps // 或者是ps -ef |grep xxx ,找到进程号
17868 Jps
10158 jar
[root@esiteappprd1 ~]# jstack 10158 > info.log // 把信息输出到log里
查看输出的日志

发现好多线程都在RUNNABLE状态,但是卡在了MailUtils.sendSimpleEmail(MailUtils.java:61)方法
打开代码瞅一瞅
发现
- 卡在了send方法
- 用了一个系统默认的异步线程池

- 使用的Ofiice365邮箱,会有一些限流的策略,当邮件发送的太多会卡住了,并且不会报错,线程也没被杀死就这么卡在这里。
- 用的默认的线程池,只有8个核心线程,当8个线程都被卡住的时候,邮件再也发送不出去了。
解决过程
- 立马重启
- 增加邮件发送配置,配置超时时间
spring.mail.properties.mail.smtp.writetimeout=10000
spring.mail.properties.mail.smtp.timeout=10000
spring.mail.properties.mail.smtp.connectiontimeout=10000
- 修改线程池,改成自定义的线程池,不要使用系统默认的
本文档描述了一起使用Office365邮箱的系统遇到的邮件发送问题,当邮件发送频率过高时,线程被卡在MailUtils.sendSimpleEmail方法中。经过分析,发现是由于Office365的限流策略导致。为了解决这个问题,采取了重启服务、设置邮件发送超时时间和改用自定义线程池等措施,有效避免了线程阻塞并提高了邮件发送的稳定性。
2086

被折叠的 条评论
为什么被折叠?



