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

时间:2013-07-31 06:38:16

标签: java authentication caching javax.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(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: *****

我尝试从不同的email发送电子邮件地址=“xyz@gmail.com” - >这次它无法发送和日志打印输出为:

1. emailFromAddress: xyz@gmail.com --> WHICH IS CORRECT
2. emailFromAddress: abc@yahoo.com pass: ***** --> WHICH STILL REFER TO THE OLD ACCOUNT

是否有会话验证器的缓存?

2 个答案:

答案 0 :(得分:0)

某种缓存:您在示例中创建了Authenticator一次,并将其设置为默认会话。由于该对象永远存在(或者至少在JVM终止之前),因此在每次调用时它都会以相同的方式运行。

也许您可以使用Authenticator中的getDefaultUserName()来提供用户名?

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

答案 1 :(得分:0)

作为java-doc:

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

getInstance获取一个新的Session对象。 因此,无论是否已存在,都会创建一个新的会话对象。

那么诀窍是改变为getInstance()