553 Mail from must equal authorized user

在本人工作的过程中,遇到了形形色色的问题。当时琢磨了好久才琢磨出这样的总结,贴出来供大家参考参考。以下观点仅代表本人在工作过程中的观点,望大家能够共同讨论,查漏补缺。


最近在操作JavaMail的时候发现了一个隐藏性的bug,一开始没有注意到,直到最近一次修改了配置才发现了这个问题,而这个问题就是553 Mail from must equal authorized user啦。



那么首先先贴出我原本的配置给大家看看哈.

#default
MailServerHost=smtp.qiye.163.com
MailServerPort=25
UserName=123456@163.com
Password=123456
FromAddress=123456@163.com
Subject=default mail
Product=Default

#test
MailServerHost_1=smtp.qiye.163.com
MailServerPort_1=25
UserName_1=123456@163.com
Password_1=123456
FromAddress_1=123456@163.com
Subject_1=test mail
Product_1=test

由于项目中是需要多个邮箱进行不同的操作,所以我们一开始需要在配置文件中配置不同的邮箱配置,从而读取不同的邮箱配置进行邮件的收发。
而最近由于公司的业务要求,我们就将其中的一个邮箱的配置进行了修改,具体就是将test的配置进行了修改,修改如下:

#test
MailServerHost_1=smtp.qiye.163.com
MailServerPort_1=25
UserName_1=654321@163.com
Password_1=654321
FromAddress_1=654321@163.com
Subject_1=demo mail
Product_1=demo

不难看出修改的地方是用户名、密码、主题。

通过对业务逻辑进行修改,即通过读取配置文件中不同的邮箱信息,从而达到使用不同的邮箱进行邮件的发送功能。

修改完毕后,重启项目后,运行!
通过第一个邮箱配置进行邮件的发送,发送成功。而正当我通过第二个邮箱配置进行邮件的发送的时候,程序就出错了!

运行截图

看错误的log,似乎是有户名还有密码不匹配。但是检查了很多次配置,都没有问题。
在网上一找资料,原来是Session捣的乱。


我们找到我们的代码,不难发现我们在发送邮件的时候是根据邮件会话属性和密码验证器构造一个发送邮件的session

 // 根据邮件会话属性和密码验证器构造一个发送邮件的session 
Session sendMailSession = Session.getDefalutInstance(pro,authenticator); 

问题就是出在getDefaultInstance()这个方法。
getDefaultInstance()这个方法的处理方式是这样的:

1、首先会在缓存中查找是否存在着properties。
2、如果缓存中不存在,那么才会加载一个新的用户自定义的properties。
3、如果缓存中存在,那么就不会新加载一个properties,而用以前的配置。

因此,当我们具有两个不相同的配置的时候,程序在读取了第一个配置之后,则此配置会一直存在缓存中,下次无论是想要读取其他配置都会返回此默认缓存配置。

那么这时候问题就明显了,我们解决这个问题只需要将getDefaultInstance()方法改为getInstance()就可以解决啦!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容