邮件项目上线后,出现了一些小bug。
产品找到我说有个outlook邮箱无法发送邮件,暂且就把这个邮箱称作是“bug@outlook.com”吧。
既然发送失败,第一时间就是拉取日志查看异常原因了,异常原因“Caused by: javax.mail.AuthenticationFailedException: 535 5.7.139 Authentication unsuccessful, SmtpClientAuthentication is disabled for the Tenant. Visit https://aka.ms/smtp_auth_disabled for more information. [HK2PR04CA0071.apcprd04.prod.outlook.com]”。
Caused by: javax.mail.AuthenticationFailedException: 535 5.7.139 Authentication unsuccessful, SmtpClientAuthentication is disabled for the Tenant. Visit https://aka.ms/smtp_auth_disabled for more information. [HK2PR04CA0071.apcprd04.prod.outlook.com]
at com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:965)
at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:876)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:780)
at javax.mail.Service.connect(Service.java:366)
at org.springframework.mail.javamail.JavaMailSenderImpl.connectTransport(JavaMailSenderImpl.java:517)
at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:436)
... 43 more
有经验的小伙伴根据报错位置,就能知道,这不是代码的锅。为了验证,我专门用了一个其他的outlook邮箱,也可以正常发送,问题就出现在这个邮箱的权限上。
但是为什么会报权限异常的错误呢?
我查看了该邮箱最近一次发送成功的记录是6.3,本次发送失败时间是在6.5,而这期间代码没有任何改动。出现这种异常只能是邮箱的设置被人为变更了。于是我在群里问,最近是否有人更改过邮箱配置。结果你懂得,已读没人回复。。。
一般来说,发生AuthenticationFailedException异常,无外乎以下几个原因:
①账号密码错误
②发送协议配置错误
③第三方发送授权未开启
账号密码错误:利用数据库中的账号配置,成功登陆邮箱,并发送成功。
发送协议配置错误:数据库中的接收和发送协议,与outlook官网提供的完全一致。
第三方授权未开启:outlook邮箱只提供了开启POP3和IMAP的选择,而对于SMTP是默认开启的。
这里简要说一下,POP和IMAP是用来接收邮件的,如果需要第三方发送邮件,必须使用SMTP。
三个可能的原因都给我排除掉了,异常信息中出现了SmtpClientAuthentication,问题只能是出现在SMTP协议上了。
找到了微软的这篇文章,Enable or disable authenticated client SMTP submission (SMTP AUTH) in Exchange Online,文中有这样的操作指导
原来真的可以设置SMTP,但是需要管理员设置,而不是个人在邮箱中。微软这一点和我们普通认知的QQ,网易,GAMIL都不太一样。
于是我紧急找到了管理员,查看该邮箱的权限设置,果然SMTP被人关掉了。。。(谁这么手贱)
点上SMTP,保存,然后再次尝试,邮件仍就发送失败,但是异常提示我“please try again later”。于是等待十来分钟后重试,邮件发送成功!
后序,我刚解决完这个问题,通知用户重试之后,有个哥们就私信我,说是他周五测试关掉了权限,但是测试完了之后忘记还原权限了。我谢谢你啊,你一个忘记,让我抓耳挠腮两小时。。。