javax验证器引用相同的电子邮件地址

javax验证器引用相同的电子邮件地址,java,authentication,caching,jakarta-mail,Java,Authentication,Caching,Jakarta Mail,以下是我用来创建发送电子邮件会话的代码: props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable","true"); props.put("mail.smtp.EnableSSL.enable","true"); logger.trace("1. emailFromAddress: " + emailFromAddress); session = Session.getDefaultInstance(p

以下是我用来创建发送电子邮件会话的代码:

props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable","true"); 
props.put("mail.smtp.EnableSSL.enable","true");
logger.trace("1. emailFromAddress: " + emailFromAddress);
session = Session.getDefaultInstance(props,new javax.mail.Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
     logger.trace("2. emailFromAddress + " pass: " + password);
     return new PasswordAuthentication(emailFromAddress, password);
    }
});
然后我尝试输入emailFromAddress=”abc@yahoo.com“和它的密码。 我可以验证地址并成功发送电子邮件,以及

1. emailFromAddress: abc@yahoo.com
2. emailFromAddress: abc@yahoo.com pass: *****
我尝试从不同的emailFromAddress=”发送邮件xyz@gmail.com“-->这次发送失败,日志打印输出为:

1. emailFromAddress: xyz@gmail.com --> WHICH IS CORRECT
2. emailFromAddress: abc@yahoo.com pass: ***** --> WHICH STILL REFER TO THE OLD ACCOUNT
会话验证器有缓存吗?

有某种缓存:您在示例中创建了一次
验证器,并将其设置为默认会话。由于该对象永远存在(或者至少直到JVM终止),因此它在每次调用时的行为都是相同的

也许您可以使用from
验证器提供用户名

另一个选项可能是对您发送的每封邮件重新配置一个新的
验证器。因此,您可以在每次尝试时提供正确的用户名。

作为java文档:

getDefaultInstance
获取默认会话对象。如果尚未设置默认值,则会创建一个新的会话对象并作为默认值安装

getInstance
获取新的会话对象。 因此,将创建一个新的会话对象,而不管该对象是否已经存在

因此,技巧是将getInstance()更改为
getInstance()

似乎是getDefaultInstance()在设置完成后返回defaultSession,而不管您的验证器是否更新。所以我改为getInstance()并解决了这个问题。