2

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

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

会话验证器是否有缓存?

4

2 回答 2

0

作为 java 文档:

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

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

那么诀窍是什么getInstance()

于 2013-07-31T07:16:20.673 回答
0

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

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

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

于 2013-07-31T07:06:34.930 回答